Собственный сервер Spring OAuth2 вместе с поставщиками 3rdparty OAuth
в приложении Spring Boot у меня есть серверы авторизации OAuth2Resource. На основе этого и Spring Security я обеспечил свои конечные точки Spring MVC REST API.
в дополнение к этому я хотел бы также добавить аутентификацию к моим конечным точкам REST на основе поставщиков 3rdparty OAuth, таких как Twitter, Facebook, Google.
в моем приложении у меня есть две сущности - User
и SocialUser
. SocialUser
представляет Профиль пользователя в социальных сетях. User
может быть 0-* associated SocialUsers
. Прямо сейчас я могу аутентифицировать пользователя в Twitter, а после этого я создаю две записи в своей базе данных-User и SocialUser. SocialUser содержит токены доступа / обновления, выпущенные Twitter и некоторые другие данные профиля из этой социальной сети.
прямо сейчас я не знаю, как связать этого пользователя, созданного из социальной сети, с моим существующим потоком аутентификацииавторизации. Для этого пользователя я хотел бы создать свой собственный (мой собственный сервер авторизации OAuth2) accessToken и предоставить его заказчику.
кроме того, у этого пользователя нет имени пользователя, пароля и электронной почты в его User
сущности. а также я не знаю, как вручную создать свой собственный токен доступа и отправить его клиенту для будущих вызовов API.
я нашел пример:
@Inject
private TokenEndpoint tokenEndpoint;
public String createAccessToken(User user) {
HashMap<String, String> parameters = new HashMap<String, String>();
parameters.put("client_id", "appid");
parameters.put("client_secret", "myOAuthSecret");
parameters.put("grant_type", "password");
parameters.put("password", user.getPassword());
parameters.put("scope", "read write");
parameters.put("username", user.getUsername());
// principal ??
return tokenEndpoint.getAccessToken(principal, parameters);
}
но я не знаю как создать Principal
на основе моего User
сущность и я теперь уверен, что это правильный путь..
Итак, главная вопрос в том, как вручную создать этот новый токен через мой собственный сервер OAuth для этого нового пользователя?
пожалуйста, сообщите мне, как это можно правильно реализовать. Спасибо.
обновление:
я добавил ProviderSignInController
к моему приложению и в состоянии прямо сейчас выполнить полный танец OAuth с Twitter. Кроме того, я реализовал свой собственный Neo4jConnectionRepository
и Neo4jUsersConnectionRepository
потому что я использую Neo4j в качестве основной базы данных.
@Bean
public ProviderSignInController providerSignInController() {
return new ProviderSignInController(socialAuthenticationServiceLocator, usersConnectionRepository, new SignInAdapter() {
@Override
public String signIn(String userId, Connection<?> connection, NativeWebRequest request) {
System.out.println("User ID: " + userId + " social display name: " + connection.getDisplayName());
return null;
}
});
}
пока все работает хорошо.
один вопрос - как аутентифицировать/авторизовать User
через мой собственный сервер авторизации OAuth2 в SignInAdapter.signIn
способ ?
я думаю, что нужно создать OAuth2Authentication
объект для этого пользователя и поместить его в контекст безопасности.. Я прав ? Если да, то не могли бы вы показать мне пример, как это можно реализовать ?
2 ответов
Итак, что вы хотите достичь : когда клиенты перенаправляют пользователей на ваш сервер авторизации (код авторизации или неявный грант), чтобы получить токен, пользователь может войти в систему, используя свою любимую социальную сеть.
если я правильно понимаю, вы свернули свою собственную реализацию единого входа (SSO) с Twitter (ProviderSignInController
), и теперь вам интересно, как генерировать токен, когда Twitter отвечает "ОК".
Я думаю, что вы приняли проблему неверной конец: вместо того, чтобы создавать свой клиент Twitter и генерировать токен программно, идея заключается в интеграции социального SSO в поток spring-security-oauth2, который на самом деле заключается в том, как интегрировать социальный SSO в Spring Security.
в конце концов, речь идет о том, как ваш сервер авторизации обеспечивает AuthorizationEndpoint:/oauth/authorize
.
Поскольку ваш сервер авторизации работает, у вас уже есть класс конфигурации, расширяя WebSecurityConfigurerAdapter
который обрабатывает безопасность для /oauth/authorize
С formLogin
. вот где вам нужно интегрировать социальные вещи.
вместо использования встроенного механизма аутентификации формы Spring Security вам придется подключить свою собственную безопасность, которая либо позволяет пользователю войти в систему с формой, либо запускает SSO с другими поставщиками.
Spring Security состоит из множества абстракций, но на самом деле это просто сводится к заполнению SecurityContext
С
этой учебник показывает, как достичь именно этого (если я правильно понял проблему) : наличие сервера аутентификации, выдающего ваши собственные токены oauth2 на основе внешней аутентификации oauth2. Соответствующий код здесь.
суть в том, что вы используете @EnableOAuth2Client
кроме @EnableAuthorizationServer
и вставить OAuth2ClientAuthenticationProcessingFilter
фильтр перед spring security по умолчанию.