获取Bearer Token后调用API返回401未授权,求问题排查
问题排查与修复建议
以下是导致调用目标API返回401 Unauthorized的常见原因及对应修复步骤:
RestTemplate GET请求传参错误
你当前使用restTemplatex.getForObject(urix, String.class, resultx)时,第三个参数resultx(HttpEntity)会被当作URL占位符参数处理,而非请求头。正确做法是使用exchange方法来携带请求头:ResponseEntity<String> response = restTemplatex.exchange( urix, HttpMethod.GET, resultx, String.class ); String get = response.getBody();目标API URL格式错误
代码中urix的值是"http:/some-url-that-need-otp-to-access",缺少一个斜杠,应为"http://some-url-that-need-otp-to-access"。URL错误可能导致请求发送到非预期服务,返回401。GET请求无需设置Content-Type
GET请求没有请求体,设置headersx.setContentType(MediaType.APPLICATION_JSON)属于冗余操作,部分API会因不符合请求规范拒绝访问,建议移除该配置。未验证Token类型
并非所有OAuth2返回的token类型都是Bearer,需从token响应中提取token_type字段,再拼接前缀。例如:String tokenType = (String) jsonObject.get("token_type"); headersx.set("Authorization", tokenType + " " + access_token);Token权限范围或有效期问题
- 检查获取token时是否请求了目标API所需的
scope参数,若未指定正确的权限范围,即使token有效也无法访问接口。 - 打印完整的token响应,确认
expires_in字段,排查token是否已过期。
- 检查获取token时是否请求了目标API所需的
Base64编码字符集不明确
虽然当前已成功获取token,但notEncoded.getBytes()使用平台默认字符集,可能在不同环境下出现编码不一致问题,建议指定UTF-8编码:String encodedAuth = Base64.getEncoder().encodeToString(notEncoded.getBytes(StandardCharsets.UTF_8));
内容的提问来源于stack exchange,提问作者Kraken
相关产品推荐
相关产品推荐

