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

如何从Credential对象中获取用户ID Token?(桌面端Google登录)

嘿,我之前做桌面应用Google登录的时候也遇到过这个需求,刚好能给你讲讲怎么从Credential里拿到ID Token~

首先有个关键前提:你在构建GoogleAuthorizationCodeFlow的时候,必须要包含openid这个scope,因为ID Token是OpenID Connect协议的产物,没有请求这个scope的话,Credential里根本不会有ID Token。

第一步:确保Flow包含OpenID Scope

在你的authorize()方法里,构建flow的时候记得把openid加到scope列表里,比如:

// 导入需要的类
import java.util.Arrays;
import java.util.List;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.auth.oauth2.Scopes;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;

// ... 你的现有代码

// 构建包含openid的scope列表
List<String> scopes = Arrays.asList(Scopes.OPENID, Scopes.PROFILE, Scopes.EMAIL);
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
        new NetHttpTransport(), GsonFactory.getDefaultInstance(), clientSecrets, scopes)
        .setDataStoreFactory(dataStoreFactory) // 如果你用了DataStore保存凭证
        .setAccessType("offline") // 可选,如果你需要离线访问
        .build();

第二步:从Credential获取ID Token

当你成功获取到Credential对象后,直接调用它的getIdToken()方法就能拿到ID Token了:

Credential credential = // 你的授权流程返回的Credential对象
String idToken = credential.getIdToken();

if (idToken != null) {
    System.out.println("拿到的用户ID Token: " + idToken);
    // 这里可以进一步解析或使用ID Token
} else {
    // 大概率是没加openid scope导致的,检查下scope配置
    throw new IOException("未获取到ID Token,请确认已添加openid scope");
}

可选:解析ID Token获取用户信息

如果需要从ID Token里提取用户的具体信息(比如唯一ID、邮箱、姓名等),可以用Google提供的IdTokenVerifier来验证并解析:

import com.google.api.client.googleapis.auth.oauth2.IdToken;
import com.google.api.client.googleapis.auth.oauth2.IdTokenVerifier;
import java.util.Collections;

// ... 拿到idToken之后
if (idToken != null) {
    IdTokenVerifier verifier = new IdTokenVerifier.Builder(new NetHttpTransport(), GsonFactory.getDefaultInstance())
            // 验证受众是否匹配你的客户端ID
            .setAudience(Collections.singletonList(clientSecrets.getDetails().getClientId()))
            .build();

    IdToken idTokenObj = verifier.verify(idToken);
    if (idTokenObj != null) {
        IdToken.Payload payload = idTokenObj.getPayload();
        
        String userId = payload.getSubject(); // 用户在Google的唯一ID
        String email = payload.getEmail();
        boolean isEmailVerified = Boolean.parseBoolean(payload.getEmailVerified());
        String userName = (String) payload.get("name");
        String userAvatarUrl = (String) payload.get("picture");

        // 打印或使用这些信息
        System.out.println("用户唯一ID: " + userId);
        System.out.println("用户邮箱: " + email);
    } else {
        throw new IOException("ID Token验证失败,可能是无效或已过期");
    }
}

注意事项

  • 一定要加openid scope,这是获取ID Token的核心前提
  • 如果你的授权流程是离线访问(access_type=offline),刷新凭证后记得重新调用getIdToken()获取最新的ID Token
  • ID Token有过期时间,一般是1小时左右,过期后需要重新授权或刷新凭证来获取新的ID Token

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:08:32