• Github的aouth 登录拿到code换到了access token去拿用户授权的时候一直401


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 2301_78040501 2024-04-13 23:46 采纳率: 50% 浏览 3 首页/ 编程语言 / Github的aouth 登录拿到code换到了access token去拿用户授权的时候一直401 java 前后端分离项目 后端spring boot写的。我能确保token绝对没有过期并且也是正确的。但是一直401 我在GitHub上发了讨论里面有图片 链接在这里 https://github.com/orgs/community/discussions/118908 谢谢咯 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    5条回答 默认 最新

    • 阿里嘎多学长 2024-04-13 23:46
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      我注意到您提到在Github上有一个关于OAuth登录获取access token时遇到401 Unauthorized的问题,并且您已经分享了链接。通常,当您在使用OAuth 2.0进行身份验证时,401错误表示服务器收到了请求,但是没有找到有效的凭证来验证该请求。这可能是由于以下几个原因:

      1. 缺少或错误的Authorization:确保在发送请求获取access token时,包含了Authorization头部,格式通常是Bearer ,其中token是通过code换取的。

      2. 刷新令牌问题:如果使用的是refresh token而不是长期有效的access token,可能需要先使用refresh token刷新access token。

      3. 客户端ID和密钥:确认在后端代码中使用的GitHub应用的客户端ID和客户端秘密(client ID and client secret)是否正确无误。

      4. Token过期:即使您认为token没有过期,GitHub有时会短暂地返回401,因为它们可能有严格的刷新策略。检查您的token是否在预期时间内刷新。

      5. GitHub API速率限制:频繁的请求可能会触发GitHub的速率限制,导致暂时的401响应。

      6. CORS问题:跨域资源共享(CORS)设置可能导致某些请求被阻止,检查后端是否正确设置了允许跨域的设置。

      7. Spring Security配置:如果您使用了Spring Security,确保OAuth2的配置正确,并且认证过滤器链中没有其他拦截器导致授权失败。

      8. 网络问题:虽然可能性较小,但网络问题也可能导致短暂的认证失败。

      请查看您分享的讨论链接中的详细信息,那里可能有其他人提供的解决方案或者具体的代码片段,可以帮助定位问题。如果问题仍未解决,建议提供更多的代码片段,特别是与OAuth请求相关的部分,以便于分析。

      评论 编辑记录
    • GISer Liu 2024-04-13 23:49
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      问题分析:
      根据您的描述,您在使用 GitHub 的 OAuth 登录功能时遇到了一直返回 401 错误的问题。您已经确认了您的 token
      没有过期并且是正确的。但是无论如何仍然无法成功获取用户授权。
      解决思路与方案:

      1. 确认身份验证流程: 首先,请确保您的身份验证流程没有问题。OAuth 的授权流程包括获取 Authorization Code,然后使用 Authorization Code 换取 Access Token,最后使用 Access Token 访问受保护的资源。请确保您的代码按照这个流程执行,并且每一步都正确实现。
      2. 检查请求头和参数: 确保您在请求中正确设置了请求头和参数。特别是在使用 Access Token 访问受保护资源时,需要将 Access Token 放在请求的 Authorization 头中或者作为参数传递。
      3. 检查权限范围: 确保您的 Access Token 具有足够的权限来访问您需要的资源。有时候 401 错误是因为 Access Token 缺乏足够的权限而导致的。
      4. 查看 GitHub 文档和错误信息: 仔细阅读 GitHub 的文档,尤其是身份验证相关的部分,以确保您的实现符合规范。同时,查看返回的 401 错误的详细信息,可能会给出更具体的原因。
      5. 检查网络和防火墙设置: 确保您的应用程序能够正常连接 GitHub 的身份验证服务。有时候网络问题或者防火墙设置会导致身份验证失败。
      6. 查看 GitHub 讨论和支持页面: 您已经在 GitHub 上发起了讨论,继续跟进可能会得到更多的帮助和建议,因为其他人可能会遇到类似的问题并找到了解决方案。
        根据您提供的信息,我无法直接查看您的代码或具体的请求细节,因此以上是一般性的解决思路。如果您能提供更多的代码或请求细节,我可以更具体地帮助您排查问题。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      评论
    • 专家-百锦再 全栈领域优质创作者 2024-04-14 00:12
      关注

      对不起,我无法访问外部链接。不过我可以根据您的描述尝试解释这个问题。

      根据您的描述,您在后端Spring Boot项目中使用Token进行身份验证,但是一直返回401错误。这种情况通常是由于Token验证失败引起的。可能的原因包括Token不匹配、Token过期、Token解析错误等。

      您可以尝试以下几点来解决这个问题:

      1. 确保生成Token时使用的算法和验证Token时使用的算法一致。
      2. 确保Token在生成时设定了正确的过期时间,并在验证时检查Token的过期时间。
      3. 检查Token的签名是否正确,在解析Token时需要用到正确的密钥。
      4. 检查Token的有效负载部分是否包含正确的信息,如用户ID等。

      如果您能提供代码示例,我可以帮助您分析可能存在的问题。您可以在代码块中分享您的代码,例如:

      // 示例Java代码@RestControllerpublic class UserController { 
      @GetMapping("
      /user"
      )public ResponseEntity<
      String>
      getUserInfo(@RequestHeader("
      Authorization"
      ) String token) {// 验证Token的逻辑if (isValidToken(token)) {return ResponseEntity.ok("
      Token验证通过"
      );
      } else {return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("
      Token验证失败"
      );
      }}
      private boolean isValidToken(String token) {// 验证Token的具体实现// 这里可以包括Token过期、Token签名验证等逻辑return true;
      }}

      通过以上示例代码,您可以检查您的Token验证逻辑是否正确,并进行必要的调整。希望这能帮助您解决401错误的问题。如果有其他问题,请随时告诉我。


      有问题你别着急,评论留言都可以,看到马上就回复,尽量及时补充齐

      展开全部

      评论
    • CSDN-Ada助手 CSDN-AI 官方账号 2024-04-15 03:57
      关注

      【相关推荐】



      • 这篇博客: SpringBoot-实现GitHub授权登录的方式中的 获取access_token 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

        使用code,获取access_token
        实现登录后的回调:

        1. 创建一个Controller:AuthorizeController
        @Controller
        public class AuthorizeController {
            @GetMapping("/callback")
            public String callback(@RequestParam(name="code") String code,
                                   @RequestParam(name = "state") String state){
                return "index";
            }
        }
        
        
        1. 由文档,使用access_token需要5个参数。为美观方便,将这5个参数封装成一个类。在这里插入图片描述
          创建类dto.AccessTokenDTO
        public class AccessTokenDTO {
            private String client_id;
            private String client_secret;
            private String code;
            private String redirect_uri;
            private String state;
        
            public String getClient_id() {
                return client_id;
            }
        
            public void setClient_id(String client_id) {
                this.client_id = client_id;
            }
        
            public String getClient_secret() {
                return client_secret;
            }
        
            public void setClient_secret(String client_secret) {
                this.client_secret = client_secret;
            }
        
            public String getCode() {
                return code;
            }
        
            public void setCode(String code) {
                this.code = code;
            }
        
            public String getRedirect_uri() {
                return redirect_uri;
            }
        
            public void setRedirect_uri(String redirect_uri) {
                this.redirect_uri = redirect_uri;
            }
        
            public String getState() {
                return state;
            }
        
            public void setState(String state) {
                this.state = state;
            }
        }
        
        1. 使用OkHttp来实现Post请求
        OkHttp 官网
        3.1 先引入依赖
      • <dependency>
                    <groupId>com.squareup.okhttp3groupId>
                    <artifactId>okhttpartifactId>
                dependency>
        

        3.2 创建类provider.GitHubProvider
        请求Post的方法,代码参考OkHttp网站文档

        @Component
        public class GitHubProvider {
            public String getAccessToken(AccessTokenDTO accessTokenDTO){
                MediaType mediaType= MediaType.get("application/json; charset=utf-8");
                OkHttpClient client = new OkHttpClient();
                RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(accessTokenDTO));
                Request request = new Request.Builder()
                        .url("https://github.com/login/oauth/access_token")
                        .post(body)
                        .build();
                try (Response response = client.newCall(request).execute()) {
                    String string = response.body().string();
                    System.out.println(string);
                    return string;
                } catch (IOException e) {
                }
                return null;
            }
        }
        
        

        **注:**方法中使用了json的格式来传递数据。需要引入相关的依赖

        <dependency>
                    <groupId>com.alibabagroupId>
                    <artifactId>fastjsonartifactId>
                    <version>1.2.62version>
                dependency>
        

        3.3 调用Post请求方法
        在AuthorizeController 中调用方法:

        
        @Controller
        public class AuthorizeController {
            
            @Autowired
            private GitHubProvider gitHubProvider;
            
            @GetMapping("/callback")
            public String callback(@RequestParam(name="code") String code,
                                   @RequestParam(name = "state") String state){
                AccessTokenDTO accessTokenDTO = new AccessTokenDTO();
                accessTokenDTO.setClient_id("728bc9dfda3dc246ba09");
                accessTokenDTO.setClient_secret("05d04769f35f99ae302a07f8e3dca233c7f6e415");
                accessTokenDTO.setCode(code);
                accessTokenDTO.setRedirect_uri("http://localhost:8887/callback");
                accessTokenDTO.setState(state);
                //进行doPost请求,获取access_token
                gitHubProvider.getAccessToken(accessTokenDTO);
                return "index";
            }
        }
        
        
        1. 验证是否可获得token:
          启动项目,点击登录操作,查看控制台是否输入结果string
          在这里插入图片描述
          ok
        2. 拆分出需要的access_token值
          在打印string后加代码
        //拆分获得需要的access_token值
                    String[] split = string.split("&");
                    String token = split[0].split("=")[1];
                    return token;
        

      如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

      展开全部

      评论
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-16 13:52
      关注

      下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      你遇到的问题可能是因为在获取 access token 时没有将 redirect_uri 参数设置为与注册 OAuth App 时设置的一致。

      以下是一些可能的解决方案:

      1. 确认 redirect_uri 参数是否正确设置,可以参考官方文档:https://docs.github.com/en/developers/apps/building-oauth-apps/authorizing-oauth-apps#1-request-a-users-github-identity
      2. 如果 redirect_uri 参数已正确设置,尝试查看应用设置中的回调 URL 和请求中的 redirect_uri 是否一致。
      3. 如果问题仍然存在,可以参考官方文档中的故障排除步骤:https://docs.github.com/en/developers/apps/troubleshooting-oauth-app-access-token-request-errors

      处理方式:

      1. 确认 redirect_uri 参数是否正确设置。
      2. 重新设置应用的回调 URL,保证与请求中的 redirect_uri 一致。
      3. 根据官方文档的故障排除步骤进行排查。

      修改后的代码如下:

      @GetMapping("/login/github")
      public String loginGithub() {
        String clientId = "your-client-id";
        String redirectUri = "http://your-redirect-uri";
        String scope = "user";
        String state = "random-state-string";
      
        String url = "https://github.com/login/oauth/authorize?client_id=" + clientId + "&redirect_uri=" + redirectUri + "&scope=" + scope + "&state=" + state;
        return "redirect:" + url;
      }
      
      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    Flutter didUpdateWidget 的使用问题
    Qt安装使用
    Python解题 - CSDN周赛第9期
    chardet检测文件编码,使用生成器逐行读取文件
    Java:线程状态及线程状态转换方法
    (附源码)springboot码头作业管理系统 毕业设计 341654
    Apache-Doris单机部署
    本地搭建K8S开发环境
    互联网架构安全
    Ubuntu1804 安装后无法使用root登录解决方法
  • 原文地址:https://ask.csdn.net/questions/8088110