在 DOMAIN 上运行的单页应用程序 (SPA) 上,对 DOMAIN/graphql 的调用被重新路由到后端。前端和后端都通过 Keycloak Gatekeeper 实例进行保护。
这个想法是前端和后端共享kc-access
令牌。
现在,访问令牌在后端 Gatekeeper 中过期。如果 SPA 在浏览器中刷新,则前端将重新路由到 Keycloak,并且需要新的访问令牌。但是,如果没有刷新,当令牌过期时,对 DOMAIN/graphql 的 POST 请求会失败并返回 307 状态码。浏览器不知道如何处理。浏览器日志记录提供"{"error":"RESTEASY003065: Cannot consume content type"}"
. 如果 POST 的内容类型标头被删除,则错误为“未提供 client_id”,而 client_id 包含在查询字符串中。
将 POST 请求重定向到 Keycloak 可能不是最好的解决方案。如果后端刷新其访问令牌本身,则更清洁。
这就是我们通过将会话状态存储添加到后端的 Gatekeeper 来尝试的。我们正在使用以下配置:
- --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
这确实在 Gatekeeper 中创建了一个 /boltdb 文件,但它似乎没有被使用,因为该文件没有更改。
后端的 Gatekeeper 提供以下日志记录:
|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"}|
所以我们“无法找到用户的刷新令牌”,因为根据日志记录“没有找到会话状态”。
有人知道如何启用令牌刷新吗?