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!); } });
关键说明
- 授权码流要求后端参与:refresh_token属于敏感信息,不能在前端暴露,必须由后端存储和管理。
- Google Cloud控制台配置:确保Web客户端和后端客户端的授权回调地址已正确配置,否则无法获取
serverAuthCode。 - refresh_token获取规则:首次授权会返回refresh_token,后续重复授权默认不返回,若需要强制返回,可在后端请求时添加
prompt=consent参数(需用户重新确认授权)。
内容的提问来源于stack exchange,提问作者user3808307
相关产品推荐
相关产品推荐

