Ruby on rails 使用许可证对Rails应用程序进行Facebook身份验证?

Ruby on rails 使用许可证对Rails应用程序进行Facebook身份验证?,ruby-on-rails,ruby-on-rails-3,facebook,clearance,Ruby On Rails,Ruby On Rails 3,Facebook,Clearance,我正在编写一个Rails 3.1应用程序,使用授权许可。我想添加标准Facebook认证:允许用户直接(使用许可)或通过FB继续向我们注册/认证;如果他们通过FB登录/注册,并且我们已经拥有相关电子邮件地址的帐户,请合并这些帐户 关于使用OmniAuth/Desive有很多很好的文档,但我还没有找到类似的文档。是否有(积极维护的)gems在这里提供帮助,甚至只是教程?到目前为止,我发现最好的是BlueLightSpecial,但无论是它还是它用于FB Connect的gem似乎都不再积极维护 d

我正在编写一个Rails 3.1应用程序,使用授权许可。我想添加标准Facebook认证:允许用户直接(使用许可)或通过FB继续向我们注册/认证;如果他们通过FB登录/注册,并且我们已经拥有相关电子邮件地址的帐户,请合并这些帐户


关于使用OmniAuth/Desive有很多很好的文档,但我还没有找到类似的文档。是否有(积极维护的)gems在这里提供帮助,甚至只是教程?到目前为止,我发现最好的是BlueLightSpecial,但无论是它还是它用于FB Connect的gem似乎都不再积极维护

designe/OmniAuth的好处在于它与其他API(Twitter、Facebook等)的无缝集成

您可以尝试使用现有的gems来制作您自己的与Clearance的定制集成。例如:(虽然这个宝石已经有一段时间没有维护了)。仍然很有效

还有考拉-与OAuth身份验证和Facebook Graph API配合使用。

我最后编写了代码-将其发布在这里,以防它能帮助其他人(或者其他人有改进建议)

以下是一些逻辑:

该应用程序最初是为认证/授权而创建的,因此坚持使用许可证可以让现有名称/密码和现有授权代码继续工作

用户标识
清除使用电子邮件地址作为主要标识符。该应用程序需要每个用户都有一个用于其他目的的电子邮件地址,因此我们将继续使用电子邮件作为主要用户id。如果用户通过FB注册,我们将在用户注册时从FB获取电子邮件。(请注意,omniauth facebook请求一组可配置的FB权限;默认情况下包括对电子邮件地址的访问)

用户注册
新用户可以选择创建电子邮件/pwd组合,或通过FB注册。Omniauth facebook用于针对FB进行身份验证(并允许随着时间的推移扩展到其他身份验证系统)。我们从FB获得用户数据(姓名、电子邮件等),外加一个Facebook身份验证令牌。通过这种方式进行身份验证的用户不需要提供密码。选择不使用FB注册的用户提供电子邮件地址、密码和其他用户数据。通过FB登录创建的用户被带到用户/编辑,以完成提供我们无法从FB获取的任何配置文件详细信息。我们还保留现有的用户注册机制,允许用户手动提供电子邮件/pwd/其他详细信息

用户验证
清除验证用户的电子邮件地址。我们的覆盖密码是可选的吗?函数基本上绕过了密码验证。对于生产使用,此解决方案应包括用户验证,以实现“您必须至少拥有一个有效的pwd或有效的omniauth凭据”

会话创建
使用Clearance的会话模型(在cookie中存储一个memory_令牌)

重写会话控制器以添加通过FB签名的方法。FB的回调路由到此方法,该方法创建/更新用户的身份验证数据并调用许可证的登录(用户)

授权
Clearance的简单模型被保留:“authorize”过滤器实际上只是检查是否有有效的用户登录,以及是否提供了当前的用户助手

FB使用情况
用户的FB令牌在FB身份验证后存储(在属于用户的身份验证对象中)。考拉用于其他FB请求(例如,张贴到用户的墙上)…这里省略了详细信息;我没有做任何特殊的事情

FB令牌刷新

FB令牌会定期过期(FB的“脱机访问”角色不推荐使用)。当用户登录时,令牌会刷新,但在应用程序会话过期之前,令牌可能会变得无效(当用户注销FB、更改FB密码或令牌过期时)。我正在研究如何在登录流之外定期更新FB令牌,但这似乎超出了此答案的范围。

是的-我最终就是这么做的…我添加了一个更详细的答案。此外,值得注意的是,此代码没有处理来自FB的身份验证失败…要在生产中使用,请为失败的om添加适当的处理程序niauth调用.Omniauth将失败路由到/auth/failure,并将错误放入名为“message”的参数中。创建一个操作来处理错误,并将/auth/failure路由到routes.rb中。