You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

授权后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?
  • 是否需要苹果开发者账号?

问题分析与解决方案

  1. 重定向失效核心原因
    从响应对象可以看到,Fusion Auth已经生成了正确的回调URL,但当前使用的exp://协议在开发环境的浏览器模态框中,无法可靠唤起Expo应用并触发回调路由。AuthSession默认的WebBrowser模态框对Expo的exp://协议或自定义scheme的处理存在限制,纯JS开发模式下尤为明显。

  2. 关于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临时测试备用
  1. 苹果开发者账号需求
  • 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:03:10