ruby-on-rails - 工作流程和安全? Ruby on Rails API,用于使用 facebook 登录的分离前端

标签 ruby-on-rails facebook security devise frontend

在具有标准设计+facebook 登录的标准当前 ruby​​ on rails 应用程序中,我正在构建 API。应用程序必须准备好使用 node.js 或/和 angular.js 编写的单独前端。在 RoR 方面,我使用标准 token 访问保护 API:

private

  def authenticate_user_from_token!
    user_email = params[:email].presence
    user       = user_email && User.find_by_email(user_email)

    # Notice how we use Devise.secure_compare to compare the token
    # in the database with the token given in the params, mitigating
    # timing attacks.    

    if user && Devise.secure_compare(user.authentication_token, params[:token])
      sign_in user, store: false
    end
  end

现在的工作流程是如何使用 facebook 或任何其他 omniauth 提供商进行登录/注册。我最简单的想法是为前端提供链接,例如

<a href="http://somewhere:8080/users/auth/facebook?target=http://somewhere:80/login.php">Facebook</a>
  1. 让 rails(facebook-omniauth) 完成 facebook 身份验证的工作,并从 rails(omiauthcallback controller) 响应重定向到我们已经传递的目标 url(frontend) + &token=abcded作为该用户的 token 。

  2. 让前端存储 token 并在与 API 对话时在每个请求中使用它

上面的工作流程有效,但肯定可以做得更好。什么是最佳实践?

  1. 如何让前端完成工作并在 facebook 中验证用户? (passport.js) 然后将 facebook-info 重新发送到 API 并将此信息存储在那里?

  2. 让后端完成工作并验证 facebook 中的用户(设计 omniauth)。我仍然可以使用 session sign_in user, store: true 并且不需要 token ?只是将浏览器重定向到前端?

谢谢。

最佳答案

从客户端应用程序获得 OmniAuth 请求将使您的应用程序更具可扩展性。这样服务器就不必等待 Facebook 的响应并阻止您的 Rails 集群。如果安全对您来说是个问题,那么您可能希望您的 api 通过 https 与客户端应用程序通信。

关于ruby-on-rails - 工作流程和安全? Ruby on Rails API,用于使用 facebook 登录的分离前端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23600714/

相关文章:

regex - 在哪些语言中使用用户提供的正则表达式是一个安全漏洞?

ruby-on-rails - Rails 3.1.x-image_tag在生产模式下不使用预编译的文件

javascript - FB 登录按钮不调用 onlogin 函数

ruby-on-rails - ruby on rails 中的 Payflow 支付集成

ruby-on-rails - 需要 SSL 来支持我网站上的 Facebook 身份验证吗?

internet-explorer - Facebook Connect 登录不再适用于 IE

java - Servlet 过滤器作为 Web 应用程序的安全性

security - 为什么我不应该在 OAuth 2.0 的移动应用程序中保留 client_secret (授权代码授予流程)

ruby-on-rails - rails 3 和 ruby​​zip 1.0.0 未初始化常量 Zip::ZipFile

ruby-on-rails - 查询嵌套的 jsonb Postgres 列