#oauth-2.0 #openid-connect
#oauth-2.0 #OpenID-connect
Вопрос:
У меня есть Keycloak для аутентификации и авторизации нескольких приложений (веб-страницы и REST API). Насколько я понимаю, поток для веб-страницы при использовании authentication_code
типа предоставления OAuth2 выглядит следующим образом:
В этом потоке на втором шаге (выделенном красным) владелец ресурса входит в систему, потому что он / она были перенаправлены на страницу входа в Keycloak. Этот поток мне понятен и работает хорошо.
Но с помощью REST API я не знаю, каков процесс аутентификации и авторизации пользователя (владельца ресурса), потому что нет браузера, который перенаправлял бы его на страницу входа в Keycloak. Итак, я попробовал password
использовать тип гранта, и это сработало, но потом я понял, что этот тип гранта устарел. Итак, я попробовал еще раз с authorization_code
типом grant, но не смог заставить его работать. Я пытаюсь получить токен, используя следующий запрос:
URL: http://localhost:8080/auth/realms/somerealm/protocol/openid-connect/token
Тело:
username: someuser
passwoord: somepassword
grant_type: authorization_code
client_id: someclient
secret: somesecret
Проблема в том, что я получаю следующий ответ:
{
"error": "invalid_request",
"error_description": "Missing parameter: code"
}
Я знаю, что у меня что-то не так в запросе (и в моем понимании OAuth2), но я много читал и не могу понять, что это такое.
Ответ №1:
API (серверной части) обычно не требуется никакого потока входа в систему. Ему просто нужно проверить токен, а затем он выполняет запрошенную операцию или отклоняет ее (код ответа 401 — проблема с аутентификацией / 403 — проблема с авторизацией). Он не перенаправляет на сервер аутентификации.
Клиент, который использует API, должен получить токен перед запросом API. Это может быть сделано с помощью интерфейса (например, с помощью SPA The Authorization Code Flow PKCE
), а затем интерфейс поддерживает состояние (обновление токена, коды ошибок из API, …).
Если у вас нет интерфейса, то процедура получения токена должна быть частью спецификации API. Например, смотрите Документ swagger: https://swagger.io/docs/specification/authentication/oauth2 /
Client credentials flow
Следует использовать machine to machine
аутентификацию, поэтому это не решение, если вам нужно знать личность пользователя.
Комментарии:
1.
client_credentials
поток — это рекомендация группы OAuth2 для заменыpassword
. Просто к вашему сведению. Больше не просто от машины к машине.2. @Evert у вас есть какая-либо ссылка / документ для этого, пожалуйста? Не похоже на хорошую идею иметь выделенный клиент для потока учетных данных клиента для каждого пользователя.
3. Это широко обсуждалось в списке рассылки oauth2. У меня нет прямой ссылки на обсуждение. Это может потребовать некоторого поиска. «выделенный клиент» — это деталь реализации, хотя сервер OAuth2 может сопоставляться
client_credentials
с какой-либо другой функцией и не нуждаться в чем-то, что выглядит как «клиент». Главное, что сделала бы группа oauth2, — это полностью отказаться от этого и попытаться просто использоватьauthorization_code
.
Ответ №2:
С authorization_code
типом предоставления вам нужно каким-то образом запустить браузер.
password
к сожалению, устарел, но рекомендуется использовать client_credentials
для этих случаев сейчас. Я надеюсь, что это решение будет отменено до выпуска OAuth 2.1.
Комментарии:
1. С типом предоставления учетных данных клиента мне пришлось бы создавать клиента для каждого пользователя, чтобы иметь возможность их идентифицировать?
2. @Jucaalpa это то, что OAuth2 рекомендует в качестве замены
password
. Возможно, что keycloak усложняет это. На самом деле нет никаких реальных недостатков в использованииpassword
, поэтому я бы рекомендовал просто продолжать использовать это, покаclient_credentials
не станет более удобным.