我正在实现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');
});
答案 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');
});