Невозможно выставить конечную точку в Spring Boot для получения кода авторизации от Google - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть набор микро-сервисов, написанных с использованием Springboot 1.5.6, которые содержат бизнес-логику, которая должна использоваться приложением SinglePageApplication.Задача состоит в том, чтобы реализовать основанную на методах безопасность для API Restful, используя OAuth2 и обеспечивающую безопасность как на основе имени пользователя и пароля, так и на основе социальной регистрации.

Я создал (с большим трудом и пониманием подпункта) новый микро-сервис и внедрил Auth Server (AS), позволяющий аутентификацию на основе имени пользователя и пароля.Мне, кстати, также удалось преобразовать токены в JWT, чтобы многочисленные вызовы между сервером ресурсов (RS) и сервером авторизации (AS) были предотвращены.

Несмотря на то, что я не понял разумной основы безопасности пружины, аутентификация на основе имени пользователя и пароля, тем не менее, работает.Я также представил простой API входа в AS, который принимает имя пользователя, пароль в качестве аргумента и, в свою очередь, вызывает собственный метод oauth / token для генерации токена доступа и возврата к веб-клиенту.Этот API используется внешним интерфейсом для входа в систему на основе имени пользователя и пароля (или входа в систему на основе формы, если он так называется).

Часть application.yml, которая позволяет AS вызывать собственный метод Spring для получения токена доступа, выглядит следующим образом:

security:
  oauth2:
    client:
      accessTokenUri: http://localhost:8200/oauth/token
      clientId: myClientId-used-by-RS
      clientSecret: myClient-secret `

Однако цель состоит в том, чтобы разрешить социальный входдля аутентификации (чтобы удостовериться в личности пользователя и устранить неприятность при запоминании пароля).

После прочтения сотен статей и множества неудачных попыток, и при этом не будучи в состоянии понять, как реализоватьСоциальный вход, я в конечном итоге следовал https://spring.io/guides/tutorials/spring-boot-oauth2/, чтобы настроить вход в систему на основе Google.Чтобы пройти аутентификацию в Google, я создал учетные данные и установил URL перенаправления как http://localhost:8200/redirect/google.

. Код Java, в котором настроены данные сервера Google Auth, выглядит следующим образом:

@Bean
@ConfigurationProperties("google.client")
public AuthorizationCodeResourceDetails google() {
    AuthorizationCodeResourceDetails acrd = new AuthorizationCodeResourceDetails();
    return acrd;
}
@Bean
@ConfigurationProperties("google.resource")
public ResourceServerProperties googleResource() {
    return new ResourceServerProperties();
}
private Filter ssoGoogleFilter() {
    OAuth2ClientAuthenticationProcessingFilter googleFilter =
            new OAuth2ClientAuthenticationProcessingFilter("/redirect/google");
    OAuth2RestTemplate googleTemplate = new OAuth2RestTemplate(google(), oauth2ClientContext);
    googleFilter.setRestTemplate(googleTemplate);
    googleFilter.setTokenServices(new UserInfoTokenServices(googleResource().getUserInfoUri(), google().getClientId()));
    return googleFilter;
}

Свойства для аутентификации в Google следующие:

google:
   client:
       clientId: 1512877066*******
       clientSecret: 2yEq**********
       accessTokenUri: https://www.googleapis.com/oauth2/v3/token
       userAuthorizationUri: https://accounts.google.com/o/oauth2/auth
       tokenName: oauth_token
       authenticationScheme: query
       clientAuthenticationScheme: form
       scope: profile
       pre-established-redirect-uri: http://localhost:8200/redirect/google
   resource:
       userInfoUri: https://www.googleapis.com/userinfo/v2/me
       preferTokenInfo: false

В текущей настройке, когда нажата кнопка «Войти в Google», следующий URL называется http://localhost:8200/redirect/google, и который в свою очередь (иволшебным образом) открывает страницу аутентификации Google.URL перенаправления не виден через чванство!Тем не менее, Spring каким-то образом создает его и перенаправляет на Google AS, который работает с браузером и отправляет перенаправление по указанному адресу.

При выборе учетной записи Google, по-видимому, правильно, вызывает URL-адрес перенаправления вместе с кодом авторизации.http://localhost:8200/redirect/google?state=bCYxB8&code=4/7ADdFDUL1x653-RL7H3iAJ_dTEjnznN88B7HRjj73ZXhlakIItH_6UzEFL25adS1kFdPvGRO8&scope=profile%20https:// Проблема начинается сейчас! Я получаю ошибку 401. Моя конфигурация безопасности следующая:

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity
            .csrf().disable()
            .authorizeRequests()
            .antMatchers("**").permitAll()
            .and()
            .addFilterBefore(dandiSocialLogin.ssoFilter(), BasicAuthenticationFilter.class);
            ;
}

Я не могу выставить конечную точку для получения кода авторизации.Конечная точка выставлена ​​Spring и не под моим контролем.Будет ли какой-нибудь хук, где я могу получить код авторизации и вернуть токен локального доступа в respose?В идеале я хотел бы предоставить такую ​​конечную точку, как

    @RequestMapping(value = "", method = RequestMethod.GET)
public DandiTokenResponse googleCallback(@RequestParam(value = "code", defaultValue = "") String code,
                                         @RequestParam (value = "state", defaultValue = "") String state,
                                         @RequestParam (value = "scope", defaultValue = "") String scope){
    /**
     * Use the authorization code, to get access token, or get profile information.
     * If authorization code is valid, then assume that the user has successfully authenticated with google.
     * Create your own fictitious password, store it in the db, and call the local login method of
     * AS to get access token generated by the local AS (and not google). Return the access token to the
     * front end.
     */
    return null;
}

. В тот момент, когда я предоставляю конечную точку, которая разрешается в / redirect / google, моя первоначальная попытка вызвать этот API (и перенаправление в Google для аутентификации) не удалась.Если я изменил URL перенаправления в консоли Google на что-то отличное от new OAuth2ClientAuthenticationProcessingFilter("/redirect/google");, я получу ошибку несоответствия URL перенаправления.Если я не получу код авторизации, отправленный Google, этот поток не будет использоваться!

Прошло несколько недель с тех пор, как я изо всех сил пытался заставить социальный логин + логин-пароль-логин работать для Restful API.Все ссылки по всем связанным ключевым словам для первых нескольких страниц исследования Google были исчерпаны.И поскольку вообще нет разговоров на эту тему, я считаю, что мне не хватает чего-то настолько фундаментального, что никто об этом не спрашивает.Пожалуйста, дайте мне знать, (1) как я должен получить доступ к коду авторизации на сервере ?, (2) должен ли я создать http-запрос в java-коде для обмена кодом авторизации для токена доступа (google) / информации профиля или какие-тоНастройка свойств в Spring подойдет, (3) Это правильный путь, или есть более рекомендуемый метод для достижения того же?Я вижу сотни веб-сайтов, которые позволяют эту функцию, но я не могу сделать это в течение последних двух месяцев, что означает, что в моем подходе должно быть что-то принципиальное!

Поскольку длина описания уже перешла пределы приличия, я буду сдерживаться для конкретных вопросов.Спасибо

...