Интеграция 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;
Другие вопросы по тегам