You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Spring OAuth2如何访问OAuth2User中idToken的tokenValue?

问题原因

你注入的OAuth2User是顶层接口,实际在OIDC认证流程中,Spring Security注入的实例是OidcUser接口的实现类,idToken是该接口的内置成员属性,不存在于attributes集合中,所以你用getAttribute()方法无法获取到对应值。


解决方案

  1. 你可以直接将入参声明为OidcUser类型,Spring Security会自动完成类型注入,不需要手动强转
  2. 调用第三方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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:54:02