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

oidc-react调用signOut后无法终止Amazon Cognito会话问题

问题

技术栈:oidc-react、Amazon Cognito

调用auth.signOut();登出后,页面会重定向到登录页,但再次调用auth.signIn();时,会携带已有token向Cognito发起请求,无需输入凭证即可自动登录。推测是用户仍持有有效会话及token,只有60分钟会话过期后才会要求输入登录凭证。

希望登出后Cognito强制要求用户输入凭证,已尝试添加以下配置但无效:

revokeTokenTypes: (["access_token", "refresh_token"]),
revokeTokensOnSignout: true,
automaticSilentRenew: false,
monitorSession: true

当前传递给提供者的OIDC配置如下:

const oidcConfig: AuthProviderProps = {
    onSignIn: (user: User | null) => {
        console.log("onSignIn");
    },
    onSignOut: (options: AuthProviderSignOutProps | undefined) => {
        console.log('onSignOut');
    },
    autoSignIn: false,
    loadUserInfo: true,
    postLogoutRedirectUri: "localhost:3000/",
    automaticSilentRenew: false,
    authority: "https://" + process.env.REACT_APP_AWS_COGNITO_DOMAIN,
    clientId: process.env.REACT_APP_AWS_COGNITO_CLIENT_ID,
    redirectUri: window.location.origin,
    responseType: 'code',
    userManager: new UserManager({
        authority: "https://" + process.env.REACT_APP_AWS_COGNITO_DOMAIN,
        client_id: process.env.REACT_APP_AWS_COGNITO_CLIENT_ID!,
        redirect_uri: window.location.origin,
        revokeTokenTypes: (["access_token", "refresh_token"]),
        revokeTokensOnSignout: true,
        automaticSilentRenew: false,
        monitorSession: true
    })
};

解决方案

1. 登出时传入prompt: 'login'参数

调用auth.signOut()时添加参数,强制Cognito清除全局会话,避免后续自动登录:

auth.signOut({
  prompt: 'login'
});

2. 修正postLogoutRedirectUri配置

当前配置的postLogoutRedirectUri缺少协议头,正确格式需要包含http/https,建议直接用window.location.origin拼接:

postLogoutRedirectUri: `${window.location.origin}/`,

同时要确保这个URL已经添加到AWS控制台中Cognito用户池的应用客户端注销URL列表里(路径:用户池 → 应用集成 → 应用客户端设置)。

3. 处理令牌撤销无效问题

Cognito的令牌撤销功能需要满足前置条件:

  • 应用客户端必须开启客户端密钥(在应用客户端设置中勾选"生成客户端密钥")
  • oidc-react的revokeTokensOnSignout依赖客户端密钥才能正常调用Cognito的令牌撤销接口

如果不想启用客户端密钥,可在登出后手动清除本地存储的OIDC相关数据:

// 清除oidc-react存储的用户状态
await userManager.clearStaleState();
// 删除本地存储和会话存储中的用户数据
const storageKey = `oidc.user:${process.env.REACT_APP_AWS_COGNITO_DOMAIN}:${process.env.REACT_APP_AWS_COGNITO_CLIENT_ID}`;
localStorage.removeItem(storageKey);
sessionStorage.removeItem(storageKey);

4. 触发完整的OIDC注销流程

直接调用UserManager的signoutRedirect方法,触发标准OIDC的endSession流程,彻底清除Cognito端的用户会话:

await userManager.signoutRedirect({
  post_logout_redirect_uri: `${window.location.origin}/`
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:00:57