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

Posted

技术标签:

【中文标题】使用现有用户访问令牌使用 Spring Social 登录 Facebook【英文标题】:Facebook Login with Spring Social using Existing User Access Token 【发布时间】:2015-06-25 01:33:56 【问题描述】:

这是我目前拥有的:

许多 API 要求对用户进行身份验证的 Spring REST 服务 “注册”API (/api/v1/register) 采用用户名/密码 (/api/v1/login) 的“登录”API “Facebook 登录”API 依赖于 Spring Social 和 Spring Security 来创建用户连接并将我的用户登录 (/auth/facebook)

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

以下是移动场景:

我使用 Facebook 的 ios SDK 向用户请求许可 Facebook 返回用户访问令牌 我想向我的后端服务发送这个令牌并让 Spring Social 接受它,创建用户连接等。

这可以吗?还是我必须编写自己的 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";

有用的参考资料

UsersConnectionRepository ConnectionRepository

【讨论】:

嗨@Philippe!您是否使用过 spring-social-facebook 版本 2?谢谢 @troig,没错。我也有 spring-social-core/web/config/security:1.1.2 你有什么问题吗? 再次感谢@Philippe!正如你所说,它可以将 spring-social-core 版本升级到 1.1.2。我以前的版本(1.1.0)有一个错误。 +1 嗨菲利普。不幸的是,我不能接受它,因为我没有提出问题。也许@AlexG 可以考虑一下。再次感谢,在我的情况下它工作得很好 您可以使用 FacebookTokenAuthenticationFilter,它扩展了 Spring Social Security API 的 SocialAuthenticationFilter。 ***.com/questions/35911723/…

以上是关于使用现有用户访问令牌使用 Spring Social 登录 Facebook的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 安全性 - 允许使用过期 JWT 令牌的用户请求

ADAL使用AcquireTokenAsync和现有JWT令牌续订令牌

:REST spring security - 手动验证新用户并获取访问令牌

Spring以编程方式生成oauth2访问令牌

Spotify iOS sdk 使用现有访问令牌连接到 Spotify 远程应用程序

从 Spring Boot Rest Controller 访问 JWT 令牌