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
相关产品推荐
相关产品推荐

