我在我的 Angular 5 应用程序中使用 keycloak JavaScript 适配器,虽然我的登录和重定向工作正常,但问题是每当我刷新我的 ng 应用程序时,它都会再次要求 keycloak 登录,尽管我看到我的会话在 /auth/ 上仍然处于活动状态领域/{镜像领域名称}/帐户。
正如我从 keycloak JS 适配器文档中理解的那样 https://www.keycloak.org/docs/3.0/securing_apps/topics/oidc/javascript-adapter.html,当 onLoad 设置为 init 需要登录时如果用户登录到 Keycloak,它会对客户端进行身份验证,如果没有,则显示登录页面。但就我而言,似乎需要一秒钟才能将我注销,因为它总是将我重定向到 keycloak 的登录页面。
您需要将上次登录时保存的令牌传递给 keycloak 初始化构造函数。如果您使用授权流程(标准),则也刷新令牌。像这样。
// load previous tokens, saved after successful login of keycloak success callback
const token = localStorage.getItem('kc_token');
const refreshToken = localStorage.getItem('kc_refreshToken');
// pass to keycloak init
keycloak.init({ onLoad: 'login-required', token, refreshToken }).then(
success=>{
localStorage.setItem('kc_token', keycloak.token);
localStorage.setItem('kc_refreshToken', keycloak.refreshToken);
//load your app from here
});
Tl;dr:在我的代码中,有几个原因导致 init 函数没有使用参数第二次调用。小心这一点!
Fwiw,我遇到了类似的问题,在我看来我解决了这个问题(暂时)。除了 @ahmadalibaloch 的答案(将已知的令牌传递给 init)之外,我在这里遵循了这个简洁的指南:https://dev.to/matejbucek/secure-svelte-with-keycloak-42g3(对于不过 svelte-kit),其中 checkParams 函数检查重定向 url 以再次调用 init 函数(使用令牌)。
有两件事导致我的代码出现故障,您可以查找并尝试修复,这是由重定向网址中的自定义搜索参数引起的,如下所示:
mypage.tld/foo?myparam=0#keycloak-redirect-params
这样,checkParams函数就无法正常工作了。而且,
myparam=0
被用作备用访问字符串(想想链接共享),所以我的代码在准备好之前放弃了keycloak(第二次),即init函数没有再次调用,而是使用了搜索参数。我的建议:如果其他答案还不够,请尝试找出为什么 init 函数没有按应有的方式再次调用。
我知道这是非常具体的,但(对我来说)很难发现这一点,所以也许它有帮助。
您需要登录
keycloak
客户端,选择领域,导航到侧边栏上的 AUTHENTICATION
选项卡,选择 FLOW
菜单选项卡,然后将 Cookie 设置更改为备用或必需。
keycloak js 仅存储在内存中。他们出于安全原因做出了选择。
但问题是它不具备刷新或新选项卡的弹性。
因此,如果您想保持弹性,有两种可能的方法
OWASP 推荐使用 sessionStorage (https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/JSON_Web_Token_for_Java_Cheat_Sheet.md#token-storage-on-client-side) 比之前的 storageLocale 更受限制
您还可以关注这篇大文章,其中包含一个很好的风险矩阵,其中他们推荐 cookie https://thenewstack.io/best-practices-for-storing-access-tokens-in-the-browser/ 缺点是更容易受到网络攻击
但在所有情况下,解决方案都是@ahmadalibaloch 上面的解决方案
但是不要忘记在刷新令牌时更新存储并在注销时清理存储