Spring boot 2.0.3 + Security + автоконфигурация Oauth2
Я работаю с OAuth2 и микросервисами, я создал микросервис для генерации токенов авторизации и еще один микросервис в качестве клиента. Генерация токенов работает, но когда я пытаюсь использовать этот сгенерированный токен в клиентской службе для аутентификации, он не работает.
Микросервис, генерирующий токены: localhost: 9999
Токен, созданный с помощью url: estrutura: estruturasecret @ localhost: 9999 / oauth / token
[
{
"key":"grant_type",
"value":"password"
},
{
"key":"username",
"value":"matheus"
},
{
"key":"password",
"value":"teste"
},
{
"key":"client_id",
"value":"estrutura"
}
]
возвращаться:
{
"access_token": "2e4c26b3-0fcf-493e-a255-6216b98811c5",
"token_type": "bearer",
"refresh_token": "5e33740a-ccb9-4ec1-94be-3a4643b8097a",
"expires_in": 42479,
"scope": "read write"
}
Микросервис клиента: localhost: 9090
@SpringBootApplication
@EnableResourceServer
public class ClientServer {
public static void main(String[] args) {
SpringApplication.run(ClientServer.class, args);
}
}
application.yml:
server:
port: 9090
servlet:
context-path: /client
spring:
application:
name: client-server
security:
oauth2:
client:
client-id: estrutura
client-secret: estruturasecret
access-token-uri: localhost:9999/oauth/token
user-authorization-uri: localhost:9999/oauth/authorize
resource:
token-info-uri: localhost:9999/oauth/check_token
logging:
level:
org.springframework.security: DEBUG
Ошибка:
<error>invalid_token</error>
<error_description>Invalid access token: 2e4c26b3-0fcf-493e-a255-6216b98811c5</error_description>
Журналы:
2018-06-26 11:24:42.641 DEBUG 18658 --- [nio-9090-exec-2] o.s.security.web.FilterChainProxy : /alunos at position 5 of 11 in additional filter chain; firing Filter: 'OAuth2AuthenticationProcessingFilter'
2018-06-26 11:24:42.641 DEBUG 18658 --- [nio-9090-exec-2] p.a.OAuth2AuthenticationProcessingFilter : Authentication request failed: error = "invalid_token", error_description = "Invalid access token: 2e4c26b3-0fcf-493e-a255-6216b98811c5"
2018-06-26 11:24:42.645 DEBUG 18658 --- [nio-9090-exec-2] o.s.s.w.header.writers.HstsHeaderWriter : Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@1fa75b
2018-06-26 11:24:42.647 DEBUG 18658 --- [nio-9090-exec-2] s.s.o.p.e.DefaultOAuth2ExceptionRenderer : Written [error = "invalid_token", error_description = "Invalid access token: 2e4c26b3-0fcf-493e-a255-6216b98811c5"] as "application/xml;charset=UTF-8" using [org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter@30d6fa45]
2018-06-26 11:24:42.647 DEBUG 18658 --- [nio-9090-exec-2] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed




Я попытался воспроизвести ваш вариант использования: я разрабатываю AuthServer с облачной безопасностью Spring и ResourceServer. Проблема, которую я вижу при использовании стратегии token-info-uri, заключается в том, что весной, чтобы проверить токен, используйте RemoteTokenServices, и он использует OAuth2RestTemplate для получения информации токена, сказал, что если вы хотите использовать свою конфигурацию, вы вставили этот вид конфигурации, как показано ниже:
@EnableOAuth2Client
@EnableResourceServer
@SpringBootApplication
public class HelloOauthServiceApplication {
public static void main(String[] args) {
SpringApplication.run(HelloOauthServiceApplication.class, args);
}
@Bean
public OAuth2RestTemplate oAuth2RestTemplate(OAuth2ProtectedResourceDetails resource){
return new OAuth2RestTemplate(resource);
}
}
Обратите внимание на определение bean-компонентов @EnableOAuth2Client и OAuth2RestTemplate. Эта конфигурация используется весной для проверки и обновления вашего токена.
Однако в этом случае любой сервер ресурсов должен быть также клиентским приложением и, по моему опыту, не масштабируется. Мой личный совет - использовать стратегию user-info-uri. В этом случае Spring будет использовать специальную конечную точку для получения информации о пользователе. конфигурация очень проста на вашем сервере ресурсов, вы определили только @EnableResourceServer, как в вашем примере, в вашем yaml вы можете настроить только часть ресурса, как показано ниже
security:
oauth2:
resource:
user-info-uri: http://localhost:9090/account/userInfo.json
preferTokenInfo: false
Единственная дополнительная разработка - это ваш сервер аутентификации, который должен предоставлять информацию о пользователе в конечной точке, как показано ниже:
@RestController
@RequestMapping("/account")
class UserRestFullEndPoint {
@GetMapping("/userInfo")
public Principal userInfo(Principal principal){
return principal;
}
}
Я использую этот подход много раз, и я заметил, что он работает очень хорошо и масштабируется, потому что на ваших ресурсных серверах вы не определили его, как и клиентское приложение.
Я надеюсь, что это может быть полезно.
PS: в своей конфигурации вы забыли протокол http:
server:
port: 9090
servlet:
context-path: /client
spring:
application:
name: client-server
security:
oauth2:
client:
client-id: estrutura
client-secret: estruturasecret
access-token-uri: http://localhost:9999/oauth/token
user-authorization-uri: http://localhost:9999/oauth/authorize
resource:
token-info-uri: http://localhost:9999/oauth/check_token
logging:
level:
org.springframework.security: DEBUG
Отличный ответ с подробностями. Можно ли использовать сторонний сервер авторизации (например, Azure AD и т. д.) И при этом придерживаться аналогичного подхода?
привет, Турсия. Я никогда не пробовал работать с другими провайдерами, но я лично предлагаю попробовать новейшую весеннюю безопасность oauth2. Обсуждаемая в вопросе библиотека основана на весенней облачной безопасности, а возможность единого входа устарела и удалена в последней версии весенней загрузки.
Я имею в виду, что ответ подходит для облачной безопасности Spring и устаревшей библиотеки oauth2, но эта библиотека устарела весной в пользу последней поддержки безопасности Spring для oauth2 и openid connect.
Спасибо Валерио, посмотрю.