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

如何使用accesstoken(tokenId)获取Google用户个人资料详情

解答

绝对不要把Access Token直接传入idTokenString参数,这两个是Google OAuth体系下完全独立的凭证,用途不通用。

参数说明

idTokenString需要传入的是OpenID Connect协议下发的ID Token,是固定格式的JWT字符串,本身就携带了经过签名的用户身份信息。你当前代码里的GoogleIdTokenVerifier唯一作用就是校验ID Token的签名合法性、签发方、受众匹配度,最终解析出Token内存储的用户资料,它不支持校验Access Token。
你当前通过refresh token兑换到的Access Token,作用是作为调用Google开放API的鉴权凭证,本身不能被ID Token校验器识别。

可直接落地的实现方案

你当前已经持有有效Access Token,不需要重新走授权流程拿ID Token,直接调用Google用户信息接口就能拿到完整资料,参考实现:

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.oauth2.Oauth2;
import com.google.api.services.oauth2.model.Userinfo;

// 省略其他业务代码
String validAccessToken = "你通过refresh token兑换到的access token";
NetHttpTransport transport = new NetHttpTransport();
GsonFactory jsonFactory = new GsonFactory();

GoogleCredential credential = new GoogleCredential().setAccessToken(validAccessToken);
Oauth2 oauth2Client = new Oauth2.Builder(transport, jsonFactory, credential)
        .setApplicationName("你的应用名称")
        .build();

// 拉取用户完整资料
Userinfo userProfile = oauth2Client.userinfo().get().execute();
String userId = userProfile.getId(); // 对应用户唯一ID
String email = userProfile.getEmail();
String displayName = userProfile.getName();
String avatarUrl = userProfile.getPicture();
// 其余需要的字段直接从userProfile对象获取即可

如果你坚持要使用现有ID Token校验逻辑

你需要调整初始OAuth授权请求的配置:

  • 在授权请求的scope参数中追加openid、profile、email三个权限项
  • 重新走授权流程,用户同意授权后,在兑换token的响应结果中,会额外返回id_token字段,这个字段的字符串值就是idTokenString需要传入的内容

注意:使用未包含openid权限的refresh token,无论刷新多少次access token,都不会返回ID Token,必须重新发起授权让用户确认对应权限。

内容的提问来源于stack exchange,提问作者kavinila

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:24:21