Ste*_*rne 4 facebook ruby-on-rails clearance ruby-on-rails-3
我正在编写一个Rails 3.1应用程序,使用Clearance for auth.我想添加标准的Facebook身份验证:允许用户继续直接注册/认证(使用Clearance)或通过FB注册; 如果他们通过FB登录/注册并且我们已经拥有相关电子邮件地址的帐户,请合并帐户.
有很好的文档可以使用OmniAuth/Devise,但我没有找到类似的清除.那里有(积极维护的)宝石在这里提供帮助,甚至只是教程吗?到目前为止我发现的最好的是BlueLightSpecial,但是它和FB Connect使用的它不再是主动维护的.
我最终编写了这个解决方案 - 在这里发布它以防万一它可以帮助其他人(或者如果其他人有改进它的建议).
这是一些逻辑:
该应用程序最初是使用Clearance进行身份验证/授权构建的,因此坚持使用Clearance允许现有的名称/代码和现有的授权代码继续工作.
用户识别
清除使用电子邮件地址作为主要标识符.该应用程序需要每个用户都有一个电子邮件地址用于其他目的,因此我们将继续使用电子邮件作为主要用户ID.如果用户通过FB注册,我们会在用户注册时从FB获取它.(请注意,omniauth-facebook请求一组可配置的FB权限;默认情况下包含对电子邮件地址的访问权限).
用户注册
新用户可以选择创建email/pwd组合,也可以选择通过FB注册.Omniauth-facebook用于对FB进行身份验证(并允许随着时间的推移扩展到其他身份验证系统).我们从FB获取用户数据(姓名,电子邮件等)以及Facebook身份验证令牌.以这种方式验证的用户不需要提供密码.选择不使用FB注册的用户提供电子邮件地址,密码和其他用户数据.通过FB登录创建的用户将被带到用户/编辑,以完成我们无法从FB获取的任何配置文件详细信息.我们还保留现有的用户注册机制,允许用户手动提供电子邮件/密码/其他详细信息.
用户验证
清除验证用户的电子邮件地址.我们覆盖了password_optional?功能基本上绕过了他们的密码验证.对于生产用途,此解决方案应包括用户验证以实现"您必须至少拥有一个有效的pwd或有效的omniauth信用"
会话创建使用
Clearance的会话模型(在cookie中存储remember_token).
重写会话控制器以添加通过FB进行签名的方法.从FB路由回调到此方法,该方法创建/更新用户的auth数据并调用Clearance的sign_in(用户)
Authorization
Clearance的简单模型被保留:'authorize'过滤器基本上只检查有效用户是否已登录,并提供current_user帮助程序.
FB用法
用户的FB令牌存储在FB身份验证之后(在属于用户的身份验证对象中).Koala用于其他FB请求(例如,发布到用户的墙上)...此处省略了详细信息; 我没有做任何特别的事.
FB令牌刷新
FB令牌定期到期(并且不推荐使用FB的"离线访问"角色).用户登录时会刷新令牌,但在应用会话到期之前(当用户退出FB,更改其FB密码或令牌过期时)令牌可能会变为无效.我正在研究如何在登录流程之外定期更新FB令牌,但这似乎超出了这个答案的范围.
Devise/OmniAuth 的好处是它与其他 API(Twitter、Facebook 等)的无缝集成。
您可以尝试使用现有的 gem 来构建您自己的与 Clearance 的自定义集成。例如: https: //github.com/nsanta/fbgraph(虽然这个 gem 已经有一段时间没有维护了)。仍然运作良好。
还有 Koala https://github.com/arsduo/koala - 可与 OAuth 身份验证和 Facebook Graph API 配合使用。