App跳转浏览器登录页完成谷歌登录后返回回调状态实现方案
App跳转网页完成谷歌登录后回跳传值实现方案
核心实现逻辑是通过深度链接(Deep Link) 作为两端的通信载体,网页端完成谷歌授权后携带登录结果触发深度链接唤起原App,App解析参数即可拿到登录状态,整套流程和NordVpn的登录交互完全一致。
1. App端配置
Android侧
- 在
AndroidManifest.xml中给回调接收页配置intent-filter,添加BROWSABLE分类支持浏览器拉起:
<activity android:name=".LoginCallbackActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- 替换成自有专属scheme,避免和其他应用冲突 --> <data android:scheme="youruniqueappscheme" android:host="logincallback" /> </intent-filter> </activity>
- 跳转系统浏览器打开登录页时,把回跳地址作为query参数拼到登录url后,示例:
https://你的自有登录页地址?redirect_uri=youruniqueappscheme://logincallback - 在
LoginCallbackActivity的onCreate和onNewIntent方法中,解析Intent携带的url参数,提取登录结果(业务token、错误码等),后续直接走对应业务逻辑即可。 - 如果要消除浏览器拉起App的二次确认弹窗,改用官方App Links方案,做域名和应用签名的绑定即可,体验和原生跳转无差异。
iOS侧
- 在Xcode项目的URL Types中添加和Android端一致的自定义scheme,或者配置Universal Links做无弹窗拉起。
- 在
AppDelegate/SceneDelegate中实现系统的URL回调监听方法,解析拉起App时携带的url参数,提取登录结果做后续处理。
2. 网页登录页逻辑
- 页面初始化时从url参数中解析App传入的
redirect_uri字段,做域名/scheme合法性校验,拦截非法跳转请求。 - 集成网页端谷歌OAuth登录能力,用户点击谷歌登录按钮后走标准授权流程。
- 授权结果处理:
- 授权成功:拿到谷歌返回的身份凭证后,先请求自有服务端完成账号绑定/登录校验,生成自有业务的登录token,随后直接302重定向到之前解析到的
redirect_uri地址,url上拼接成功标识和凭证,示例:youruniqueappscheme://logincallback?code=0&token=xxxx&userinfo=xxxx - 授权失败/用户主动取消:同样重定向回
redirect_uri,拼接错误码和错误信息,示例:youruniqueappscheme://logincallback?code=-1&msg=用户取消授权
- 授权成功:拿到谷歌返回的身份凭证后,先请求自有服务端完成账号绑定/登录校验,生成自有业务的登录token,随后直接302重定向到之前解析到的
注意:如果要实现无感知拉起App,不要用自定义scheme做回跳地址,改用和App绑定的App Links/Universal Links域名地址做回跳,所有主流浏览器都不会弹二次确认,就是NordVpn当前用的实现方案。
3. 兜底兼容处理
- 网页端触发重定向后加1.5s超时判断,如果超时后没成功拉起App,页面直接展示「点击返回应用」按钮,避免用户卡在网页端。
- App端做回调幂等处理,拿到一次有效登录结果后就拦截后续重复回调,避免重复执行业务逻辑。
- 安全校验:App拿到回跳携带的token后,必须传到自有服务端做二次有效性校验,避免参数伪造导致的登录安全问题。
内容的提问来源于stack exchange,提问作者Sandeep Kumar
相关产品推荐
相关产品推荐

