使用C# HttpClient但在Postman中工作时,oAuth2令牌请求失败

pinkon5k  于 2023-01-08  发布在  C#
关注(0)|答案(1)|浏览(215)

我试图在C#中请求一个oAuth令牌,做的正是Postman(它工作的地方)正在做的事情,但我一直得到未经授权。我不知道Postman做的有什么不同。

下面是我的代码:

var request = new HttpRequestMessage(HttpMethod.Post, "https://myapi/OAuth/Token/")
        {
            Content = new FormUrlEncodedContent(new KeyValuePair<string?, string?>[]
            {
                // new("client_id", _clientId),
                // new("client_secret", _clientSecret),
                // new("scope", "company-api"),
                new ("Content-Type", "application/x-www-form-urlencoded"),
                new("grant_type", "client_credentials")
            })
        };

        _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", System.Convert.ToBase64String(Encoding.ASCII.GetBytes($"{_clientId}:{_clientSecret}")));

        using var response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
        response.EnsureSuccessStatusCode();
        await using var responseContentStream = await response.Content.ReadAsStreamAsync();

        var accessToken = await JsonSerializer.DeserializeAsync<AccessToken>(
            responseContentStream, JsonSerializerOptions.Default);

以下是我在postman中的设置:

e5nqia27

e5nqia271#

首先,您的问题是在生成Basic auth头内容时使用了错误的Encoding。
从ASCII切换到UTF8:

_httpClient.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Basic",
        System.Convert.ToBase64String(Encoding.UTF8.GetBytes($"{_clientId}:{_clientSecret}")));

一旦解决了这个问题,您可能希望更轻松地从响应中读取AccessToken。我建议对HttpContent使用ReadFromJsonAsync<T>扩展方法:

var jsonData = await response.Content.ReadFromJsonAsync<AccessToken>();

您需要System.Net.Http.Json using语句来访问该方法。
如果您在反序列化Json时仍有问题,ReadFromJsonAsync<T>方法将JsonSerializerOptions作为可选参数,以帮助您适应传入的数据。

相关问题