Flutter中使用Gmail API时无法获取refresh token的问题求助
Flutter项目google_sign_in接入Gmail API获取refresh token解决方案
1 Google Cloud控制台配置修正
- 确认OAuth同意屏幕的发布状态,测试模式下refresh token默认7天失效,且存在无法返回的情况,必须切换为发布模式。
- 在OAuth同意屏幕的权限列表中,添加读邮件所需的Gmail权限:
https://www.googleapis.com/auth/gmail.readonly。 - 核对OAuth 2.0客户端ID配置的包名、SHA-1签名与实际编译使用的签名完全一致,debug、release环境的签名需分别配置。
2 google_sign_in初始化参数调整
默认配置下google_sign_in不会返回refresh token,必须添加强制配置项:
- 初始化时新增
forceCodeForRefreshToken: true参数,该参数会要求谷歌返回可用于交换refresh token的授权码,示例代码如下:
final GoogleSignIn googleSignIn = GoogleSignIn( scopes: [ 'https://www.googleapis.com/auth/gmail.readonly', ], clientId: '你的Google Cloud OAuth客户端ID', forceCodeForRefreshToken: true, // 必加配置项 );
- 授权完成后,不要直接使用返回的access token,需拿取授权返回的
serverAuthCode手动调用token交换接口,同时获取access token和refresh token。
交换token的请求参数要求:
请求方式POST,接口地址为oauth2.googleapis.com/token,表单传参如下:
- client_id:你的OAuth客户端ID,推荐使用Web类型的客户端ID,避免移动端客户端ID无client_secret的问题
- client_secret:对应Web客户端ID的密钥
- grant_type:固定填authorization_code
- code:授权返回的serverAuthCode
- redirect_uri:移动端场景固定填urn:ietf:wg:oauth:2.0:oob
- 交换成功后的返回报文中会同步返回
access_token、refresh_token、expires_in三个字段,本地持久化存储refresh token即可,后续access token过期时,用refresh token调用同一接口即可换取新的access token,无需用户重复授权。
3 常见异常排查
- 同一用户首次授权后,后续再次授权谷歌默认不会返回refresh token,测试时如丢失refresh token,可让用户进入谷歌账号安全设置,删除对当前应用的授权后重新走授权流程即可拿到新的refresh token。
- 测试模式下refresh token存在7天有效期限制,且最多只能有50个测试用户,发布后无此限制。
- 如出现权限报错,需确认申请的Gmail权限符合需求,且OAuth同意屏幕的权限配置已同步更新。
内容的提问来源于stack exchange,提问作者Arpita Devargaonkar
相关产品推荐
相关产品推荐

