适用于Node.js REST Api的Keycloak策略实施

时间:2019-05-14 15:15:47

标签: javascript node.js keycloak

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

我打算做什么

(也许我完全错了): 我创建了一个后端(仅node.js Bearer),该后端将提供REST api。部分通过前端(密钥斗篷客户端)或某些设备直接使用。 通常,我尝试创建带有大量CRUD的应用程序。用户管理是在keycloak中完成的,只有我将这些请求转发给admin REST Api。其他东西,例如设备……我存储在一个单独的数据库中。 因此,后端是前端和其他用例的抽象层。

到目前为止,一切都很好,但是从一开始就可以检查天气,请求是否来自经过身份验证的人,因此全部通过keycloak.protect()处理。 但是现在我想提供不同的授权级别(由于多租户的原因可能会有所不同,为什么我要通过策略来解决此问题,并为什么要在客户端配置器内部的admin-console中解决此问题),因为普通用户只能访问某些路由并且管理人员应具有对api的完全访问权限,但当然不需要keycloak管理员访问权限。 因此,我为后端客户端启用了服务帐户,并为该帐户分配了realm-admin角色,以便客户端可以访问所有内容,并且我可以自行处理后端客户端内部的授权(使用admin-中的策略,权限等。安慰)。 (以防万一没人得到我在说什么。Fixing应该可以帮助我解决我认为的问题)

设置

  • 使用express的node.js应用程序
  • 在密钥斗篷admin-console中注册为单个客户端(机密,但代码内部的配置仅承载)
  • Keycloak在docker-container(版本4.5)中运行
  • 所有服务都在docker-compose网络中运行,并且位于通用uri的反向代理后面
  • 在客户端中启用了授权,并将默认策略更改为“否定”,以始终拒绝=>来查看它是否被强制执行)

我的代码


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;

我的问题

我不了解如何使用自己在后端自己的管理控制台中创建的策略,权限和公司。如何执行这些要求? 我尝试检查其他示例和文档,但可以使其正常运行。 我发现的最后一件事是删除了授权api,但是将一个策略执行器添加到了nodejs适配器。在documentation for the policy-enforcer中找不到中间件(keycloak.enforcer({})Link1 Link2的文档。

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

我也没有得到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-connect库中使用调试来逐步完成授权操作。