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

Google SignIn中access_token、id_token与code的区别及安卓适配问题

解决安卓Google登录无法获取access_token的问题

兄弟,你遇到的这个坑我之前也踩过!其实Google现在在移动端(包括安卓)的登录流程里,早就不主推直接拿access_token来做身份验证了,官方文档里明确推荐的是id_token——这才是当前移动端登录验证的标准方案。

为啥安卓开发说拿不到access_token?

  • 安卓的Google Sign-In SDK本身就是围绕id_token设计的:它返回的id_token是一个经过Google签名的JWT令牌,里面直接包含了用户的核心身份信息(比如唯一用户ID、邮箱、姓名),后端只要验证这个令牌的签名有效性,就能确认用户是真实的Google用户,完全不需要依赖access_token。
  • 你之前网站用的access_token,本质是用来调用Google的第三方API(比如读取用户相册、日历)的授权令牌,不是专门给登录验证用的。安卓SDK要获取它,得额外配置API权限Scope,还要手动调用特定方法,而且官方文档里几乎不会把这个作为登录流程的常规步骤来介绍,所以开发找不到资料很正常。

怎么解决这个适配问题?

推荐优先选第一种方案,完全符合Google的最佳实践:

方案1:后端兼容id_token验证

直接修改你的后端验证逻辑,接收安卓端传来的id_token并验证,流程和之前验证access_token类似,但更安全。这里给你一段Python的验证示例代码(其他语言的逻辑也差不多):

from google.oauth2 import id_token
from google.auth.transport import requests

def verify_google_id_token(token):
    try:
        # 替换成你在Google开发者控制台注册的客户端ID
        id_info = id_token.verify_oauth2_token(token, requests.Request(), "YOUR_ANDROID_CLIENT_ID")
        # 校验令牌的发行方是否为Google
        if id_info['iss'] not in ['accounts.google.com', 'https://accounts.google.com']:
            raise ValueError('无效的令牌发行方')
        # 提取用户的唯一标识和邮箱
        user_unique_id = id_info['sub']
        user_email = id_info['email']
        return (user_unique_id, user_email)
    except ValueError:
        # 令牌验证失败(无效、过期、签名错误等)
        return (None, None)

方案2(不推荐):强制安卓端获取access_token

如果你的后端实在不想改,那可以让安卓开发这么做:

  • 在初始化Google Sign-In时,添加需要的API Scope(比如email、profile,还要加上你需要调用的API权限);
  • 登录成功后,通过GoogleSignInAccount.getAccessToken()方法获取access_token。
    但要注意:这个access_token有效期只有1小时,后端还要处理刷新令牌的逻辑,而且这种方式不符合Google的登录规范,后续可能会遇到兼容性问题。

总结

Google现在的身份验证逻辑已经把「登录验证」和「API授权」拆分开了:id_token负责身份验证,access_token负责API调用。建议你调整后端适配id_token,这样安卓端开发起来顺风顺水,也符合官方的最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:29:37