У меня есть приложение 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? Для получения гранта
введите «пароль», если аутентификация пользователя не достаточна? Даже если это необходимо для аутентификации клиента, он будет использовать базовую аутентификацию в соответствии с моим пониманием. Так что мне нужно явно добавить базовый фильтр проверки подлинности ?
Вы проходя client_id и client_secret в заголовке Authorization?Вы пытались передать их в запросе? –
Да Я передаю client_id и client_secret в заголовке авторизации. Да, попробовал передать их в запросе как x-www-form-urlencoded и получил тот же результат. Без изменений. – user559668
Как вы это решили? – JohnTheBeloved