Facebook Войти с помощью Spring Социальное использование существующего токена доступа пользователя

Здесь у меня есть:

  • Spring Служба REST, в которой многие API-интерфейсы требуют аутентификации пользователя.
  • API 'регистрации' (/api/v1/register)
  • API 'login', который использует имя пользователя/пароль (/api/v1/login)
  • "API входа в Facebook", который полагается на Spring Social и Spring Безопасность для создания пользовательского подключения и регистрации моего пользователя в (/auth/facebook)

Моя проблема в том, что я хочу, чтобы эти API-интерфейсы использовались несколькими клиентами, но способ входа в Facebook прямо сейчас, он не очень хорошо работает на мобильных устройствах (отлично работает на веб-сайте).

Здесь мобильный сценарий:

  • Я использую Facebook iOS SDK для запроса разрешения от пользователя
  • Facebook возвращает токен доступа пользователя
  • Я хочу отправить мой бэкэнд-сервис в этот токен и Spring Социальный принять его, создать User Connection и т.д.

Можно ли это сделать? Или мне придется написать свой собственный API для сохранения пользовательского соединения?

Цените любую помощь!

Ответы

Ответ 1

У меня была одна и та же проблема, и вот как я это сделал. Вероятно, у вас есть SocialConfigurer со следующим:

@Configuration
@EnableSocial
public class SocialConfig implements SocialConfigurer {

    @Autowired
    private DataSource dataSource;

    @Bean
    public FacebookConnectionFactory facebookConnectionFactory() {
        FacebookConnectionFactory facebookConnectionFactory = new FacebookConnectionFactory("AppID", "AppSecret");
        facebookConnectionFactory.setScope("email");
        return facebookConnectionFactory;
    }

    @Override
    public void addConnectionFactories(ConnectionFactoryConfigurer cfConfig, Environment env) {
        cfConfig.addConnectionFactory(facebookConnectionFactory());
    }

    @Override
    public UserIdSource getUserIdSource() {
        return new AuthenticationNameUserIdSource();
    }

    @Override
    public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {
        return new JdbcUsersConnectionRepository(dataSource, connectionFactoryLocator, Encryptors.noOpText());
    }

    // Other @Bean maybe ...
}

Отсюда вы можете добавить в Controller/RestController сопоставление с RequestParam для вашего токена, который вы будете отправлять на ваш сервер:

@Autowired
private FacebookConnectionFactory facebookConnectionFactory;

@Autowired
private UsersConnectionRepository usersConnectionRepository;

@RequestMapping(value = "/my-facebook-url", method = RequestMethod.POST)
public String fb(@RequestParam String token) {
    AccessGrant accessGrant = new AccessGrant(token);
    Connection<Facebook> connection = facebookConnectionFactory.createConnection(accessGrant);

    UserProfile userProfile = connection.fetchUserProfile();
    usersConnectionRepository.createConnectionRepository(userProfile.getEmail()).addConnection(connection);

    // ...

    return "Done";
}

Полезные ссылки