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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:27:04