У меня есть набор микро-сервисов, написанных с использованием 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) Это правильный путь, или есть более рекомендуемый метод для достижения того же?Я вижу сотни веб-сайтов, которые позволяют эту функцию, но я не могу сделать это в течение последних двух месяцев, что означает, что в моем подходе должно быть что-то принципиальное!
Поскольку длина описания уже перешла пределы приличия, я буду сдерживаться для конкретных вопросов.Спасибо