Flutter Web使用google_sign_in如何获取refreshToken或serverAuthCode
Flutter google_sign_in插件获取refreshToken/serverAuthCode解决方案
核心问题原因
google_sign_in插件默认不会直接返回refreshToken,serverAuthCode返回为空绝大多数是配置错误导致的,可按以下步骤排查修复:
可行操作步骤
- 首先在Google Cloud控制台完成三类OAuth客户端ID的创建:Android客户端ID、iOS客户端ID、Web客户端ID,Web客户端ID是获取serverAuthCode的必要配置,缺失就会返回null
- 初始化
GoogleSignIn实例时,必须显式传入serverClientId参数,参数值为你创建的Web类型OAuth客户端ID,不要错误传入移动端的客户端ID - 参考初始化代码:
final GoogleSignIn googleSignIn = GoogleSignIn( // 此处必须传Web类型的客户端ID,不能填Android/iOS的客户端ID serverClientId: "xxxxxx.apps.googleusercontent.com", scopes: [ 'email', 'https://www.googleapis.com/auth/userinfo.profile', // 按需添加其他需要申请权限的scope ], );
- 触发登录流程后,即可从返回的
GoogleSignInAccount对象中拿到非空的serverAuthCode字段
兑换refreshToken的方式
- 拿到
serverAuthCode后,将其传递到你的后端服务,由后端调用Google OAuth凭证兑换接口,即可同时获取accessToken、idToken和refreshToken - 注意:
serverAuthCode仅可兑换一次,兑换后立即失效,禁止在前端直接兑换token,必须走后端交互避免凭证泄露 - 如果需要多次获取refreshToken,可引导用户在Google账号安全中心取消当前应用的授权,重新登录时Google会在首次授权场景下返回新的refreshToken
边缘场景适配
- iOS端需要额外在Xcode工程的Info配置中添加URL Schemes,值为iOS客户端ID的反转字符串,否则授权回调流程会失败,也会导致
serverAuthCode返回为空 - 所有客户端ID的包名/Bundle ID必须和你的应用实际配置完全一致,签名证书SHA1值也需要和Google Cloud控制台配置的匹配,否则会出现权限校验失败问题
内容的提问来源于stack exchange,提问作者RMK
相关产品推荐
相关产品推荐

