dotnet 外部登录 github 返回 401 响应

问题描述 投票:0回答:1

我正在尝试使用 .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 应用程序 这可能是什么原因?

.net authentication github github-api
1个回答
0
投票

我通过为所有请求发送相同的用户代理来解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.