使用keycloak的安全Node.js后端API

时间:2019-08-20 13:56:35

标签: node.js keycloak keycloak-services

我正在实现Nodejs后端API。其中一些需要在访问之前进行身份验证。为此,我选择keycloak服务器作为身份服务器。我使用npm keycloak-connect库来集成节点服务器和keycloak服务器。 现在身份验证正常。

问题是当我使用' http://localhost:8080/auth/realms/test-realm/protocol/openid-connect/logout '这个API从密钥隐藏服务器注销时。 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');
});

2 个答案:

答案 0 :(得分:0)

您的应用程序使用Express,该Express维护其自己的会话并与Keycloak令牌进行同步。因此,在Keycloak上注销不会告诉Express您已注销。随后,您仍然可以登录到您的应用程序。

在您的代码中,您已指定以下内容:

app.use( keycloak.middleware( { logout: '/logout'} ));

要在Express应用程序中注销的应用程序上的URL。使用它而不是直接注销Keycloak。然后,密钥库中间件将在密钥库中注销。就像

http://localhost:4000/logout

答案 1 :(得分:0)

我认为您应该在此之前先使用app.use( keycloak.middleware( { logout: '/logout'} ));

app.listen(4000, function () {
  console.log('Listening at port:4000');
});