Подтвердить что ты не робот

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

4b9b3361

Ответ 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 Социальные проекты, которые, похоже, поддерживают все основные социальные сети из коробки.
Хорошей новостью является то, что у вас уже есть множество доступных инструментов, "плохая новость" заключается в том, что вам нужно будет понять, как они работают в определенной степени, чтобы объединить их.