
如何把 Auth0 登录接入 Refine 并重写 /login 页面完成跳转【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine这篇操作指南针对一个具体任务你已有一个基于 Refinev5 版本线UI 使用 antd路由使用 react-router的管理后台现在要放弃自己写的账号密码登录改为跳转 Auth0 登录页完成认证。完成后访问受保护页面时未登录用户会被重定向到/login点击/login页面上的按钮会跳到 Auth0 登录界面登录成功后应用通过 ID token 放行路由并给 API 请求附带 Bearer 头。仓库中的 Auth0 Login 指南 给出全部步骤配套的完整示例项目位于 examples/auth-auth0。准备条件一个已有的 Refine 项目指南面向 Refine v5示例项目 examples/auth-auth0/package.json 使用的版本为refinedev/core ^5.0.12、refinedev/antd ^6.0.3、refinedev/react-router ^2.0.4、auth0/auth0-react ^1.5.0且engines要求node 20。你自己的 Auth0 租户信息domain和clientId。指南中的YOUR_DOMAIN/YOUR_CLIENT_ID是占位符必须替换指南说明详细配置以 Auth0 官方文档为准。示例项目 examples/auth-auth0/src/index.tsx 里使用的dev-y38p834gjptooc4g.us.auth0.com和AcinJvjWp1Dr41gPcJeQ20r5vcsteks4是官方示例的租户值可直接跑通生产环境请换成自己的。第一步安装 Auth0 React SDK在项目目录下安装auth0/auth0-react指南的 组件解析出的三种包管理器命令npm i auth0/auth0-react # 或 pnpm add auth0/auth0-react # 或 yarn add auth0/auth0-react第二步在 index.tsx 中用 Auth0Provider 包裹根组件指南要求在入口文件用 SDK 导出的Auth0Provider包裹根组件这样App内部的任何组件都能通过useAuth0拿到认证状态import React from react; import { createRoot } from react-dom/client; import { Auth0Provider } from auth0/auth0-react; import App from ./App; const container document.getElementById(root); const root createRoot(container!); root.render( React.StrictMode Auth0Provider domainYOUR_DOMAIN clientIdYOUR_CLIENT_ID redirectUri{window.location.origin} App / /Auth0Provider /React.StrictMode, );其中domain、clientId替换为第一步准备的值redirectUri{window.location.origin}表示登录流程在 Auth0 侧完成后浏览器回到当前应用来源地址。第三步重写 /login 页面在/pages文件夹下新建login.tsx覆盖 Refine 默认的登录页。这个页面的核心只有一个按钮点击时调用useAuth0hook 返回的loginWithRedirect把浏览器重定向到 Auth0 登录页import { Layout, Button, Space, Typography } from antd; import { ThemedTitle } from refinedev/antd; import { useAuth0 } from auth0/auth0-react; export const Login: React.FC () { const { loginWithRedirect } useAuth0(); return ( Layout style{{ height: 100vh, justifyContent: center, alignItems: center, }} Space directionvertical aligncenter sizelarge ThemedTitle collapsed{false} wrapperStyles{{ fontSize: 22px, }} / Button typeprimary sizemiddle onClick{() loginWithRedirect()} style{{ width: 240px }} Sign in /Button Typography.Text typesecondaryPowered by Auth0/Typography.Text /Space /Layout ); };指南对此步骤的验证描述是点击Login按钮后你会被导向 Auth0 的登录界面原文“After clicking theLoginbutton, you will be directed to the auth0 login screen”。仓库中的对应实现见 examples/auth-auth0/src/pages/login.tsx。第四步在 App.tsx 实现 authProvider 并接入路由Refine 的认证由authProvider对象驱动必需方法为login、check、logout、onError可选方法包括getPermissions、getIdentity见 Auth Provider 文档。指南给出的完整App.tsx如下import { Refine, AuthProvider, Authenticated } from refinedev/core; import { ThemedLayout, ReadyPage, useNotificationProvider, ErrorComponent, RefineThemes, } from refinedev/antd; import dataProvider from refinedev/simple-rest; import routerProvider, { NavigateToResource, CatchAllNavigate, } from refinedev/react-router; import { useAuth0 } from auth0/auth0-react; import { BrowserRouter, Routes, Route, Outlet } from react-router; import { ConfigProvider } from antd; import refinedev/antd/dist/reset.css; import { Login } from pages/login; import axios from axios; const API_URL https://api.fake-rest.refine.dev; const App () { const { isLoading, isAuthenticated, user, logout, getIdTokenClaims } useAuth0(); if (isLoading) { return spanloading.../span; } const authProvider: AuthProvider { login: async () { return { success: true, }; }, logout: async () { logout({ returnTo: window.location.origin }); return { success: true, }; }, onError: async (error) { console.error(error); return { error }; }, check: async () { try { const token await getIdTokenClaims(); if (token) { axios.defaults.headers.common { Authorization: Bearer ${token.__raw}, }; return { authenticated: true, }; } else { return { authenticated: false, error: { message: Check failed, name: Token not found, }, redirectTo: /login, logout: true, }; } } catch (error: any) { return { authenticated: false, error: new Error(error), redirectTo: /login, logout: true, }; } }, getPermissions: async () null, getIdentity: async () { if (user) { return { ...user, avatar: user.picture, }; } return null; }, }; getIdTokenClaims().then((token) { if (token) { axios.defaults.headers.common { Authorization: Bearer ${token.__raw}, }; } }); return ( BrowserRouter ConfigProvider theme{RefineThemes.Blue} Refine routerProvider{routerProvider} authProvider{authProvider} dataProvider{dataProvider(API_URL, axios)} notificationProvider{useNotificationProvider} resources{[ { name: posts, list: /posts, }, ]} Routes Route element{ Authenticated fallback{CatchAllNavigate to/login /} ThemedLayout Outlet / /ThemedLayout /Authenticated } Route path/posts element{divdummy list page/div} / /Route Route element{ Authenticated fallback{Outlet /} NavigateToResource / /Authenticated } Route path/login element{Login /} / /Route Route path* element{ErrorComponent /} / /Routes /Refine /ConfigProvider /BrowserRouter ); }; export default App;各方法与跳转行为的对应关系依据指南的 Methods 一节login真正的跳转发生在/login页面上loginWithRedirect来自useAuth0所以 provider 里的login只返回{ success: true }。check在用户访问需要认证的页面时被调用。有 token 时把Authorization: Bearer ${token.__raw}写入 axios 全局请求头并返回authenticated: true没有 token 或抛异常时返回redirectTo: /login和logout: true即未登录用户会被送回登录页。logout调用 SDK 的logout({ returnTo: window.location.origin })登出后回到应用来源地址。getPermissions指南明确说明 Auth0 不支持该能力所以返回空null。getIdentity直接返回useAuth0的user并把user.picture映射为avatar。onError指南版本只打印并返回错误示例项目版本 examples/auth-auth0/src/App.tsx 额外加了一个分支——API 返回401时返回{ logout: true }触发登出接入真实受保护的 API 时可以参考这个写法。路由部分是“重写 /login 完成跳转”的落点两段Authenticated包裹分别处理两个方向受保护路由如/postsfallback为CatchAllNavigate to/login /未认证时跳到/login。/login路由fallback为Outlet /未认证用户看到自定义Login页面已认证用户访问/login则被NavigateToResource /送到第一个资源页。验证结果示例项目的 package.json 中开发脚本为dev: refine dev用npm run dev启动后按文档描述的行为逐项确认未登录状态下访问/postscheck取不到 token返回redirectTo: /login且logout: true路由落到登录页。在/login页面点击Sign in按钮浏览器被重定向到 Auth0 登录界面指南明确给出的预期行为。Auth0 登录流程结束、浏览器回到应用redirectUri即window.location.origin后check通过getIdTokenClaims()取到 token返回authenticated: trueaxios 请求头带上Authorization: Bearer token/posts页面可正常访问。登出后再次访问受保护页面回到第 1 步的状态。可选路径直接拉取完整示例如果只想先看可运行版本仓库 READMEexamples/auth-auth0/README.md给出的本地运行方式是npm create refine-applatest -- --example auth-auth0拉下来的项目即examples/auth-auth0目录包含完整的 posts 增删改查页面、401 处理分支等。仓库内相关文件src/index.tsx、src/pages/login.tsx、src/App.tsx。已知限制Auth0 不支持getPermissions该能力在 provider 中返回空值需要复杂授权逻辑时Refine 建议单独使用 access control provider。指南明确提示Auth0 示例在 CodeSandbox 嵌入模式下无法运行需要直接在浏览器中打开才能体验。文档中的YOUR_DOMAIN、YOUR_CLIENT_ID、API_URL指南示例指向公开演示接口https://api.fake-rest.refine.dev都要按自己的环境替换其中 domain 和 clientId 来自你的 Auth0 租户配置。完成以上四步后登录链路即由 Refine 的/login页面接管未登录访问被check挡回登录页点击按钮经loginWithRedirect进入 Auth0登录后凭 ID token 通过check放行并携带 Bearer 头访问 API。【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考