授权后Fusion Auth未重定向至Expo应用OAuth回调路由问题
Expo + Fusion Auth PKCE认证重定向问题
我用Expo开发应用,本地部署Fusion Auth作为认证服务器,通过OAuth PKCE流程完成认证。调用/authorize接口拿到code后,Fusion Auth并未跳转到OAuth回调路由,反而关闭了浏览器模态框,登录页保持活跃状态。代码基于Expo Auth Session编写,相关信息如下:
【Fusion Auth应用配置截图】
登录页代码:
import * as AuthSession from 'expo-auth-session' import { Button } from 'react-native'; export default function Login() { const discovery = AuthSession.useAutoDiscovery("http://192.168.100.17:9011/.well-known/openid-configuration/a5673e50-cbcc-14ec-5ae3-bde9d60a1950"); const [request, response, promptAsync] = AuthSession.useAuthRequest({ clientId: process.env.FUSIONAUTH_CLIENT_ID, scopes: ['openid', 'offline_access'], redirectUri: AuthSession.makeRedirectUri({ path: 'oauth', // app文件夹中的Expo Router路由 scheme: 'myapp', // app.json中配置的scheme也是myapp }), }, discovery); return <Button title="Login" onPress={() => promptAsync()} /> }
【应用表现录屏】
请求对象:
{ "clientId": "7ae2dde8-5710-4f6f-b159-693a394e8eee", "clientSecret": undefined, "codeChallenge": "iPLWzzLvGhYvaCRbwb6-aBLdiOE8jLPEdLWWP91Xc8Q", "codeChallengeMethod": "S256", "codeVerifier": "c6RBW8y9mmWrqK0TRXQud7lYlPCsYS8QUQp4LZkKFZVG8ovruNzgMsDPjdGKPPkWv6bsZQtpQtcHQ24Hq0HHBLfhX36aliDIlTMumLtJzwL8Q7UI3M6rPxzv4zYpSbcD", "extraParams": {}, "prompt": undefined, "redirectUri": "exp://192.168.100.17:8081/--/oauth", "responseType": "code", "scopes": ["openid", "offline_access"], "state": "PJIpedf69M", "url": "http://192.168.100.17:9011/oauth2/authorize?code_challenge=iPLWzzLvGhYvaCRbwb6-aBLdiOE8jLPEdLWWP91Xc8Q&code_challenge_method=S256&redirect_uri=exp%3A%2F%2F192.168.100.17%3A8081%2F--%2Foauth&client_id=7ae2dde8-5710-4f6f-b159-693a394e8eee&response_type=code&state=PJIpedf69M&scope=openid%20offline_access", "usePKCE": true }
响应对象:
{ "authentication": null, "error": null, "errorCode": null, "params": { "code": "NDyy5uMqvstnap3JIz6GWyYk1Q34ayOjPvyY3lIsayk", "locale": "pl_PL", "state": "PJIpedf69M", "userState": "Authenticated" }, "type": "success", "url": "exp://192.168.100.17:8081/--/oauth?code=NDyy5uMqvstnap3JIz6GWyYk1Q34ayOjPvyY3lIsayk&locale=pl_PL&state=PJIpedf69M&userState=Authenticated" }
疑问
- 为什么Fusion Auth没有重定向到回调URL?
- 是否需要使用prebuild构建应用,或创建开发构建并使用
myapp://oauth这样的scheme? - 是否需要苹果开发者账号?
问题分析与解决方案
重定向失效核心原因
从响应对象可以看到,Fusion Auth已经生成了正确的回调URL,但当前使用的exp://协议在开发环境的浏览器模态框中,无法可靠唤起Expo应用并触发回调路由。AuthSession默认的WebBrowser模态框对Expo的exp://协议或自定义scheme的处理存在限制,纯JS开发模式下尤为明显。关于prebuild/开发构建与scheme的问题
- 必须创建**开发构建(Development Build)**或执行
npx expo prebuild后用原生工具构建应用。纯Expo Go环境下,自定义scheme的支持有限,exp://协议无法在浏览器模态框中稳定触发应用跳转。 - 切换到
myapp://oauth这种自定义scheme是正确方向,需确保:app.json中正确配置scheme字段为myapp- 开发构建或预构建后的应用才能识别该自定义scheme
- Fusion Auth应用配置中,回调URL需添加
myapp://oauth,可同时保留exp://地址作为Expo Go临时测试备用
- 苹果开发者账号需求
- 在iOS模拟器上测试开发构建,不需要苹果开发者账号。
- 若要在真实iOS设备测试或发布应用,必须拥有苹果开发者账号,因为需要给应用签名并配置自定义scheme的权限。
具体操作步骤
- 生成开发构建:执行
npx expo run:ios或npx expo run:android,自动完成预构建并生成可安装的开发包。 - 更新Fusion Auth的回调URL,添加
myapp://oauth。 - 修改代码中的
redirectUri,强制使用自定义scheme:redirectUri: AuthSession.makeRedirectUri({ path: 'oauth', scheme: 'myapp', useProxy: false, // 禁用代理,强制使用自定义scheme }), - 在应用中监听
oauth路由,处理返回的code并完成token交换流程。
内容的提问来源于stack exchange,提问作者artolini
相关产品推荐
相关产品推荐

