Понимание потока учетных данных клиента OAuth2

Я пытаюсь понять и внедрить поток учетных данных клиента между нашим новым сервером REST и нашим существующим клиентским приложением. Я установил spring -security OAuth2, например . Насколько я понимаю, на моем сервере теперь должен поддерживаться следующий запрос:

$ curl -X -v -d 'client_id=the_client&client_secret=secret&grant_type=client_credentials' -X POST "http://localhost:9090/oauth/token"

но я получаю

InsufficientAuthenticationException: There is no client authentication

вызванный Principal null здесь (spring -security code):

@FrameworkEndpoint
@RequestMapping(value = "/oauth/token")
public class TokenEndpoint extends AbstractEndpoint {

    @RequestMapping
    public ResponseEntity<OAuth2AccessToken> getAccessToken(Principal principal,
            @RequestParam("grant_type") String grantType, @RequestParam Map<String, String> parameters) {

        if (!(principal instanceof Authentication)) {
            throw new InsufficientAuthenticationException(

Итак, мне нужно выполнить проверку подлинности на сервере. Но это не то, что я хочу сделать. Я хочу, чтобы два моих сервера разговаривали друг с другом, используя общий секрет. Сервер поставщика OAuth должен предоставить маркер доступа к (доверенному) клиентскому серверу по запросу, чтобы клиентский сервер мог затем использовать этот токен для доступа ко всем ресурсам REST на сервере. Это должно защищать ресурсы REST от внешнего доступа.

Позже я хочу предоставить выбранные ресурсы третьей стороне и, в конечном итоге, реализовать некоторую более четкую безопасность для связи между сервером. Но на данный момент мне нужно защитить сервер REST от внешнего доступа.

Похоже, у меня могут быть некоторые недоразумения в отношении всего потока учетных данных клиента или приложения spring -security прямо там, поэтому любое разъяснение будет принята с благодарностью.

Ответ 1

Вы не аутентифицируете своего клиента на сервере авторизации.

Вам нужно сделать что-то вроде этого:

curl --user the_client:secret --data "grant_type=client_credentials" http://localhost:9090/oauth/token

Это аутентификация клиента на сервере авторизации, а затем указание параметра grant_type и других параметров. Это вернет токен доступа типа "носитель" с областью действия, определяемой данными клиента oauth. После того, как у вас есть токен, вы можете получить доступ к защищенным ресурсам, установив заголовок авторизации:

curl -H "Authorization: Bearer <accessToken>" <resourceUrl>