Java获取access token报unsupported_response_type错误如何解决
问题根因
报错是两个问题叠加导致的:
- 构建请求时调用了
buildQueryMessage(),该方法会把所有请求参数拼接在URL后提交,但Google OAuth2的令牌端点要求POST请求将参数放在请求体中、以application/x-www-form-urlencoded格式编码。参数位置不符合要求时,Google会返回HTML格式的错误提示页,而非约定的JSON响应,最终触发Invalid response! Response body is not application/json encoded的解析错误。 - 授权码(Authorization Code)模式申请令牌时,漏传了两个必填参数:用户授权后返回的授权码
code、项目中配置的重定向地址redirectUri,即使请求格式正确,缺省这两个参数也会被端点拦截返回错误。
修复方案
按以下调整代码即可:
- 将请求构建方法从
buildQueryMessage()替换为buildBodyMessage(),确保参数放在POST请求体中提交 - 补充授权码、重定向URI两个必填参数,注意重定向URI必须和触发授权时传入的值、Google云控制台已配置的授权回调地址完全一致
- (可选)可将旧的令牌端点
https://accounts.google.com/o/oauth2/token替换为Google当前推荐的端点https://oauth2.googleapis.com/token,两者当前都可正常使用
修正后的可运行代码示例:
OAuthClient client = new OAuthClient(new URLConnectionClient()); OAuthClientRequest request = OAuthClientRequest.tokenLocation("https://oauth2.googleapis.com/token") .setGrantType(GrantType.AUTHORIZATION_CODE) .setClientId("替换为你的客户端ID") .setClientSecret("替换为你的客户端密钥") .setRedirectURI("替换为你配置的重定向地址") .setCode("替换为回调拿到的一次性授权码") .buildBodyMessage(); String token = client.accessToken(request, OAuth.HttpMethod.POST, OAuthJSONAccessTokenResponse.class).getAccessToken();
注意:授权码为一次性使用凭证,有效期仅数分钟,拿到后需要立即发起令牌请求,过期后需要重新触发用户授权流程获取新的授权码。
内容的提问来源于stack exchange,提问作者kavinila
相关产品推荐
相关产品推荐

