Собственный сервер Spring OAuth2 вместе с поставщиками OAuth 3rdparty
В Spring загрузочном приложении у меня есть сервер авторизации OAuth2\Resource. Основываясь на этом и Spring безопасности, я защитил мои конечные точки API-интерфейсов MVC REST Spring.
В дополнение к этому, я хотел бы также добавить аутентификацию к моим конечным точкам REST на основе сторонних поставщиков OAuth, таких как Twitter, Facebook, Google.
В моем приложении у меня есть два объекта - User
и SocialUser
. SocialUser
представляет профиль пользователя в социальных сетях. User
может иметь 0- * связанный 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
для этого пользователя и поместить его в контекст безопасности. Правильно ли? Если да, не могли бы вы показать мне пример того, как это можно реализовать?
Ответы
Ответ 1
Итак, что вы хотите достичь: когда клиенты перенаправляют пользователей на ваш сервер авторизации (код авторизации или неявный грант), чтобы получить токен, пользователь может войти в систему, используя свою любимую социальную сеть.
Если я правильно понял, вы включили собственную реализацию единого входа в систему (SSO) с помощью Twitter (ProviderSignInController
), и теперь вам остается задаться вопросом, как создать токен, когда Twitter отвечает "ОК".
Я думаю, что вы взяли проблему не по той причине: вместо того, чтобы создавать свой клиент Twitter и генерировать токен программно, идея состоит в интеграции социального SSO внутри потока spring -security-oauth2, что на самом деле так для интеграции социального SSO в Spring Безопасность.
В конце концов, это о том, как ваш сервер авторизации защищает AuthorizationEndpoint: /oauth/authorize
.
Поскольку ваш сервер авторизации работает, у вас уже есть класс конфигурации, расширяющий WebSecurityConfigurerAdapter
, который обрабатывает безопасность для /oauth/authorize
с помощью formLogin
. То, где вам нужно интегрировать социальные вещи.
Вместо использования механизма проверки подлинности встроенной формы Spring Security вы должны будете подключить свою собственную систему безопасности, которая либо позволяет пользователю входить в систему с формой, либо запускать SSO с другими поставщиками.
Spring Безопасность состоит из множества абстракций, но на самом деле это просто сводится к заполнению SecurityContext
объектом Authentication
для каждого запроса.
Как только процесс аутентификации будет завершен, пользователь продолжит /oauth/authorize
, даст согласие клиенту на доступ к некоторым областям, а токен будет доставлен, как обычно, без необходимости программно создавать маркеры.
Я сделал это с помощью SAML (Spring расширения SAML безопасности), но в вашем случае вы должны выкопать Spring Социальные проекты, которые, похоже, поддерживают все основные социальные сети из коробки.
Хорошей новостью является то, что у вас уже есть множество доступных инструментов, "плохая новость" заключается в том, что вам нужно будет понять, как они работают в определенной степени, чтобы объединить их.