Facebook使用现有用户访问令牌登录Spring Social

Ale*_*exG 15 rest spring-security ios spring-social spring-social-facebook

这是我现在拥有的:

  • Spring REST服务,其中许多API要求用户进行身份验证
  • '注册'API(/ api/v1/register)
  • 采用用户名/密码的"登录"API(/ api/v1/login)
  • 'Facebook Login'API依赖Spring Social和Spring Security创建用户连接并在(/ auth/facebook)中记录我的用户

我的问题是我希望这些API被多个客户端使用,但Facebook登录的方式现在,它在移动设备上运行不佳(在网站上运行良好).

这是移动方案:

  • 我使用Facebook的iOS SDK来请求用户的许可
  • Facebook返回用户访问令牌
  • 我想发送我的后端服务此令牌并让Spring Social接受它,创建用户连接等.

可以这样做吗?或者我是否必须编写自己的API来持久保存用户连接?

感谢任何帮助!

Phi*_*ppe 10

我有完全相同的问题,这就是我如何使它工作.您可能在某处具有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 ...
}
Run Code Online (Sandbox Code Playgroud)

从这里开始,您可以在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";
}
Run Code Online (Sandbox Code Playgroud)

有用的参考