ReactJS:Okta认证restoreOriginalUri函数认证成功后无法正常跳转
问题根因与修复方案
你遇到的问题是@okta/okta-react@6.x版本常见的嵌套顺序错误、缺少回调路由、history实例不一致三类问题,按以下步骤修改即可:
1. 修正组件嵌套顺序
React Router的<Switch>仅支持<Route>、<Redirect>作为直接子元素,你当前把Redux的<Provider>放在<Switch>下会导致路由匹配完全失效,同时要保证整个应用被React Router的Router组件包裹,调整后嵌套结构如下:
// 最外层先放Redux Provider + React Router <Provider store={store}> <BrowserRouter history={history}> {/* 这里传入的history要和你restoreOriginalUri里用的是同一个实例 */} <Security oktaAuth={oktaAuth} onAuthRequired={customAuthHandler} restoreOriginalUri={restoreOriginalUri} > <Switch> {/* 必须先配置Okta登录回调路由,LoginCallback从@okta/okta-react导入 */} <Route path="/login/callback" component={LoginCallback} /> <Route exact path="/" component={Home} /> <Route exact path="/reports" component={Reports} /> </Switch> </Security> </BrowserRouter> </Provider>
2. 校验history实例一致性
如果你是自行创建的history实例(比如用history.createBrowserHistory()),要保证:
- 传入
BrowserRouter的history和restoreOriginalUri中使用的history是同一个实例,不要重复创建多个history对象 - 如果是用React Router v5的
useHistoryhook获取history,要保证restoreOriginalUri的定义在Router上下文覆盖的组件内
3. 兜底优化restoreOriginalUri逻辑
该版本okta-auth-js偶发返回originalUri为空的情况,添加兜底判断:
const restoreOriginalUri = async (_oktaAuth, originalUri) => { console.log("restoring original uri...", originalUri); const target = originalUri ? toRelativeUrl(originalUri, window.location.origin) : '/'; // 如果history.replace还是失效,可以临时用window.location.replace(target)兜底验证 history.replace(target); };
4. 确认Okta初始化配置
初始化oktaAuth时确保以下配置和Okta后台设置完全一致:
const oktaAuth = new OktaAuth({ issuer: 'https://{你的Okta域名}/oauth2/default', clientId: '你的客户端ID', redirectUri: `${window.location.origin}/login/callback`, scopes: ['openid', 'profile', 'email'], pkce: true });
修改后重启应用即可解决重定向失效问题。
内容的提问来源于stack exchange,提问作者yush
相关产品推荐
相关产品推荐

