«Ошибка 500: невозможно обменять код для предоставления в режиме только на предъявителя» после успешного входа в браузер в Keycloak - PullRequest
0 голосов
/ 27 сентября 2018

Пользователь пытается получить доступ к / hello url в браузере через обратный прокси-сервер.

"500 Ошибка: невозможно обменять код для предоставления в режиме только канала-носителя"

Ошибка появляется после успешного входа пользователя на странице входа Keycloak при доступе к защищенному URL.

Следующий код используется в обратном прокси:

var Keycloak = require('keycloak-connect');
var session = require('express-session');
var memoryStore = new session.MemoryStore();

let keycloak = new Keycloak(memoryStore);
app = express();
app.use( keycloak.middleware() );
app.get( '/hello', keycloak.protect( 'realm:admin' ));

keycloak.json:

{
  "realm": "master",
  "auth-server-url": "https://127.0.0.1/auth",  
  "resource": "test_ui",
  "confidential-port": 0,  
  "credentials" : {
    "password" : "d31c4718-12e9-407b-9bf2-cb72734a23f0"
  }
}

клиент test_ui является конфиденциальным.Добавление bearer-only : true к keycloak.json приводит к ошибке отказа в доступе вместо вышеуказанной ошибки.

Что не так с конфигурацией?

1 Ответ

0 голосов
/ 07 октября 2018

Прежде всего: ваш keycloak.json config и node.js keycloak.protect код приложения не выровнен:

  • keycloak.json описывает "realm":"master"
  • Но вы вызываетеkeycloak.protection в ресурсе GET /hello вашего приложения только для admin царства: app.get( '/hello', keycloak.protect( 'realm:admin' ));

ПОПРОБУЙТЕ ИЗМЕНИТЬ ЦЕНУ ДЛЯ МАСТЕРА

app.get( '/hello', keycloak.protect( 'realm:master' ));

ВЫ МОЖЕТЕ ПРОВЕРИТЬ, ЕСЛИ ЭТО РАБОТАЕТ, ИСПОЛЬЗУЯ cURL

curl -i http://YOUR_APP_SERVER_HOST/hello -H "Authorization: Bearer YOUR_BEARER_TOKEN"

НЕ ЗАБУДЬТЕ НАСТРОИТЬ АУТЕНТИФИКАЦИЮ БЕЗОПАСНОСТИ НА КЛЮЧЕВОЙ ПУЧКЕ

https://www.keycloak.org/docs/3.1/authorization_services/topics/enforcer/keycloak-enforcement-bearer.html

И ПОЛУЧИТЕ ВАШ ПЕРВЫЙ ЖЕЛЕЗНЫЙ ПЕРВЫЙ

curl \
  -d 'client_id=YOUR_KEYCLOAK_CLIENT' \
  -d 'username=YOUR_USERNAME' \
  -d 'password=YOUR_PASSWORD' \
  -d 'grant_type=password' \
  'https://YOUR_KEYCLOAK_SERVER_HOST/auth/realms/YOUR_REALM/protocol/openid-connect/token'

СЕЙЧАС, ЛИТЕРАТУРА

То, что происходит здесь, по сути:

  • По первому вашему запросу: вы пытаетесь получить доступ к функциональности, которая требует носителяаутентификация по токену, но вместо этого вы используете код обмена привилегиями.Отсюда и ошибка 500 ответа.Вы сначала аутентифицируетесь на своей конечной точке службы аутентификации keycloak /auth, используя свои учетные данные пользователя, чтобы получить действительный токен Bearer для этой области?Или же вы, наоборот, по ошибке пытаетесь использовать свои учетные данные пользователя для аутентификации непосредственно против конечной точки ресурса приложения GET /hello API вместо этого?

  • Затем по второму запросу вы пытаетесьвключение аутентификации только на предъявителя, но:

    1. Ваш клиент не проверяет предоставленный ответный заголовок WWW-Authenticate для определения необходимого метода аутентификации и, что наиболее важно:
    2. Ваш клиентне выдает новый запрос GET /hello, содержащий действительный заголовок HTTP Authorization с полученным токеном на предъявителя, действительным для назначенной области GET /hello .Поэтому вы просто получаете ответ об ошибке аутентификации HTTP (обычно 401 Unauthorized ответ HTTP, хотя вместо него иногда используется 403 Forbidden ).

Короче говоря, вам нужно выровнять схему области и аутентификации на клиентском и серверном приложении и конфигурации сервера аутентификации, так:

  • Конечная точка сервера приложений GET /hello отправит HTTP-заголовок WWW-Authenticate с указанием требуемой области пользователя и схемы аутентификации.

  • Затем ваш клиент будет использовать предоставленные учетные данные пользователя для аутентификации на вашем сервере аутентификации keycloak и получения токена Bearer.

Вы должны настроить сервер аутентификации keycloak для поддержки требуемой схемы аутентификации для этой области, и у пользователя должны быть разрешения для работы в этой области.Для этого проверьте административную консоль сервера keycloak.

  • Наконец, как только это будет сделано для этой области и схемы аутентификации, ваш клиент сможет выдатьGET /hello запрос к вашему серверу приложений, содержащий полученный токен HTTP Bearer в заголовке HTTP Authorization.Пример cURL:

    curl -i http://example.com/api/hello -H "Авторизация: Носитель mytoken123"

Для получения дополнительной информации:

...