Собственный сервер 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 по умолчанию.