Flutter GoogleSignIn的serverAuthCode后端兑换刷新令牌失败求助
问题原因及解决方案
1. 客户端类型错配:别用Web客户端ID,改用移动端专属ID
Flutter移动端生成的serverAuthCode是和iOS/Android OAuth客户端绑定的,Web客户端没有权限验证移动端的授权码。你需要:
- 去Google Cloud控制台创建对应平台(iOS或Android)的OAuth客户端ID,放弃之前的Web客户端。
- Flutter代码里的
serverClientId换成这个移动端客户端ID。
2. Redirect URI不能留空,必须严格匹配
移动端的redirect URI有固定格式,而且必须在Google Cloud的客户端配置里添加:
- Android端:
com.googleusercontent.apps.{{你的移动端CLIENT_ID}} - iOS端:
com.googleusercontent.apps.{{你的移动端CLIENT_ID}}:/oauth2redirect - 后端请求里的
redirect_uri参数要和上面的格式完全一致,不能是空字符串。
3. POST参数别放Query里,要放进请求体
向https://oauth2.googleapis.com/token发请求时,所有参数必须通过application/x-www-form-urlencoded格式放在请求体中,不是URL的Query参数。正确的请求示例:
POST https://oauth2.googleapis.com/token Content-Type: application/x-www-form-urlencoded code=你的serverAuthCode&client_id=你的移动端CLIENT_ID&client_secret=你的移动端CLIENT_SECRET&redirect_uri=你的对应平台redirectURI&grant_type=authorization_code
额外检查项
- 确认Google Cloud里的
OAuth consent screen已发布(测试阶段可以添加测试用户,避免未发布导致的权限问题)。 - 保持Flutter代码里的
forceCodeForRefreshToken: true开启,这是拿到能兑换refreshToken的有效serverAuthCode的必要设置。
内容的提问来源于stack exchange,提问作者gabowsky
相关产品推荐
相关产品推荐

