Какой лучший способ аутентифицировать / авторизовать сервер с помощью Oauth 2? - PullRequest
0 голосов
/ 08 июля 2020

У меня есть сервер server1, который предоставляет API, который возвращает список приобретенных товаров. Этот API защищен OAuth2. Пользователь должен пройти аутентификацию и иметь роль «ROLE_SUPERVISOR» для доступа к этому API.

Я хочу иметь возможность вызывать этот API с другого сервера server2. Этот сервер вызывает API сервера 1 без какого-либо взаимодействия с пользователем (в том числе для целей резервного копирования).

Каким будет лучший способ аутентификации server2 при вызове API server1?

Я мог бы создайте специфицированного c технического пользователя с ролью «ROLE_SUPERVISOR», но я читал, что тип предоставления учетных данных клиента может лучше подойти для этого случая (аутентификация сервера на сервер). Тогда мне нужно было бы только создать новое клиентское приложение и зарегистрировать его на сервере авторизации. Однако как мне добавить роль ROLE_SUPERVISOR в клиентское приложение?

Спасибо.

1 Ответ

0 голосов
/ 16 июля 2020

Я думаю, что есть некоторые термины, использующие комментарии и в вопросе, которые немного сбивают с толку.

Итак, мне нужно, чтобы server2 имел 'ROLE_SUPERVISOR' для доступа к этому API.

В OAuth 2.0 серверы - это не то, что связано с ролями. У токена есть утверждения, и эти утверждения могут быть интерпретированы приложением. Как упоминалось в вопросе, вы можете получить токен несколькими способами, одним из которых является предоставление учетных данных клиента.

Однако, как добавить роль ROLE_SUPERVISOR в клиентское приложение

Также не совсем правильно говорить, что у клиентов есть роли.

Я считаю, что OP хочет server2 передать токен OAuth 2.0 в server1, и что данный токен должен содержать соответствующие утверждения, так что server1 предоставит соответствующий запрос с предоставленными полномочиями ROLE_SUPERVISOR.

Чтобы получить такой токен с предоставлением учетных данных клиента, вам необходимо настроить клиент на сервере авторизации:

@Override
protected void configure(ClientDetailsServiceConfigurer clients) {
    clients.inMemory()
        .withClient("id")
        .authorizedGrantType("client_credentials")
        .authorities("ROLE_SUPERVISOR")
        .secret("{noop}secret")
}

Затем server2 может использовать идентификатор клиента и секрет, настроенные для получения токена. Как уже говорилось, Spring Security поставляется с фильтрами для согласования с серверами авторизации и добавления соответствующего заголовка Authorization к вызову server1.

...