Put请求返回401[无响应体]未授权问题排查求助
以下是针对你遇到的问题的具体排查方向:
Bearer Token有效性验证
- 先确认
BearerTokenUtil.getBearerToken()返回的token是否合法:可以在代码中临时添加日志打印token(注意脱敏),或使用Postman携带相同token调用目标API,验证是否能正常响应。 - 检查token是否过期:查看token的
exp声明,确认是否在有效期内;如果采用token刷新机制,排查是否未正确获取最新的access token。 - 确认token权限范围:部分API要求特定的scope或权限,检查当前token是否拥有该PUT接口的访问权限。
- 先确认
请求头冲突或覆盖检查
- 排查
getJsonExchangeHeaders()方法是否已设置过Authorization头,导致后续的headers.setBearerAuth()被覆盖。可以在设置Bearer Auth后打印所有请求头,确认Authorization字段是否为Bearer [你的token]格式。 - 验证Content-Type头:由于请求携带JSON体,确保
getJsonExchangeHeaders()已正确设置Content-Type: application/json,部分服务会因Content-Type不正确返回401。
- 排查
API端点与请求方式校验
- 确认
url是否正确,排查是否存在拼写错误、环境域名混淆(如测试/生产环境混用)。 - 确认目标API是否支持PUT方法,部分接口仅允许POST等其他请求方式,错误的请求方法可能返回401或405。
- 确认
RestTemplate配置排查
- 检查RestTemplate是否配置了拦截器,是否有拦截器修改了请求头或token内容。
- 如果目标API使用HTTPS,确认RestTemplate是否正确配置了SSL证书,证书验证失败可能被服务端返回401而非SSL错误。
你的代码如下:
HttpHeaders headers = getJsonExchangeHeaders(); headers.setBearerAuth(BearerTokenUtil.getBearerToken()); HttpEntity<PhoneNumberVerificationDto> entity = new HttpEntity<>(phoneNumberVerificationDto, headers); ResponseEntity<String> response; try { response = restTemplate.exchange(URI.create(url), HttpMethod.PUT, entity, String.class); if (response.getStatusCode() == HttpStatus.OK) { log.info("Customer validation Success for MFA in IDP for: phone:{} with status: {}", phoneNumberVerificationDto.getPhoneNumber(), response.getStatusCode()); return true; } else { log.error("Customer validation failed for MFA in IDP for: phone:{} with status: {}", phoneNumberVerificationDto.getPhoneNumber(), response.getStatusCode()); return false; } } catch (RestClientException e) { throw new RestClientException("Idp facade API error for user with phone number " + phoneNumberVerificationDto.getPhoneNumber(), e); }
内容的提问来源于stack exchange,提问作者clement mensah
相关产品推荐
相关产品推荐

