Java Spring OAuth2如何访问OAuth2User中idToken的tokenValue?
问题原因
你注入的OAuth2User是顶层接口,实际在OIDC认证流程中,Spring Security注入的实例是OidcUser接口的实现类,idToken是该接口的内置成员属性,不存在于attributes集合中,所以你用getAttribute()方法无法获取到对应值。
解决方案
- 你可以直接将入参声明为
OidcUser类型,Spring Security会自动完成类型注入,不需要手动强转 - 调用第三方OAuth资源接口时,需要在请求头中携带
Authorization: Bearer {JWT令牌},否则会触发鉴权失败
修正后的代码如下:
import org.springframework.security.oauth2.core.oidc.user.OidcUser; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; @GetMapping("/api_request") public Map<String, Object> getCalendars(@AuthenticationPrincipal OidcUser oidcUser) { // 直接获取JWT令牌字符串,对应你调试器看到的principal→idToken→tokenValue路径 String jwtToken = oidcUser.getIdToken().getTokenValue(); String uri = "https://www.googleapis.com/calendar/v3/users/me/calendarList"; RestTemplate restTemplate = new RestTemplate(); // 构造带认证信息的请求头 HttpHeaders headers = new HttpHeaders(); headers.setBearerAuth(jwtToken); HttpEntity<Void> request = new HttpEntity<>(headers); // 发起带认证信息的GET请求 String apiResponse = restTemplate.exchange(uri, HttpMethod.GET, request, String.class).getBody(); // 测试令牌获取可打开下方注释 // return Collections.singletonMap("tokenValue", jwtToken); return Collections.singletonMap("response", apiResponse); }
内容的提问来源于stack exchange,提问作者blackfake
相关产品推荐
相关产品推荐

