You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Google OAuth跨客户端身份实现:Flutter应用与网站仅一次授权咨询

关于Google跨客户端身份共享与多Client ID的问题解答

1. 是否确实需要两个Client ID?

答案是肯定的。Google OAuth2要求不同平台类型的应用(Web、移动、桌面等)使用独立的Client ID,这是因为不同平台的授权流程、安全验证机制(比如Web的redirect URI vs 移动应用的包名/SHA指纹)完全不同。你的网站(Web应用)和Flutter应用(移动/桌面)属于不同平台,所以必须在同一个Google Cloud项目下创建对应的两个Client ID。

2. 如何实现用户仅需一次授权?

利用Google的跨客户端身份机制,核心是基于用户的唯一标识sub字段和统一的权限范围,具体步骤如下:

前提条件

确保Web应用和Flutter应用的两个Client ID属于同一个Google Cloud项目,并且OAuth同意屏幕的配置(应用名称、支持的范围、隐私政策链接等)完全一致。

服务端验证逻辑调整

当服务端收到来自Web或Flutter应用的idToken时,需要做以下处理:

  • 使用Google官方的验证库(比如Node.js的google-auth-library、Java的google-api-client)验证idToken的合法性(签名、过期时间、issuer等)。
  • 检查idToken中的aud(受众)字段,允许同时匹配Web应用和Flutter应用的两个Client ID值——这样不管用户从哪个客户端登录,服务端都能通过验证。
  • 提取idToken中的sub字段:这是用户在Google系统中的唯一持久化ID,同一个用户无论用哪个Client ID登录,sub值都是相同的。服务端可以用sub来关联用户在网站上已有的账号,实现跨客户端的身份同步。

Flutter端配置

  1. 在Google Cloud项目中创建移动应用的Client ID(Android/iOS分别配置SHA-1指纹和Bundle ID)。
  2. 使用Flutter的google_sign_in插件,初始化时传入新的移动Client ID:
final GoogleSignIn _googleSignIn = GoogleSignIn(
  clientId: '你的Flutter应用Client ID',
  scopes: ['email', 'profile'], // 和Web应用使用相同的权限范围
);
  1. 用户登录后获取idToken,传给服务端进行验证,服务端通过sub字段识别为同一用户,无需重复授权。

关键注意事项

  • 保持两个应用的权限范围(scopes)完全一致:如果Web应用只请求了emailprofile,Flutter应用也不要额外添加其他权限,否则用户可能会被再次要求授权。
  • 不要手动解析idToken:必须使用Google官方库验证签名,避免安全漏洞。
  • 测试跨客户端登录:先在网站登录授权,再打开Flutter应用登录,确认用户无需再次授权即可完成登录。

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

火山引擎 最新活动