java - 使用 Webfilter 时 Keycloak 刷新过期 token

标签 java jboss keycloak openid-connect keycloak-services

我面临一个问题,我认为我的访问 token 需要一个滑动的到期时间。我正在 glassfish 服务器上运行,使用 org.keycloak.adapters.servlet.KeycloakOIDCFilter 来检查所有请求。我设置的过滤器检查 AccessToken 并通过确保 token 未过期来询问访问权限:

KeycloakSecurityContext kc = (KeycloakSecurityContext) req
            .getAttribute(KeycloakSecurityContext.class.getName());

AccessToken token = RSATokenVerifier.create(kc.getIdTokenString()).getToken();
if(token.isExpired()) {
  response.redirect("logout url");
}

这很好用。然而,在我的应用程序中,我有一些屏幕,用户可以在其中花费长达一个小时的时间输入信息,在完成提供糟糕的用户体验之前,他们可能会被踢出。还有一些情况是进行 ajax 调用并将响应设置为重定向到注销页面,从而导致不良行为。

我确实认为我需要始终检查过期情况,但我不确定如何在过期时请求新 token 。我很感激我能得到的任何帮助。谢谢!

这些是我的 token 设置 enter image description here

最佳答案

您还需要有权访问刷新 token 。一旦访问 token 过期,您就无能为力。我将在下面留下我们应用程序中的一个示例。

URL url = new URL(keycloakRootURL + "/realms/" + realmName + "/protocol/openid-connect/token");
        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();

        conn.setRequestProperty("Authorization", "Basic " + clientSecret);
        conn.setReadTimeout(10000);
        conn.setConnectTimeout(15000);
        conn.setRequestMethod("POST");
        conn.setDoInput(true);
        conn.setDoOutput(true);
        String data = "grant_type=refresh_token&refresh_token=" + refreshToken;
        try (OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(os, "UTF-8"))) {
            writer.write(data);
            writer.flush();
        }

        conn.connect();
        StringBuilder responseStr;
        try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
            String inputLine;
            responseStr = new StringBuilder();
            while ((inputLine = in.readLine()) != null) {
                responseStr.append(inputLine);
            }
        }
        Object obj = parser.parse(responseStr.toString());
        JSONObject result = (JSONObject) obj;

        accessCreationTime = System.nanoTime();
        return (String) result.get("access_token");

关于java - 使用 Webfilter 时 Keycloak 刷新过期 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49778416/

相关文章:

java - Fruchterman 和 Reingold 算法顶点在输出中占据相同位置(图形布局)

Java循环根据整数值和字母字符输出模式

jboss - 为什么 JBoss/wildfly BOM 不包含所有提供的模块?

JBoss 中的 SSL session 恢复

java.lang.IllegalStateException :Current user principal is not of type when i try to integrate keycloak with spring boot web + spring security project

jwt - Keycloak - 通过 OIDC 端点检索 JWT token

java - 为什么 write() 控制台输出返回一个字符

mysql - 更新 JPA 实体因空值而失败

angularjs - Keycloak + AngularJS : persist URL hash fragments after login redirect url

java - 如何在 editText 中禁用 "copy/cut/paste/"工具栏,但仍然有光标选择一些文本?