Я пытаюсь использовать 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, я могу успешно пройти через поток, и я вижу другой формат токена:
Запустите сервер netcat, чтобы перехватить обратный вызов из окна браузера: $ nc -lk localhost 3002
Откройте это в моем браузере http://localhost : 8080 / авт / царства / тест-область / протокол / OpenID-подключение / а uth? client_id = mission-control & redirect_uri = http% 3A% 2F% 2Flocalhost% 3A3002 & response_type = code & scope = openid
- Перейдите через поток входа в систему с Google в качестве поставщика.
- Сервер netcat получит что-то вроде этого
GET /?code=3b9ac786-f9d1-40f9-b884-35e17b2fa756.70a3be09-8edf-47ed-9803-d08550a07faa.8794bba2-6f2b-4512-8bd7-6d5073852d1c
(и более) - Я могу успешно обменять этот код на токены:
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