在运行于域上的单页面应用程序(SPA)上,对域/graphql的调用被重新路由到后端。前端和后端都通过Keycloak Gatekeeper实例进行保护。
其想法是前端和后端共享kc-access令牌。
现在,访问令牌在后端网守中过期。如果在浏览器中刷新了SPA,则前端将重新路由到Keycloak,并且需要新的访问令牌。但是如果没有刷新,则当令牌过期时,向域/graphql发出的POST请求将失败,并显示307状态代码。浏览器不知道如何处理此问题。浏览器日志记录给出了一个"{"error":"RESTEASY003065: Cannot consume content type"}"。如果删除帖子的内容类型标头,则错误为"no client_id provided",而client_id包含在查询字符串中。
将POST请求重定向到Keycloak可能不是最好的解决方案。如果后端刷新它的访问令牌本身,就会变得更干净。
这就是我们通过向后端的网守添加会话状态存储来尝试的方法。我们使用以下配置:
- --discovery-url=DISCOVERY_URL
- --client-id=CLIENT_ID
- --client-secret=****
- --enable-refresh-tokens=true
- --encryption-key=0123456789012345
- --store-url=boltdb:///boltdb
- --listen=0.0.0.0:3001
- --verbose=true
- --redirection-url=REDIRECTION_URL
- --upstream-url=http://127.0.0.1:3000这将在网守中创建一个/boltdb文件,但似乎没有使用该文件,因为该文件没有更改。
后端的网守提供以下日志记录:
|1.5716729131430433e+09|debug|keycloak-gatekeeper/session.go:51|found the user identity|{"id": "b5b659cd-148e-4f23-bf2f-28e6f207f6c7", "name": "piet", "email": "", "roles": "offline_access,dashboard_viewer,uma_authorization,account:manage-account,account:manage-account-links,account:view-profile", "groups": ""}|
|1.5716729131462774e+09|info|keycloak-gatekeeper/middleware.go:154|accces token for user has expired, attemping to refresh the token|{"client_ip": "****", "email": ""}|
|1.5716729131463811e+09|error|keycloak-gatekeeper/middleware.go:161|unable to find a refresh token for user|{"client_ip": "**", "email": "", "error": "no session state found"}|因此,我们“无法找到用户的刷新令牌”,因为根据日志记录,“找不到会话状态”。
有人知道如何启用令牌刷新吗?
发布于 2019-10-24 18:46:33
通过在前端的网守中使用相同的加密密钥来设置enable-refresh-tokens=true,设计就能正常工作。
用户检索前端并被重定向到Keycloak。在那里获得授权码。前端网守将此授权码交换为访问和刷新令牌,并将其放入前端的cookie中。当使用过期的访问令牌调用后端时,刷新令牌将被解密并用于获取新的访问令牌。
刷新令牌可以过期或无效。当401返回时,前端应该刷新页面,以便将用户重定向到Keycloak。
更安全的做法是将令牌存储在共享存储中,而不是存储在前端cookie中。
发布于 2019-10-22 04:42:00
它看起来不像是一个好的设计。Keycloak Gatekeeper使用授权码流,正如您已经发现的那样,这不是SPA的最佳流(在SPA情况下,读取Gatekeeper提供的用户标识似乎非常麻烦)。
SPA使用具有PKCE或隐式流的代码流,并且这些流使用静默令牌续订(而不是刷新令牌)。最好的选择是在前端(SPA)和后端(例如API)使用相同的客户端id。但是前端将由PKCE的代码流保护,并且它将处理自己的令牌更新。只有后端会受到网守的保护(+ --no-redirects设置对于API保护有意义)
https://stackoverflow.com/questions/58490152
复制相似问题