This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
使用重定向在 Expo Router 中进行身份验证
编辑页面
如何使用 Expo Router 实现身份验证并保护路由。
SDK 53 引入了受保护路由,这是一种更强大的身份验证处理方式。如果您使用的是 SDK 52 或更早版本,请遵循本指南。

了解如何在你的 Expo Router 项目中实现认证流程。
使用 Expo Router 时,所有路由都会始终被定义并可访问。你可以使用运行时逻辑,根据用户是否已认证将其重定向离开特定屏幕。路由内用户认证有两种不同的技术。本指南提供了一个示例,展示标准原生应用的功能。
使用 React Context 和路由组
通常会限制特定路由,仅允许未认证用户访问。通过使用 React Context 和路由组,可以以一种有组织的方式实现这一点。请考虑下面的项目结构,其中有一个始终可访问的 /sign-in 路由,以及一个需要认证的 (app) 组:
app_layout.tsxsign-in.tsx始终可访问 (app)_layout.tsx保护子路由index.tsx需要授权 1
要实现上述示例,请设置一个 React Context 提供者,以便向整个应用暴露认证会话。你可以实现你自己的自定义认证会话提供者,或者使用下面 示例认证上下文 中的实现。
示例认证上下文
这个提供者使用的是一个模拟实现。你可以将其替换为你自己的 认证提供者。
下面的代码片段是一个基础 hook,它会在原生端使用 expo-secure-store 安全地持久化令牌,并在 Web 端使用本地存储。
2
在根布局中使用 SessionProvider,将认证上下文提供给整个应用。至关重要的是,在触发任何导航事件之前,必须先挂载 <Slot />。否则会抛出运行时错误。
3
创建一个嵌套的 布局路由,在渲染子路由组件之前检查用户是否已认证。若用户未认证,此布局路由会将其重定向到登录屏幕。
4
创建 /sign-in 屏幕。它可以使用 signIn() 切换认证状态。由于该屏幕位于 (app) 组之外,在渲染此屏幕时,该组的布局和认证检查都不会运行。这样未登录用户就能看到这个屏幕。
5
实现一个已认证屏幕,让用户可以登出。
现在你已经拥有一个应用,它可以在检查初始认证状态时显示加载状态,并在用户未认证时重定向到登录屏幕。如果用户访问任何包含认证检查的路由深链接,他们会被重定向到登录屏幕。
其他加载状态
在 Expo Router 中,加载初始认证状态时,必须有内容被渲染到屏幕上。在上面的示例中,应用布局渲染了一个加载提示。或者,你也可以把 index 路由设为加载状态,并将初始路由移动到例如 /home 之类的路径,这与 X 的做法类似。
模态框与按路由认证
另一种常见模式是在应用顶部渲染一个登录模态框。这使你在认证完成后可以关闭模态框,并部分保留深链接。不过,这种模式要求路由在后台也能被渲染,因为这些路由需要在未认证的情况下处理数据加载。
app_layout.tsx声明全局会话上下文(app)_layout.tsxsign-in.tsx在根布局之上展示的模态框(root)_layout.tsx保护子路由index.tsx需要授权 无导航时的导航
当应用尝试在 根布局 中未挂载导航器的情况下执行导航时,你可能会遇到以下错误。
Error: Attempted to navigate before mounting the Root Layout component. Ensure the Root Layout component is rendering a Slot, or other navigator on the first render.
要修复此问题,请添加一个组,并将条件逻辑下移一层。
之前
app_layout.tsxabout.tsx之后
app_layout.tsx(app)_layout.tsx将条件逻辑下移一层about.tsx中间件
传统上,网站可能会利用某种形式的服务端重定向来保护路由。Expo Router 在 Web 上目前仅支持构建时静态生成,并且不支持自定义中间件或服务端提供内容。未来可以添加这些功能,以提供更优化的 Web 体验。与此同时,可以通过使用客户端重定向和加载状态来实现身份验证。