我正在尝试使用 .net 和 React 构建一个应用程序,现在我正在通过 github 外部登录来验证与 .net 的反应,但我总是收到奇怪的 401 响应。 我的控制器中有这个功能:
[HttpPost("github/login")]
public async Task<IActionResult> LoginWithGithub([FromBody] ExternalLoginDto dto)
{
var AccessToken = await _githubHelper.GetAccessTokenAsync(dto.Code);
var userData = await _githubHelper.GetUserAsync(AccessToken!);
return Ok(userData);
}
从反应应用程序登录后获取代码
这是帮助程序代码,在帮助程序中我得到一个令牌,但来自 /user 端点的响应是 401:
public class GithubHelper
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly IConfiguration _configuration;
private readonly IHttpContextAccessor _contextAccessor;
public GithubHelper(IHttpClientFactory httpClientFactory, IConfiguration configuration, IHttpContextAccessor contextAccessor)
{
_httpClientFactory = httpClientFactory;
_configuration = configuration;
_contextAccessor = contextAccessor;
}
public async Task<GitHubUser?> GetUserAsync(string token)
{
string userAgent = _contextAccessor?.HttpContext?.Request.Headers["User-Agent"]!;
using var httpClient = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://api.github.com/user");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Headers.Add("User-Agent", userAgent);
HttpResponseMessage response = await httpClient.SendAsync(request);
var content = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
var userInfo = JsonConvert.DeserializeObject<GitHubUser>(content);
return userInfo;
}
else
{
throw new HttpRequestException($"GitHub API request failed with status code {response.StatusCode} and message {content}");
}
}
public async Task<string?> GetAccessTokenAsync(string code)
{
var request = new HttpRequestMessage(HttpMethod.Post, "https://github.com/login/oauth/access_token")
{
Content = new FormUrlEncodedContent(new Dictionary<string, string>
{
{"client_id", _configuration["Github:ClientId"]!},
{"client_secret", _configuration["Github:ClientSecret"]!},
{"code", code}
})
};
request.Headers.Add("Accept", "application/json");
var client = _httpClientFactory.CreateClient();
var response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
var jsonContent = await response.Content.ReadAsStringAsync();
var tokenResponse = JsonConvert.DeserializeObject<GitHubTokenResponse>(jsonContent);
return tokenResponse?.access_token;
}
return null;
}
}
}
捕获错误或我收到 401 响应的原因,即使范围正确并且数据也正确,甚至有时它可以从邮递员那里工作,它是一个 oauth 应用程序 这可能是什么原因?
我通过为所有请求发送相同的用户代理来解决这个问题。