Поток OAuth2 для защиты REST API

#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 не станет более удобным.