如何无需用户点击即可获取Chrome Custom Tabs内URL中的access token?
无用户点击从CustomTabs获取Facebook Access Token 实现方案
核心原理
通过配置深度链接(Deep Link) 作为OAuth授权的回调地址,Facebook授权完成后会自动触发重定向到你配置的应用专属链接,系统会直接唤起你的应用接收回调,全程无需用户额外点击操作。
实现步骤
1. 配置Facebook后台重定向地址
- 进入Facebook开发者后台对应应用的「Facebook登录 > 设置」页面,在「有效OAuth重定向URI」栏添加你自定义的深度链接,示例:
myapp://fb-auth,其中myapp替换为你应用的唯一Scheme。
2. 应用端注册回调接收组件
- 在AndroidManifest中为你用来接收授权回调的Activity添加Intent Filter配置,示例代码:
<activity android:name=".FbAuthReceiverActivity" 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" /> <data android:scheme="myapp" android:host="fb-auth" /> </intent-filter> </activity>
3. 构造CustomTabs启动的授权链接
- 构造Facebook OAuth授权链接时,
redirect_uri参数填写你刚才配置的深度链接,response_type参数指定为token,示例链接:
https://www.facebook.com/v18.0/dialog/oauth?client_id=你的FB应用ID&redirect_uri=myapp%3A%2F%2Ffb-auth&response_type=token&scope=public_profile,email
- 用上述链接启动CustomTabs即可,用户完成登录授权后,Facebook授权页会自动触发重定向到你配置的深度链接。
4. 回调中提取Access Token
- 在回调Activity的
onCreate或onNewIntent方法中解析传入的Uri,提取锚点部分的Access Token参数,示例Kotlin代码:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) intent.data?.let { authUri -> // 重定向Uri格式:myapp://fb-auth#access_token=xxx&expires_in=xxx&token_type=bearer val paramMap = authUri.fragment?.split("&")?.associate { val kv = it.split("=") kv[0] to kv[1] } ?: emptyMap() val accessToken = paramMap["access_token"] // 拿到Access Token后执行后续业务逻辑 } finish() // 处理完成后直接关闭回调页即可 }
注意事项
不管用户是否安装Facebook客户端,该逻辑都能正常生效,CustomTab打开的网页授权页同样会自动触发重定向,不会要求用户手动点击跳转。
如果你的业务要求服务端换Token,可以将response_type改为code,提取code参数传给服务端完成后续兑换即可。
内容的提问来源于stack exchange,提问作者UchihaItachi
相关产品推荐
相关产品推荐

