【问题标题】:Keycloak Policy Enforcing for nodejs REST Api用于 nodejs REST Api 的 Keycloak 策略实施
【发布时间】:2019-05-14 15:15:46
【问题描述】:

第一次在这里问问题,如果我忘记提供一些信息或任何其他错误,请原谅.. 对不起文字墙。

简而言之,我想做什么

(也许我完全错了): 我创建了一个提供 REST api 的后端(仅限 node.js Bearer)。部分通过前端(keycloak-clients)或直接由某些设备使用。 一般来说,我尝试创建一个包含大量 CRUD 的应用程序。用户管理在 keycloak 中完成,只有我将这些请求转发给管理员 REST Api。其他东西,比如设备……我存储在一个单独的数据库中。 所以后端是前端和其他用例的抽象层。

到目前为止一切都很好,但是一开始就足以检查请求是否来自经过身份验证的人,因此所有处理都通过 keycloak.protect() 来自经过身份验证的人的令牌已通过 但是现在我想提供不同的授权级别(由于多租户的原因可能会有所不同,为什么我想通过客户端配置中的管理控制台中的策略和合作来解决这个问题)因为普通用户只能访问一些路由并且管理层应该拥有对 api 的完全访问权限,但当然不需要 keycloak 管理员访问权限。 因此,我为我的后端客户端启用了服务帐户,并为这个帐户赋予了领域管理员角色,因此客户端可以访问所有内容,并且我可以自己处理后端客户端内部的授权(使用策略、权限、......安慰)。 (以防万一没有人明白我在说什么。Fixing 应该可以帮助我解决我的问题)

设置

  • 使用 express 的 node.js 应用程序
  • 在 keycloak 管理控制台中注册为单个客户端(机密,但代码中的配置仅限承载)
  • Keycloak 在 docker-container(4.5 版)中运行
  • 所有服务都在 docker-compose 网络中运行,并且位于公共 uri 的反向代理之后
  • 在客户端启用授权并将默认策略更改为 Negative 以始终拒绝 => 以查看是否强制执行)

我的代码


app.js

const express = require('express');
const app = express();
const Keycloak = require('keycloak-connect');
const session = require('express-session');
const routes = require('./routes/index');


const kcConfig = {
    'realm': 'master',
    'bearer-only': true,
    'auth-server-url': `https://DOMAIN/auth`,
    'ssl-required': 'all',
    'resource': 'fm-backend',
    'credentials': {
        secret: 'SOME_SECRET',
    },
    'confidential-port': 0,
    'policy-enforcer': {   //tried with an without this, changed nothing
        'enforcement-mode': 'ENFORCING',
    },
};

const memoryStore = new session.MemoryStore();
const keycloak = new Keycloak({ memoryStore }, kcConfig);

app.use(keycloak.middleware({ logout: '/api/logout', protected: '/api/gates' }));

// used before, worked for well for authentication
app.use('/api', keycloak.protect(), routes);

// now unfortunately I don't understand how to use keycloak.enforcer() middleware
app.use('/api', keycloak.enforcer({WHAT_COMES_HERE}), routes);

module.exports = app;

我的问题

我不明白如何使用我在后端内部的管理控制台中创建的策略、权限和 Co。我如何强制使用这些? 我试图检查不同的示例和文档,但可以让它工作。 我发现的最后一件事是删除了权利 api,但在 nodejs 适配器中添加了一个策略执行器。在documentation for the policy-enforcer 中找不到中间件的文档 (keycloak.enforcer({})) Link1 Link2

任何帮助表示赞赏:)

【问题讨论】:

  • 有时对于开源项目,您必须深入研究他们的示例才能找到“文档”:github.com/keycloak/keycloak-nodejs-connect/blob/master/example/…
  • 这实际上是我引用的问题的最后一个链接。不幸的是,对于我的例子,我没有得到这个工作。我不确定这是否与第 75 行中的中间件配置 protected: '/protected/resource' 有关。我在任何地方都找不到该行在做什么。另一个像注销路由等是 documentend 或者我可以在 SourceCode 中找到它。但是定义了受保护的选项,但我不明白为什么。

标签: javascript node.js keycloak


【解决方案1】:

我也没有 100% 了解它,但我对执行器的实现是这样的:

const resource = 'MyProtectedResource';
const scope = 'myScope'; // for example read
const permission = resource + ':' + scope;
keycloak.enforcer(permission, { response_mode: 'token' }); // for your config: app.use('/api', keycloak.enforcer(permission, {response_mode: 'token' }, routes};

我在 keycloak 管理控制台中为该客户端设置了资源、范围、策略和权限(在“授权”选项卡下)。您可以在 keycloak 中使用评估选项卡来查看资源/范围/策略/权限如何相互作用。

我使用 keycloak 进行编码的方法是在实际的 keycloak-connect 库中使用调试来逐步完成授权正在执行的操作。

【讨论】:

    猜你喜欢
    • 2017-12-04
    • 2017-08-15
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2011-10-05
    • 1970-01-01
    相关资源
    最近更新 更多