当前位置: 首页 > 知识库问答 >
问题:

获取令牌响应异常:401未授权

方飞白
2023-03-14

我使用了以下来自google的示例https://developers.google.com/identity/sign-in/web/server-side-flow到目前为止,我能够实现以下步骤:

  1. 用户在客户端(浏览器)进行身份验证。
  2. 代码返回并保存在服务器数据库中。
  3. 请求身份验证代码令牌时,响应异常:401未授权

我检查了以下内容:

  1. 接口已启用
  2. 在 https://developers.google.com/oauthplayground 我使用相同的客户端ID和客户端密码测试了访问权限,它的工作原理
  3. 阅读了与此问题相关的几乎所有SO查询,但没有一个真正有帮助。
  4. 尝试撤销所有用户权限并重新要求他们获取新代码。

下面是我正在使用的代码:

public void getUserAuthTokens(String authCode){
    try {

        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(
                JacksonFactory.getDefaultInstance(),new FileReader(new ClassPathResource("static\\client_secret.json").getFile()));

        List<String> scopes = new ArrayList<>();
        scopes.add("https://www.googleapis.com/auth/gmail.readonly");
        //String scopes[]={"https://www.googleapis.com/auth/gmail.readonly"};

        Collection<String> SCOPES
                = Collections.unmodifiableCollection(
                Arrays.asList(
                        new String[]{
                                GmailScopes.GMAIL_READONLY
                        }));
        GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(new NetHttpTransport(),JacksonFactory.getDefaultInstance(),
                "https://www.googleapis.com/oauth2/v4/token",
                clientSecrets.getDetails().getClientId(),
                clientSecrets.getDetails().getClientSecret(),
                authCode).setRedirectUri(clientSecrets.getDetails().getRedirectUris().get(0)).setScopes(SCOPES).execute();


        String accessToken = tokenResponse.getAccessToken();
        System.out.print("Token is: "+accessToken);
    }catch (IOException x){
        x.printStackTrace();

    }

}

作为旁注,如果我没有使用 setRedirectUri(客户端Secrets.getDetails().getRedirectUris(.get(0)),那么我得到了“重定向不匹配错误”

我将非常感谢任何想法,因为我用完了

共有3个答案

邢嘉祯
2023-03-14

我最终发现我看到了“TokenResponseException:401 Unauthorized ”,这是因为我的数据存储没有用不同的范围更新其凭证。像魔术一样,在从头开始重新启动测试授权之前删除数据存储(并清除会话缓存)会导致成功。我不建议在每种情况下都采用这些步骤;然而,当所有其他方法都失败时,它们可能值得作为调试步骤来尝试。

明星剑
2023-03-14

经过多次调试和搜索,我找到了一个有效的解决方案,我在这里发布这个,以防有人遇到同样的问题。

下面是我使用的代码:

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(new NetHttpTransport(),JacksonFactory.getDefaultInstance(),
                "https://www.googleapis.com/oauth2/v4/token",
                clientSecrets.getDetails().getClientId(),
                clientSecrets.getDetails().getClientSecret(),
                authCode, "postmessage")
                .execute();

您可以阅读更多关于服务器端应用程序的postmessage@Google登录,将身份验证代码交换为访问令牌

希望有帮助。

戈安翔
2023-03-14

根据 Google API 返回的标准错误响应,错误代码 401“未经授权”表示为请求提供的授权凭据存在问题。您可能需要检查以下可能的原因:

  • OAuth访问令牌已过期,需要刷新。这可以通过提前刷新访问令牌来避免,但代码也可以捕获此错误,刷新令牌并自动重试。
  • 提供了多个不匹配的授权;仅选择一种模式。
  • OAuth访问令牌的绑定项目与与提供的开发人员密钥关联的项目不匹配。
  • 授权标头格式无法识别或使用不支持的凭据类型。

有关使用OAuth 2.0访问Google APIs的更多信息,请参见本文档。相关SO帖子中建议的解决方案可能也会有所帮助。

 类似资料:
  • 我想使用服务帐户实现谷歌表API请求。我创建了这个代码: 但是我得到了这个错误: com.google.api.client.auth.oauth2.TokenResponseException: 401 未经授权 在这个方法中 你知道我该如何解决这个问题吗?

  • 我的代码:GoogleCredential凭据 credential.refreshToken() 错误日志: 创建服务号的步骤: 我在凭据中的oauth 2.0中创建了一个Web应用程序 然后我用客户端ID创建了一个服务号 现在我正在使用这个服务号和从它生成的p12证书来验证和创建Google凭据的对象 一旦刷新令牌,我就给了我401例外。 在这种情况下,任何帮助都会受到感激

  • 我在eclipse java中从servicenow获取访问令牌时遇到了一个未经授权的问题,但它在postman中运行良好,java代码在另一个servicenow凭据中也运行良好

  • 我成功地将Graph API用于各种事情,但我需要访问OneNote API来在班级笔记本上执行学生和教师的添加/删除操作。当我用https://www.OneNote.com资源请求一个令牌时,它提供了一个令牌,但当我试图使用它访问OneNote API时,无论发送什么(有效)请求,我都会得到401--“请求不包含有效的身份验证令牌”。 我的令牌请求: POST https://login.mi

  • 我正在使用: 邮递员/失眠检查 为Laravel Passport制作了Laravel文档中描述的所有检查表,经过某些步骤后,我收到了有效OAuth访问令牌的HTTP 401。 由/oauth/token/请求具有客户端id和客户端机密的新访问令牌 使用接收到的访问令牌授权包含Oauth api中间件的简单Laravel REST测试控制器 结尾是1:401:( 下面是我的一些配置:

  • 为了发送和检索信封,我正在将我的应用编程接口后端与文档签名集成。我正在使用JWT Grant流。认证选项 在DocuSign开发环境中,我能够使用JWT流和DocuSign C#SKD检索访问令牌。然后我需要调用endpoint,以检索用于调用Docusign的基本uri字段。 当我提出GET请求时https://account-d.docusign.com/oauth/userinfo,包括授权