Найденное решение: я создал пользовательский тип гранта. Таким образом, я могу переопределить аутентификацию, чтобы проверить токен ID у провайдера (в данном случае, Google), и если все в порядке, пусть нормальный поток выполнит свою работу.
На основе моей реализации:
1 ) Сервер авторизации: https://github.com/spring-projects/spring-security-oauth/blob/master/tests/annotation/custom-grant/src/main/java/demo/Application.java
2) Пользовательский токен: https://github.com/spring-projects/spring-security-oauth/blob/master/tests/annotation/custom-grant/src/main/java/demo/CustomTokenGranter.java:
Вот моя пользовательская реализация в Kotlin :
1) Переопределить configure(endpoints: AuthorizationServerEndpointsConfigurer)
из AuthorizationServerConfigurerAdapter
:
override fun configure(endpoints: AuthorizationServerEndpointsConfigurer) {
endpoints
.tokenStore(tokenStore)
.reuseRefreshTokens(false)
.accessTokenConverter(accessTokenConverter)
.authenticationManager(authenticationManager)
.userDetailsService(authUserDetails)
.tokenGranter(tokenGranter(endpoints))
}
private fun tokenGranter(endpoints: AuthorizationServerEndpointsConfigurer) =
CompositeTokenGranter(mutableListOf(endpoints.tokenGranter).apply {
add(GoogleTokenGranter(
tokenServices = endpoints.tokenServices,
clientDetailsService = endpoints.clientDetailsService,
requestFactory = endpoints.oAuth2RequestFactory,
grantType = GoogleTokenGranter.GRANT_TYPE
)
)
})
2) Реализация пользовательского токен-грантера:
class GoogleTokenGranter internal constructor(
tokenServices: AuthorizationServerTokenServices,
clientDetailsService: ClientDetailsService,
requestFactory: OAuth2RequestFactory,
grantType: String
) : AbstractTokenGranter(tokenServices, clientDetailsService, requestFactory, grantType) {
override fun getOAuth2Authentication(client: ClientDetails, tokenRequest: TokenRequest): OAuth2Authentication {
// check token with google here
return super.getOAuth2Authentication(client, tokenRequest)
}
companion object {
const val GRANT_TYPE = "google"
}
}
Клиентское мобильное приложение должно отправить запрос таким образом:
POST / oauth / token
Полезная нагрузка:
{
"grant_type": "google"
"username": "admin"
"token": "xxxxxxxxxxxxxxxxxxxxx"
}
Не забудьте также отправить заголовок авторизации вашему клиенту учетные данные для Spring проверяют допустимые большие типы, области и т. д. c