使用 keycloak 保护节点 js 后端 API
Posted
技术标签:
【中文标题】使用 keycloak 保护节点 js 后端 API【英文标题】:Secured nodejs backend API's using keycloak 【发布时间】:2019-12-25 18:28:29 【问题描述】:我正在实现一个 Nodejs 后端 API。其中一些需要在访问之前进行身份验证。为此,我选择 keycloak 服务器作为身份服务器。我使用 npm keycloak-connect 库来集成节点服务器和 keycloak 服务器。 现在身份验证工作正常。
问题是当我使用 'http://localhost:8080/auth/realms/test-realm/protocol/openid-connect/logout' 这个 API 从 keycloak 服务器注销时。 keycloak 服务器说令牌不再有效。但是当我使用相同的方式访问节点服务器时,它会将该令牌作为有效令牌。
'use strict';
const Keycloak = require('keycloak-connect');
const express = require('express');
var cors = require('cors')
const app = express();
app.use(cors())
var keycloakConfig =
"realm": "test-realm",
"auth-server-url": "http://localhost:8080/auth",
"ssl-required": "external",
"resource": "test-dev-api",
"public-client": true,
"confidential-port": 0
var keycloak = new Keycloak(,keycloakConfig);
app.use( keycloak.middleware( logout: '/logout' ));
app.get('/secured-echo', keycloak.protect(), function(req,resp)
resp.send("Secured Hello");
);
//unprotected route
app.get('/echo', function(req,resp)
console.log(keycloakConfig)
console.log(keycloak)
resp.json("say": "hello");
);
app.listen(4000, function ()
console.log('Listening at port:4000');
);
【问题讨论】:
【参考方案1】:您的应用程序使用 Express,它维护自己的会话并将其与 Keycloak 令牌同步。所以在 Keycloak 上登出并不会告诉 Express 你已经登出。随后您仍然可以登录到您的应用程序。
在你的代码中你已经指定了这个:
app.use( keycloak.middleware( logout: '/logout' ));
在您的 Express 应用程序中注销的应用程序的 URL 是什么。使用它而不是直接注销 Keycloak。然后,keycloak 中间件将在 Keycloak 中注销。会是这样的
http://localhost:4000/logout
【讨论】:
【参考方案2】:我觉得你应该先用app.use( keycloak.middleware( logout: '/logout' ));
这个
app.listen(4000, function ()
console.log('Listening at port:4000');
);
【讨论】:
以上是关于使用 keycloak 保护节点 js 后端 API的主要内容,如果未能解决你的问题,请参考以下文章
Keycloak,如何保护不提供网页的 Spring Boot 后端?
CORS 问题 - 使用 Keycloak 保护 ReactJS 前端和 JAX-RS 后端
通过 REST 与 Keycloak 保护的后端进行后端到后端通信
如何使用 Keycloak 保护 Angular 8 前端和使用网关、eureka 的 Java Spring Cloud 微服务后端