Защитите RESTful API сервера ресурсов с помощью сторонней аутентификации - PullRequest
1 голос
/ 28 марта 2020

Прежде всего, у меня есть сервер авторизации oauth2, разработанный с использованием Spring Boot, с аннотацией @EnableAuthorizationServer и расширением AuthorizationServerConfigurerAdapter. Точно так же существует сервер ресурсов, аннотированный с помощью @EnableResourceServer, расширяющего ResourceServerConfigurerAdapter.

Сценарий: Android приложение с логином Google должно вызывать мой бэкэнд REST API, который является сервером ресурсов защищенным способом. Приложение Android должно вызвать API REST, чтобы получить зарегистрированную информацию о пользователе для заполнения интерфейса приложения с использованием предоставленных токенов доступа, сгенерированных моим сервером авторизации. Пытаясь интегрировать приложение с серверами ресурсов и авторизации и логином Google, я нашел следующую страницу разработчиков Google: https://developers.google.com/identity/sign-in/web/backend-auth

Там они говорят:

Если вы используете Google Sign-In с приложением или сайтом, который обменивается данными с внутренним сервером, вам может потребоваться идентифицировать текущего пользователя, выполнившего вход на сервер. Чтобы сделать это безопасно, после успешного входа пользователя отправьте маркер идентификатора пользователя на свой сервер с использованием HTTPS. Затем на сервере проверьте целостность идентификатора токена и используйте информацию о пользователе, содержащуюся в токене, для установки sh сеанса или создания новой учетной записи.

Хорошо, я могу добавить конечная точка для получения идентификатора токена, без проблем.

Другой сеанс, в конце той же страницы также написано:

После того, как вы проверили токен, проверьте, является ли пользователь уже в вашей базе данных пользователей. Если это так, установите sh аутентифицированный сеанс для пользователя. Если пользователь еще не в вашей пользовательской базе данных, создайте новую запись пользователя из информации в полезной нагрузке токена ID и установите sh сеанс для пользователя. Вы можете запросить у пользователя любую дополнительную информацию о профиле, которая вам понадобится при обнаружении нового пользователя в вашем приложении.

Здесь у нас есть смысл. После проверки идентификационного токена, отправленного приложением Android во время входа пользователя в Google, как я могу интегрировать приложение с API и создать доступ и обновить токен sh на моем сервере авторизации Spring для отправки их в мобильное приложение?

1 Ответ

1 голос
/ 30 марта 2020

Найденное решение: я создал пользовательский тип гранта. Таким образом, я могу переопределить аутентификацию, чтобы проверить токен 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

...