0

У меня есть сервер аутентификации, сконфигурирован весной ссмог oauth2 фишку от Идент сервера

clients 
     .inMemory() 
     .withClient("my-web-app") 
     .secret("my-web-app-secret") 
     .authorizedGrantTypes(// 
      "authorization_code",// 
      "refresh_token",// 
      "password"// 
     ).scopes("openid") 

Теперь я хочу разработать приложение командной строки для веб-приложение. Поэтому мне нужно зарегистрировать еще одного клиента с отдельным идентификатором клиента и секретом. я сделал что-то вроде этого

.and() 
     .inMemory() 
     .withClient("my-cli") 
     .secret("my-cli-secret") 
     .authorizedGrantTypes("authorization_code","client_credentials") 
     .scopes("read","write","trust").authorities("ROLE_USER"); 

То, что я хочу достичь, это использовать просто предоставить имя пользователя/пароль и приложение-клиент должен иметь возможность получить маркер аутентификации от сервера AUTH.

Что я пробовал и понял, я должен использовать грант владельца ресурса. После этого я должен использовать пружину Oauth2restTemplate. Проблема в этой конфигурации, когда я м ударять tokenuri я получаю

{ 
error: "unauthorized" 
error_description: "Full authentication is required to access this resource" 
} 

и каждый раз, когда она сталкивается с анонимным пользователем.

+0

Добавьте StackTrace после включения уровня отладки для пакета:. 'Org.springframework *' –

ответ

1

Если вы хотите ввести имя пользователя/пароль для получения токена доступа, вам определенно необходимо использовать grant_type=password.

Вы также не должны указывать .inMemory() дважды - всего два клиента с .and() между ними.

Итак, конфигурация, то должно быть что-то вроде

@Override 
public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
    clients 
      .inMemory() 
        // First client 
      .withClient("my-web-app") 
      .secret("my-web-app-secret") 
      .authorizedGrantTypes(// 
        "authorization_code",// 
        "refresh_token",// 
        "password"// 
      ).scopes("openid") 
      // Second Client(CLI) 
      .and() 
      .withClient("my-cli") 
      .secret("my-cli-secret") 
      .authorizedGrantTypes("password") 
      .scopes("read", "write", "trust") 
      .authorities("ROLE_USER"); 
} 

И другие очень важная вещь - вам нужно установить заголовок Authorization: в запросе HTTP для маркера. Таким образом, заголовок должен быть

"Authorization: Basic " + Base64.encodeBase64String((clientId + ":" + clientSecret).getBytes()) 

Этот заголовок проверяется перед именем пользователя \ пароль и определяет, что клиент (CLI в вашем случае) является авторизованным клиентом (это может привести к ошибке от вашего вопроса).

Это было бы очень хорошо, если вы можете добавить код, как именно вы используете Oauth2RestTemplate

+0

Я добавил выше код, как вы упомянули и пытается получить к нему доступ с помощью resttemplate 'MultiValueMap requestParams = new LinkedMultiValueMap (); requestParams.add ("grant_type", "password"); requestParams.add ("client_id", "commandline"); requestParams.add («имя пользователя», «пользователь»); requestParams.add («пароль», «pwd»); заголовки = HttpHeaders(); headers.add («ContentType», «x-www-form-urlencoded»); headers.add ("Authorization: Basic", Base64.encodeBase64String (("my-cli" + ":" + "my-cli-secret"). GetBytes())); ' – shikjohari

+0

Но я получаю это сообщение как ответ 'AuditEvent [timestamp = Tue Aug 11 10:22:42 IST 2015, main = user, type = AUTHENTICATION_FAILURE, data = {message = Bad credentials, type = org.springframework.security.authentication.BadCredentialsException}]' – shikjohari

+0

Попробуйте 'headers.add (« Авторизация »,« Базовый »+ Base64.encodeBase64String ((« my-cli »+»: «+» my-cli-secret »). getBytes()));' ('Basic' здесь часть значения, а не имя заголовка) – dzirtbry