ruby-on-rails - 使用 Clearance 的 Rails 应用程序的 Facebook 身份验证?

标签 ruby-on-rails ruby-on-rails-3 facebook clearance

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

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

最佳答案

我最终编码 this solution - 将它张贴在这里以防它可以帮助其他人(或者如果其他人有改进它的建议)。

这是一些逻辑:

该应用程序最初是使用 Clearance 进行身份验证/授权构建的,因此坚持使用 Clearance 可以让现有的名称/密码和现有的授权代码继续工作。

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

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

用户验证
许可验证用户的电子邮件地址。我们覆盖的 password_optional?功能基本上绕过了他们的密码验证。对于生产用途,此解决方案应包括用户验证以实现“您必须至少拥有有效密码或有效 omniauth 凭据之一”

session 创建
使用了 Clearance 的 session 模型(在 cookie 中存储一个 remember_token)。

session Controller 被覆盖以添加通过 FB 签名的方法。 FB 的回调路由到此方法,该方法创建/更新用户的身份验证数据并调用 Clearance 的 sign_in(user)

授权
保留了 Clearance 的简单模型:“授权”过滤器本质上只是检查有效用户是否已登录,并提供了 current_user 助手。

Facebook 用法
用户的 FB token 在 FB 身份验证后存储(在 belongs_to 用户的身份验证对象中)。考拉用于其他FB请求(例如发帖到用户的墙)……这里不再赘述;我没有做任何特别的事情。

FB token 刷新
FB token 会定期过期(并且 FB 的“离线访问”角色已弃用)。用户登录时会刷新 token ,但 token 可能会在应用 session 到期之前失效(当用户退出 FB、更改其 FB 密码或 token 到期时)。我正在研究如何在登录流程之外定期更新 FB token ,但这似乎超出了这个答案的范围。

关于ruby-on-rails - 使用 Clearance 的 Rails 应用程序的 Facebook 身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7668093/

相关文章:

ruby-on-rails - 默认情况下 simple_form - collection_check_boxes 在末尾显示 hidden_​​field

ruby-on-rails - Rails、已安装的 Gem 版本和 Gemfile.lock 版本

ruby-on-rails - 从数据库中删除旧记录 (Postgres/Rails)

c# - 热从链接获取网页的文本概述和照片-发布链接时类似于 facebook

facebook Graph API 发布到墙上不接受换行

ruby-on-rails - 如何悲观地锁定Rails中的多行?

ruby-on-rails - Capistrano Rails部署后重新启动服务

ruby - 验证值是否在特定范围内,例如1 <= 值 <=2

ruby-on-rails-3 - Sinatra Warden 与使用 Devise 的现有 Ruby on Rails 应用程序

ssl - Facebook 应用程序的 https