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

React应用中oidc-client-js令牌刷新时查询参数不一致问题

问题解决:oidc-client-js刷新令牌时redirect_uri携带旧查询参数

问题背景

使用oidc-client-js 1.11.5管理React应用认证时,首次打开应用的redirect_uri能正确携带当前查询参数跳转,但调用signinRedirect刷新令牌时,始终使用初始化UserManager时的旧查询参数——哪怕用户导航后查询参数已经变化。试过signinRedirectCallback(url)也没能解决问题。

问题根源

你在初始化UserManager时,直接把redirect_uri硬编码成了当时的window.location.search值,这个配置在实例创建后就固定死了。后续用户导航导致查询参数变化时,UserManager实例的配置不会自动更新,所以每次调用signinRedirect都会沿用最初的旧redirect_uri。

解决方案

不要在UserManager初始化时固定redirect_uri,而是每次调用signinRedirect时动态传入最新的redirect_uri参数,覆盖实例的默认配置。

修改后的代码示例

authService.js

保留UserManager的基础配置,只留redirect_uri的基础路径,查询参数后续动态添加:

import { UserManager } from 'oidc-client';

const authServiceConfig = {
  // 其他配置项...
  redirect_uri: `${window.location.origin}/callback`, // 仅保留基础路径
};

const userManager = new UserManager(authServiceConfig);

auth-context-provider.jsx

调用signinRedirect时,生成包含当前最新查询参数的redirect_uri并传入:

useEffect(() => {    
  // 其他逻辑...

  const timeout = setTimeout(() => {
    console.debug('***  Token update');
    setIsLoggedIn(false);
    // 动态生成带当前查询参数的redirect_uri
    const currentRedirectUri = `${window.location.origin}/callback${window.location.search || ''}`;
    userManager.signinRedirect({ redirect_uri: currentRedirectUri });
  }, timeoutDelay);

  // 清理定时器逻辑...
}, [authPayload, search]);

额外说明

如果你的/callback页面需要处理查询参数,无需在signinRedirectCallback中额外传递url——oidc-client-js会自动从当前页面url解析认证信息,只要redirect_uri的基础路径正确即可。

内容的提问来源于stack exchange,提问作者Bart93

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:32:13