将 Facebook Authentication 集成到 FacebookApp 中的 Spring Security
Posted
技术标签:
【中文标题】将 Facebook Authentication 集成到 FacebookApp 中的 Spring Security【英文标题】:Integrate Facebook Authentication into Spring Security in FacebookApp 【发布时间】:2011-09-18 12:45:56 【问题描述】:我有一个使用用户名/密码 SpringSecurity 配置的工作 Web 应用程序。现在我想将它移植到一个简单的 Facebook 应用程序中。出于某种原因,我想通过使用返回的 facebook 访问令牌以及保留用户名-密码验证器来进行身份验证。
详细来说,我会检查用户 facebook 访问令牌以进行身份验证,由以下人员返回:
https://graph.facebook.com/oauth/access_token?client_id=[my_api_key]&redirect_uri=[my_redirect_uri]&client_secret=[my_api_secret]&code=[code]
用户无需提供任何用户名/密码,因为他们已经使用 facebook 登录。但我想保留(用户名/密码)spring 安全配置,以便用户可以登录我的原始网站。
SpringSecurity 是否支持这种身份验证?如果答案是肯定的,我想知道如何做到这一点?我需要编写自定义身份验证提供程序吗?
更新:最后我们自定义了SpringSecurity的认证方式,通过扩展UsernamePasswordAuthenticationFilter
(声明为formLoginFilter
)接受access_token作为认证参数
【问题讨论】:
@HaveAGuess:我已经更新了我在问题中的答案。 【参考方案1】:Spring 的另一个项目:Spring Social 非常有用。
它支持多个社交网络。我成功地使用它向 Facebook 进行身份验证。然后我编写了一个小函数来将 Facebook 用户登录到我的 Spring Security 上下文中:
protected void authenticate(UserDTO user)
SecurityContextHolder.getContext().getAuthentication();
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword());
token.setDetails(new WebAuthenticationDetails(getRequest()));
Authentication authentication = authenticationManager.authenticate(token);
SecurityContextHolder.getContext().setAuthentication(authentication);
UserDTO
需要有用户名和(生成的)密码属性,并且需要保存在数据库中,以便您的 user-service
(来自 Spring 安全性)可以检索它。
【讨论】:
Bart Vangeneugden 它不工作...显示错误..我也包括了 spring api..是否还有任何要添加的 api【参考方案2】:你的想法是正确的......
这是一篇关于使用 Spring Security 的多个身份验证提供程序的文章(例如,一个表单登录、一个 facebook 登录和一个带有 open-id 的登录)。
http://thoean.com/programming/java/multiple-authentication-provider-with-spring-security/
希望对你有所帮助:D
【讨论】:
以上是关于将 Facebook Authentication 集成到 FacebookApp 中的 Spring Security的主要内容,如果未能解决你的问题,请参考以下文章
Spring Social Authentication Filter for Stateless REST Endpoints 使用 Facebook Token 进行身份验证
Laravel Socialite 与 Facebook 未登录
Facebook 的 FirebaseUI 身份验证不起作用
ASP.NET Web API Authentication.GetExternalLoginInfoAsync 始终返回 null