3

У меня есть приложение ios, которое общается с API REST, разработанным на Grails. Чтобы защитить REST API, я решил использовать oAuth 2.0 «Пароль владельца ресурса». Для приложения grails, выступающего в качестве провайдера oAuth 2.0, я использую следующее: http://grails.org/plugin/spring-security-oauth2-provider Для клиента с идентификатором как «клиент», секретным как «1234» и «Пользователь с именем пользователя как« пользователь »и пароль как« пароль », запрос лексема следующегоGrails oAuth2 Провайдер плагин не аутентифицируется для grant_type 'password'

POST /oauth2-test/oauth/token HTTP/1.1 
Host: 192.168.1.113:8080 
Authorization: Basic Y2xpZW50OjEyMzQ= 
Cache-Control: no-cache 
Content-Type: application/x-www-form-urlencoded 

grant_type=password&scope=read&username=user&password=password 

ответ получил

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

Моего Config.groovy правки для Spring Security и OAuth 2.0 поставщика плагин выглядит как этот

// Added by the Spring Security Core plugin: 
grails.plugin.springsecurity.userLookup.userDomainClassName = 'test.User' 
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'test.UserRole' 
grails.plugin.springsecurity.authority.className = 'test.Role' 
grails.plugin.springsecurity.controllerAnnotations.staticRules = [ 
    '/':        ['permitAll'], 
    '/index':       ['permitAll'], 
    '/index.gsp':      ['permitAll'], 
    '/assets/**':      ['permitAll'], 
    '/**/js/**':      ['permitAll'], 
    '/**/css/**':      ['permitAll'], 
    '/**/images/**':     ['permitAll'], 
    '/**/favicon.ico':    ['permitAll'], 
    '/oauth/authorize.dispatch': ["isFullyAuthenticated() and (request.getMethod().equals('GET') or request.getMethod().equals('POST'))"], 
    '/oauth/token.dispatch' : ["isFullyAuthenticated() and request.getMethod().equals('POST')"] 
] 

// Added by the Spring Security OAuth2 Provider plugin: 
grails.plugin.springsecurity.oauthProvider.clientLookup.className = 'test.Client' 
grails.plugin.springsecurity.oauthProvider.authorizationCodeLookup.className = 'test.AuthorizationCode' 
grails.plugin.springsecurity.oauthProvider.accessTokenLookup.className = 'test.AccessToken' 
grails.plugin.springsecurity.oauthProvider.refreshTokenLookup.className = 'test.RefreshToken' 

grails.plugin.springsecurity.providerNames = [ 
     'clientCredentialsAuthenticationProvider', 
     'daoAuthenticationProvider', 
     'anonymousAuthenticationProvider', 
     'rememberMeAuthenticationProvider' 
] 
grails.exceptionresolver.params.exclude = ['password', 'client_secret'] 
grails.plugin.springsecurity.filterChain.chainMap = [ 
     '/oauth/token': 'JOINED_FILTERS,-oauth2ProviderFilter,-securityContextPersistenceFilter,-logoutFilter,-rememberMeAuthenticationFilter', 
     '/api/**': 'JOINED_FILTERS,-securityContextPersistenceFilter,-logoutFilter,-rememberMeAuthenticationFilter', 
     '/**': 'JOINED_FILTERS,-statelessSecurityContextPersistenceFilter,-oauth2ProviderFilter,-clientCredentialsTokenEndpointFilter' 
] 
  • Что я делаю неправильно? Я понимаю, что oAuth 2.0 в основном предназначен для авторизации , а не для аутентификации. Так что я должен явно добавить фильтр для аутентификации? Я начал с Grails без какого-либо опыта в Springs, и любая помощь приветствуется, как это сделать?
  • Требуется ли аутентификация grant_type 'password? Для получения гранта
    введите «пароль», если аутентификация пользователя не достаточна? Даже если это необходимо для аутентификации клиента, он будет использовать базовую аутентификацию в соответствии с моим пониманием. Так что мне нужно явно добавить базовый фильтр проверки подлинности ?
+0

Вы проходя client_id и client_secret в заголовке Authorization?Вы пытались передать их в запросе? –

+0

Да Я передаю client_id и client_secret в заголовке авторизации. Да, попробовал передать их в запросе как x-www-form-urlencoded и получил тот же результат. Без изменений. – user559668

+0

Как вы это решили? – JohnTheBeloved

ответ

2

Базовая аутентификация не включена по умолчанию в Spring Security Ядра, так что вы не можете поставить client_id и client_secret в заголовке Authorization; в этом случае просто добавить их к параметрам запроса (как grant_type)

Следующий CURL пример должен работать:

curl -v -X POST \ 
-d "grant_type=password" \ 
-d "client_id=client" \ 
-d "client_secret=1234" \ 
-d "scope=read" \ 
-d "username=user" \ 
-d "password=password" http://localhost:8080/oauth2-test/oauth/token 

{"access_token":"d3eb1c1c-9922-4cfc-87e3-7efca9a8a2f2","token_type":"bearer","refresh_token":"e790efc2-e708-4391-9a7b-e4d86dc70816","expires_in":42545,"scope":"read"} 

Обратите внимание, что OAuth2 требует HTTPS. Если вы работаете Grails с -https опцией (grails run-app -https), команда такова:

curl -v --insecure -X POST \ 
-d "grant_type=password" \ 
-d "client_id=client" \ 
-d "client_secret=1234" \ 
-d "scope=read" \ 
-d "username=user" \ 
-d "password=password" https://localhost:8443/oauth2-test/oauth/token 

Когда я опускаю параметр запроса client_id, я получаю следующий ответ:

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

Update

Если вы хотите использовать базовую аутентификацию HTTP для client_id, просто включение базовой проверки подлинности в Spring Security Core (в Config.groovy) не является e, поскольку BasicAuthenticationFilter не инициализируется способом, подходящим для oauth2. Когда учетные данные верны или опущены, все работает так, как ожидалось, но когда учетные данные предоставлены, но ошибочны, вы получите ответ HTML.

Существует в настоящее время вопрос о Github странице проекта, где обсуждается правильный способ обработки обычной проверки подлинности:

https://github.com/bluesliverx/grails-spring-security-oauth2-provider/issues/65

+0

У меня другое проблема с типом предоставления пароля. Я получил токен доступа успешно, но когда я пытаюсь получить доступ к любому ресурсу с помощью этого токена доступа, я получаю Bearer error = «Invalid token», вы можете мне помочь с этим, пожалуйста? –

Смежные вопросы