В 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
для этого пользователя и поместить его в контекст безопасности. Правильно ли? Если да, не могли бы вы показать мне пример того, как это можно реализовать?