Flutter登录应用如何实现与第三方应用的跨应用通信交互
Flutter实现第三方授权登录服务的完整落地方案
整个流程分四个核心模块实现,端侧配合少量服务端校验即可跑通完整逻辑:
1. 跨应用唤起能力配置
这一步实现第三方应用点击登录按钮后直接跳转到你的Flutter应用的能力:
- Android端:在项目的
AndroidManifest.xml中,给主Activity配置自定义Scheme的intent-filter,如果要提升跳转流畅度和安全性,可以额外配置App Links关联域名;同时配置支持接收第三方应用传入的标准授权参数:client_id(第三方应用唯一标识)、redirect_uri(第三方回调地址)、scope(申请的权限范围)、state(防CSRF随机串)。 - iOS端:在
Info.plist的CFBundleURLTypes字段下注册和Android端一致的自定义URL Scheme,同时可配置Universal Links实现无弹窗跳转;重写AppDelegate中的openURL、continueUserActivity回调方法,把唤起传入的参数透传到Flutter层。 - Flutter层:接入
uni_links插件统一处理两端的冷启动、热启动唤起事件,所有唤起请求第一时间把参数传到你的服务端校验client_id、redirect_uri是否为提前备案的合法值,非法请求直接弹出提示后退出,不要进入后续授权流程。
2. 授权确认页逻辑
合法请求校验通过后,不要直接生成授权凭证,必须先经过用户明确确认:
- 跳转独立的授权确认页面,页面上清晰展示发起请求的第三方名称、备案logo、申请的权限列表,不要隐藏授权主体信息。
- 页面只保留「同意授权」「拒绝授权」两个明确操作按钮,不要设置默认勾选同意的诱导逻辑。
- 如果用户点击拒绝,直接携带拒绝状态回传给第三方后关闭页面即可,不需要生成任何授权凭证。
3. 授权凭证生成与回传
用户明确同意授权后,再走凭证生成和回传逻辑:
- 不要在Flutter端直接生成永久授权token:Flutter端只把「用户已同意」的标识、当前登录用户的身份凭证、第三方传入的原始参数传给你的授权服务端,由服务端完成二次校验后,生成短期有效(一般10分钟有效期、仅可使用一次)的授权code,返回给Flutter端。
- 接入
url_launcher插件,把授权code、原请求带回的state参数拼接到第三方传入的redirect_uri后面,调用系统能力唤起第三方应用。 - 确认跳转第三方成功后,调用
SystemNavigator.pop()关闭你的应用的授权页面,自动回到第三方应用界面,第三方App通过自身的路由监听拿到URL里的code参数,即可走后续的换token、拉取用户信息的业务逻辑。
4. 必做的安全校验
- 所有跨应用传递的参数必须加签名校验:给每个接入的第三方分配独立的
client_secret,第三方发起请求时需要对所有非签名参数做哈希签名,你方服务端接收请求后先验签,参数被篡改的请求直接拦截。 - 必须校验回传时携带的
state参数和第三方发起请求时传入的完全一致,防止CSRF攻击。 - 不要通过端间跳转直接传递长期有效的access token,统一用短期授权code的模式,由第三方服务端拿着code、
client_secret到你的授权服务端换长效token,避免凭证被恶意截取。 - 校验
redirect_uri时必须做全路径匹配,不要做前缀匹配,防止恶意应用伪造相似回调地址窃取授权code。
内容的提问来源于stack exchange,提问作者Pairat Atichart
相关产品推荐
相关产品推荐

