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

Flutter Web中google_sign_in_web获取刷新令牌的技术问题

解决google_sign_in_web获取刷新令牌的问题

google_sign_in_web默认采用隐式授权流,该模式不会返回刷新令牌(refresh_token)。要获取刷新令牌,你需要切换到授权码流,并通过后端服务完成令牌交换(前端不能直接处理refresh_token,避免泄露风险)。

步骤1:修改GoogleSignIn初始化配置

在初始化GoogleSignIn时,添加clientId(Web客户端ID)和serverClientId(同一Google Cloud项目下的后端OAuth客户端ID):

GoogleSignIn _googleSignIn = GoogleSignIn(
  scopes: [
    'email',
    'https://www.googleapis.com/auth/contacts.readonly',
  ],
  clientId: '你的Web客户端ID', // 从Google Cloud控制台获取
  serverClientId: '你的后端客户端ID', // 同一项目下的后端OAuth客户端ID
);

步骤2:获取授权码并发送到后端

登录成功后,获取serverAuthCode(授权码),将其发送到你的后端服务,由后端调用Google的令牌端点交换刷新令牌和访问令牌:

// 主动登录场景
final GoogleSignInAccount? user = await _googleSignIn.signIn();
if (user != null) {
  final String? authCode = await user.serverAuthCode;
  if (authCode != null) {
    // 发送authCode到你的后端接口
    // 后端需发起POST请求到https://oauth2.googleapis.com/token
    // 请求参数示例:
    // client_id=后端客户端ID
    // client_secret=后端客户端密钥
    // code=$authCode
    // grant_type=authorization_code
    // redirect_uri=后端配置的回调地址(若有)
  }
}

// 静默登录场景(对应你的initState逻辑)
_googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount? account) async {
  setState(() {
    _currentUser = account;
  });
  if (_currentUser != null) {
    final String? authCode = await _currentUser!.serverAuthCode;
    if (authCode != null) {
      // 同样发送authCode到后端交换令牌
    }
    _handleGetContact(_currentUser!);
  }
});

关键说明

  1. 授权码流要求后端参与:refresh_token属于敏感信息,不能在前端暴露,必须由后端存储和管理。
  2. Google Cloud控制台配置:确保Web客户端和后端客户端的授权回调地址已正确配置,否则无法获取serverAuthCode。
  3. refresh_token获取规则:首次授权会返回refresh_token,后续重复授权默认不返回,若需要强制返回,可在后端请求时添加prompt=consent参数(需用户重新确认授权)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:33:25