Запросы Node Keycloak возвращают логин даже с токеном-носителем

Я пытался интегрировать Keycloak в простой сервер node/express, чтобы я мог аутентифицироваться с помощью токена-носителя в заголовке, но каждый защищенный запрос, который я делаю, возвращает 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 -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 в заголовок запроса для маршрута protected / kc-test.

2 ответа

Когда вы измените тип доступа на «Только носитель» в настройках вашего клиента, вы получите хороший 403. Имейте в виду, что это не позволит выполнять какие-либо запросы без действительного токена носителя (например, получение самого токена).

Альтернативой является установка типа доступа на «конфиденциальный» в настройках вашего клиента и установка"bearerOnly": trueв вашейkeycloak.json(или keycloakConfig в вашем случае).

Несущим должен быть только тип доступа клиента.

      {
  "realm": "camunda",
  "auth-server-url": "https://localhost:9000/auth/",
  "ssl-required": "external",
  "resource": "user-management",
  "bearer_only":true,
  "credentials": {
    "secret": "45078604-3c4a-44a6-8a0f-ab094f050211"
  },
  "confidential-port": 0,
  "policy-enforcer": {}
}

или вы можете установить bearer_only в true в файле keycloak.json

Другие вопросы по тегам