我一直在尝试将 Keycloak 集成到一个简单的节点/快速服务器中,以便我可以使用标头中的不记名令牌进行身份验证,但我发出的每个受保护请求都返回 html(登录页面)。
我的简单 index.js 文件:
const express = require('express');
const app = express();
const keycloak = require('./kc-config.js').initKeycloak();
app.use(keycloak.middleware());
app.get('/', (req, res) => {
res.send("Server is up!");
});
app.get('/kc-test', keycloak.protect(), (req, res) => {
res.send('success');
} )
app.listen(3000);
我的简单 kc-config.js 文件
var session = require('express-session');
var Keycloak = require('keycloak-connect');
let _keycloak;
var keycloakConfig = {
clientId: 'myclient',
bearerOnly: false,
serverUrl: 'http://my.client.com:4008/auth',
realm: 'master',
credentials: {
"secret": "{my-secret}"
}
};
function initKeycloak() {
if (_keycloak) {
console.warn("Trying to init Keycloak again!");
return _keycloak;
}
else {
console.log("Initializing Keycloak...");
memoryStore = new session.MemoryStore();
_keycloak = new Keycloak({ store: memoryStore }, keycloakConfig);
return _keycloak;
}
}
function getKeycloak() {
if (!_keycloak){
console.error('Keycloak has not been initialized. Please called init first.');
}
return _keycloak;
}
module.exports = {
initKeycloak,
};
我正在使用从这个 curl 请求返回的令牌:
curl -X POST 'http://my.client.com:4008/auth/realms/master/protocol/openid-connect/token'
--header 'Content-Type: application/x-www-form-urlencoded'
--data-urlencode 'grant_type=password'
--data-urlencode 'client_id=myclient'
--data-urlencode 'client_secret=mysecretkey'
--data-urlencode 'username=myusername'
--data-urlencode 'password=mypassword'
我不应该被授权吗?为什么即使我的令牌有效,它也会要求我再次登录?
有关更多信息,这是我在 keycloak 管理控制台上为我的客户端设置的屏幕截图。
我很困惑。我使用它完全错误吗?我的想法是,我可以简单地将 curl 请求中的令牌放入受保护 /kc-test 路由的请求的标头中。