Интеграция NodeJs и Keycloak дает 403?
Я только что взял демонстрационный код с этого Github,
поэтому я изменилkeycloak-config.json
var keycloakConfig ={
clientId: 'my-api',
bearerOnly: true,
serverUrl: 'https://<IPADDRESS>:8443/auth/',
realm: 'myrealm',
credentials: {
secret: '99e71ca7-f25b-40b5-87ed-0af2656b52ac'
}
};
Теперь, чтобы сначала получить доступ к конечной точке api, я сгенерирую токен
С помощью указанного выше токена я пытаюсь получить доступ к безопасному API
Но он выйдет из строя с ошибкой
403: Доступ запрещен
Вот код
router.get('/user', keycloak.protect(), function(req, res){
res.send("Hello User");
});
Даже это тоже дает то же самое
router.get('/user', keycloak.protect('user'), function(req, res){
res.send("Hello User");
});
Я перешел по этой ссылке для этого демонстрационного кода
4 ответа
После того, как я нашел решение, я также увидел комментарий, мое решение и комментарий совпали, поэтому мы должны внести следующие изменения вместо credentials
мы должны использовать realmPublicKey
var keycloakConfig ={
clientId: 'my-api',
bearerOnly: 'true',
serverUrl: 'https://<IPADDRESS>:8443/auth/',
realm: 'myrealm',
sslRequired: 'external',
realmPublicKey: 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhGpeNPTzIA0SpqWtOU27C3lCdHkLzWiYc3voiBZvvZdvk4wW96JymHlX2b0weDnkYfurxIRehRA0sLK8w2vjb3X9TdKOcsiQzHlWDQuA3Wu7WeDGcvv8dyDk+bMOSkqn7bMlOUm6CXxA7RrjKuDj8mseqabXNjnPgAPL6MQOWtO4RFMdPQX11fYShXrK9ELS3CqN3RrXBazzwNsreKxfuMtR4vtZCVJHYaZZMiLmWU1G5Xsh/tHje2AVLPkt3ncchyKsrkCdP9PWsYK5dMkKsDbA03JOq7azDDlhqgT2pUNB3dZ1b9sKQXqPC6ZSieVJcm6WAj8DJcjoYOgZjgm2/8X1fwIDAQAB',
};
Просто добавляю то, что написал @Evil_skunk
у вас есть дополнительные ошибки на стороне nodejs? в противном случае я могу просто догадаться;-) вы получаете доступ к keycloak через https, доверяет ли используемый сертификат nodejs? если вы отправляете access_token в nodejs, этот токен необходимо проверить с помощью открытого ключа области. этот ключ обычно получается из kc-ednpoint, возможно, в вашем случае это невозможно
В переменной конфигурации KeyCloack вы можете использовать credentials
и нет realmPublicKey
.
ИзменитьbearerOnly
возможностьfalse
var keycloakConfig = {
clientId: "nodejs-microservice",
bearerOnly: false,
serverUrl: "http://localhost:8083/auth",
realm: "Demo-Realm",
credentials: {
secret: "8ZkObGg73gr26TtAPE9TKVC7QmQikNMx",
},
};
У меня та же проблема. Также использовал пример кода отсюда
Единственная корректировка примера кода — создание сеанса. здесь всегда было сообщение об ошибке с кодом примера.
Мой код:
index.js:
// index.js
var express = require('express');
var app = express();
const cors = require('cors');
app.use(cors());
const session = require('express-session');
const memoryStore = new session.MemoryStore();
app.use(session({
secret: 'some secret',
resave: false,
saveUninitialized: true,
store: memoryStore
}));
const keycloak = require('./config/keycloak-config.js').initKeycloak(memoryStore);
app.use(keycloak.middleware({
logout: '/logout',
admin: '/'
}));
const testController = require('./controller/test-controller.js');
app.use('/test', testController);
app.get('/', function (req, res) {
res.send("Server is up!");
});
app.listen(3000);
keycloak-config.js:
// keycloak-config.js
var session = require('express-session');
var Keycloak = require('keycloak-connect');
let _keycloak;
var keycloakConfig = {
clientId: 'test-client',
bearerOnly: true,
serverUrl: 'http://localhost:8080/auth',
realm: 'test',
credentials: {
secret: 'xS9K7RpUah5PzWQZh6BaAGX8Ochr6RY6'
}
};
function initKeycloak(memoryStore) {
if (_keycloak) {
console.warn("Trying to init Keycloak again!");
return _keycloak;
}
else {
console.log("Initializing Keycloak...");
_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,
getKeycloak
};
тест-controller.js:
// test-controller.js
var express = require('express');
var router = express.Router();
const keycloak = require('../config/keycloak-config.js').getKeycloak();
router.get('/anonymous', function(req, res){
res.send("Hello Anonymous");
});
router.get('/user', keycloak.protect('user'), function(req, res){
res.send("Hello User");
});
router.get('/admin', keycloak.protect('admin'), function(req, res){
res.send("Hello Admin");
});
router.get('/all-user', keycloak.protect(['user','admin']), function(req, res){
res.send("Hello All User");
});
module.exports = router;