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 grant
为mydemoapp-client
。它有效!
【讨论】:
嗨@jirmed,知道如何将此流程更改为direct grant
。我在您提到的链接中找不到此信息。如果您能够通过此实现 SSO,您能否解释/回答?
嗨@A.K.47,该开关在 Cliints/Settings 中可用。工具提示说“这启用了对 DirectAccess Grants 的支持。这意味着客户端可以访问用户的用户名/密码,并直接与 Keycloak 服务器交换访问令牌。就 OAuth2 而言,这支持“资源所有者密码凭据授予”客户。”我不是 Keycloak 方面的专家,但我认为这意味着如果开关处于打开状态,则生成的令牌包括允许其他客户端解码的“资源所有者”。以上是关于Node.js API 受 Keycloak 保护,访问类型为“仅承载”的主要内容,如果未能解决你的问题,请参考以下文章
使用 node.js 的 Keycloak Rest API
在 keycloak 登录后访问被拒绝。我的 keycloak 服务器中没有任何角色