Почтальон использует неверный (глупый?) Код в потоке OAuth2 против сервера Keycloak - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь использовать Postman (Версия 7.20.0 - linux 5.5.8-200.fc31.x86_64 / x64) для аутентификации с использованием потока «Код авторизации» OAuth2.0 на сервере Keycloak 9.0.0 при поддержке Google в качестве IdP.

Почтальон отправляет на конечную точку .../token следующее при попытке обменять код для токенов доступа / refre sh:

grant_type:    authorization_code
code:          4/xgFPM8rkZXA1pWguPMHPKg8GS3BrI7whtmSq2U2K4_4Cy62m10y2l3IQp3KuiLRyaLaZWKCUiGJGEWVJ9K4zcTc
redirect_uri:  http://localhost:3002
client_id:     mission-control
client_secret: 3cc09c80-••••-••••-••••-••••••••

Это происходит в Keycloak со следующей ошибкой, подтвержденной в консоли Postman:

POST /auth/realms/test-realm/protocol/openid-connect/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
User-Agent: PostmanRuntime/7.23.0
Accept: */*
Cache-Control: no-cache
Postman-Token: f2cfc8be-a911-4bc6-b5be-dbfab46d3a56
Host: localhost:8080
Accept-Encoding: gzip, deflate, br
Content-Length: 246
Connection: keep-alive
grant_type=authorization_code&code=4%2FxgFPM8rkZXA1pWguPMHPKg8GS3BrI7whtmSq2U2K4_4Cy62m10y2l3IQp3KuiLRyaLaZWKCUiGJGEWVJ9K4zcTc&redirect_uri=http%3A%2F%2Flocalhost%3A3002&client_id=mission-control&client_secret=3cc09c80-••••-••••-••••-••••••••
HTTP/1.1 400
Connection: keep-alive
Cache-Control: no-store
Pragma: no-cache
Content-Type: application/json
Content-Length: 62
Date: Fri, 13 Mar 2020 08:36:02 GMT
{"error":"invalid_grant","error_description":"Code not valid"}

Журналы Keycloak показывают, что этот токен имеет неправильный формат:

keycloak_1  | 09:53:23,219 WARN  [org.keycloak.protocol.oidc.utils.OAuth2CodeParser] (default task-35) Invalid format of the code
keycloak_1  | 09:53:23,219 WARN  [org.keycloak.events] (default task-35) type=CODE_TO_TOKEN_ERROR, realmId=Test Realm, clientId=mission-control, userId=null, ipAddress=172.20.0.1, error=invalid_code, grant_type=authorization_code, client_auth_method=client-secret

Чтобы проверить, является ли Keycloak или Почтальон был виноват, я прошел через CLI те же самые шаги с помощью Netcat:

В CLI, с помощью netcat, я могу успешно пройти через поток, и я вижу другой формат токена:

  1. Запустите сервер netcat, чтобы перехватить обратный вызов из окна браузера: $ nc -lk localhost 3002

  2. Откройте это в моем браузере http://localhost : 8080 / авт / царства / тест-область / протокол / OpenID-подключение / а uth? client_id = mission-control & redirect_uri = http% 3A% 2F% 2Flocalhost% 3A3002 & response_type = code & scope = openid

  3. Перейдите через поток входа в систему с Google в качестве поставщика.
  4. Сервер netcat получит что-то вроде этого GET /?code=3b9ac786-f9d1-40f9-b884-35e17b2fa756.70a3be09-8edf-47ed-9803-d08550a07faa.8794bba2-6f2b-4512-8bd7-6d5073852d1c (и более)
  5. Я могу успешно обменять этот код на токены: curl -XPOST -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=authorization_code&code=3b9ac786-f9d1-40f9-b884-35e17b2fa756.70a3be09-8edf-47ed-9803-d08550a07faa.8794bba2-6f2b-4512-8bd7-6d5073852d1c&redirect_uri=http%3A%2F%2Flocalhost%3A3002&client_id=mission-control&client_secret=3cc09c80-48bc-46fd-bc91-232e6bbb681a" http://localhost:8080/auth/realms/test-realm/protocol/openid-connect/token

Я не знаю, где Почтальон Поток OAuth получает «код» из тела ответа, который он использует для отправки в конечную точку обмена токенами. Разница в токенах очевидна, если пройти по ней вручную (тот же клиент, тот же токен, тот же сервер oauth2), то код выглядит следующим образом:

3b9ac786-f9d1-40f9-b884-35e17b2fa756.70a3be09-8edf-47ed-9803-d08550a07faa.8794bba2-6f2b-4512-8bd7-6d5073852d1c

При использовании Почтальона он отправляет это как код:

4/xgFPM8rkZXA1pWguPMHPKg8GS3BrI7whtmSq2U2K4_4Cy62m10y2l3IQp3KuiLRyaLaZWKCUiGJGEWVJ9K4zcTc

Что можно сделать, чтобы почтальон принял обратный вызов ?code из URL

1 Ответ

1 голос
/ 25 марта 2020

Это подтвержденная ошибка в Postman, когда конечные точки сервера OAuth callback_uri и токена находятся в одном (localhost) домене.

...