Node.js API 受 Keycloak 保护,访问类型为“仅承载”

Posted

技术标签:

【中文标题】Node.js API 受 Keycloak 保护,访问类型为“仅承载”【英文标题】:Node.js API proteced by Keycloak with Access-Type "bearer-only" 【发布时间】:2021-09-06 08:52:13 【问题描述】:

我是 Keycloak 的新手。我根据文档在 Node.js 中创建了 simples 应用程序:

import express from "express";
import Keycloak from "keycloak-connect";

const keycloak = new Keycloak();
const app = express();
app.use( keycloak.middleware());

app.get('/api', keycloak.protect(), function(req, res)
    res.send("This is API!");
 );
 
app.get('/', function(req, res)
    res.send("Server is up!");
 );
 
 app.listen(3000);

我的keycloak.json 看起来像下面


    "clientId": "mydemoapp-api",
    "bearerOnly": true,
    "serverUrl": "http://mykeycloakserver:8180/auth",
    "realm": "myrealm",
    "realmPublicKey":"MIIBIjANBgk... "

客户端 mydemoapp-api 的访问类型设置为“机密”。使用 Postman 或 CURL,我可以生成令牌,然后使用它访问 entpoint /api。如果我尝试在没有令牌的情况下连接到 /api,我会被拒绝访问 - 到目前为止一切顺利。

我在 Keycloak 管理员中将 mydemoapp-api 的访问类型更改为“仅承载”。然后我在同一个领域 mydemoapp-client 中创建了另一个客户端,访问类型为“public”

我再次使用 Postman 为客户端 mydemoapp-client 请求了一个令牌。然后我使用这个令牌访问端点/api。但我总是被拒绝访问。

从文档中我了解到,如果没有指定角色并且没有激活其他限制,我应该能够登录到领域中的任何客户端,然后使用 SSO 令牌对同一领域中的任何其他客户端进行身份验证。但显然我在拼图中遗漏了一些东西。

【问题讨论】:

请查看github.com/keycloak/keycloak-nodejs-connect/blob/master/example/… 中的示例,我建议您使用 sso 而不是使用 curl。我也没有在您的示例中看到受保护的资源 非常抱歉,我在问题中复制了错误的代码 sn-p。现在已经修复了。我已经安装了引用的示例。我可以登录和注销,但“受保护的资源”链接也返回“访问被拒绝”。 【参考方案1】:

我找到了以下博客https://developers.redhat.com/blog/2020/01/29/api-login-and-jwt-token-generation-using-keycloak#test_your_new_client

它建议将Authentication Flow Overrides/Direct Grant Flow 设置为direct grantmydemoapp-client。它有效!

【讨论】:

嗨@jirmed,知道如何将此流程更改为direct grant。我在您提到的链接中找不到此信息。如果您能够通过此实现 SSO,您能否解释/回答? 嗨@A.K.47,该开关在 Cliints/Settings 中可用。工具提示说“这启用了对 DirectAccess Grants 的支持。这意味着客户端可以访问用户的用户名/密码,并直接与 Keycloak 服务器交换访问令牌。就 OAuth2 而言,这支持“资源所有者密码凭据授予”客户。”我不是 Keycloak 方面的专家,但我认为这意味着如果开关处于打开状态,则生成的令牌包括允许其他客户端解码的“资源所有者”。

以上是关于Node.js API 受 Keycloak 保护,访问类型为“仅承载”的主要内容,如果未能解决你的问题,请参考以下文章

撤销 Keycloak 访问令牌

使用 node.js 的 Keycloak Rest API

在 node.js 中生成受密码保护的 ZIP 文件

在 keycloak 登录后访问被拒绝。我的 keycloak 服务器中没有任何角色

使用 Keycloak 时模拟“生成 API 令牌”的最佳实践

无法在 Node JS 中使用 JWT 访问受保护的路由