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
相关产品推荐
相关产品推荐

