【问题标题】:Send a POST creating a session from commercial site to application site in Rails 3在 Rails 3 中发送从商业站点到应用程序站点的 POST 创建会话
【发布时间】:2012-10-10 05:53:28
【问题描述】:

我希望用户无需注册帐户即可测试我的应用程序。为了做到这一点,我考虑在我的商业站点中包含一个链接,该链接将向我的应用程序站点(http://app/login using devise)发送一个固定的用户和密码,从而创建一个会话。我尝试使用 link_to 和 :method => 'post' 但我不知道如何在 POST 正文中发送参数!有什么建议吗?

我正在尝试这个

link_to 'Blah', {:params => 'asdf'}, {:method => :post, :href => 'http://localhost:3001/login'}

【问题讨论】:

  • 您如何将链接发送给他们?例如通过电子邮件?因为这将创建一个 GET 请求,而不是一个 POST 请求。
  • 链接将在商业网站中。您只需进入商业应用程序,点击链接,即可登录真实应用程序。我忘了提到我正在使用带有选项的link_to :method => :post。

标签: ruby-on-rails authentication devise


【解决方案1】:

为了传递查询参数,您需要像处理 GET 请求一样将它们作为 URL 的一部分。像这样:

<%= link_to "Click Here", "/login?username=testuser&password=moojuice", :method => :post %>

或者,如果您正在使用 Rails 路由助手

<%= link_to "Click here", login_path(:username => "testuser", :password => "moojuice"), :method => :post %>

根据最初的问题,我不确定您是否会在与您登录的应用程序相同的 Rails 应用程序中使用此链接。如果你不是,还有另一个小问题。从外部站点发帖时,Rails 很可能会忽略您的请求,因为您将丢失 Rails 在加载页面时自动生成的 CSRF 令牌。为了实现这一点,您必须在处理您的登录的控制器中调用protect_from_forgery 方法。假设您的 /login 路由映射到 SessionsController 操作 create

class SessionsController < ApplicationController
  protect_from_forgery :except => [:create] # Need this to ignore CSRF token
  def create
    # Login logic
  end
end

话虽如此,我不建议删除 CSRF 令牌,因为这会降低您的应用程序的安全性。我建议在您的 SessionsController 中实施一个特殊操作,将它们登录到自己的 Session 中,如下所示:

class SessionsController < ApplicationController

  def create
    # Login logic
  end

  def demo_account
    # Logic to create session for demo account
  end
end

通过这种方式,您可以忘记执行 POST 请求的链接,而只需将 /demo_login 映射到 SessionsController 的 *demo_account* 操作的 GET 路由。这将另外允许此链接在任何地方使用,而不仅仅是在您的应用程序中(例如在电子邮件中,正如之前的评论者 @allaire 所建议的那样)。但是,如果您希望它通过 Rails 应用程序中的链接工作,那么请忽略我关于 CSRF 令牌的答案部分。

【讨论】:

  • 哦,谢谢!有趣的是,这是有效的。我没有在同一个 Rails 应用程序中使用该链接。 link_to 位于商业网站中,此链接对创建会话的应用程序进行 POST。是的,我已经考虑过authenticity_token,但令人惊讶的是它正在工作。如何?我认为我不喜欢的是,当我输入登录数据(用户、密码和 remember_me)时,用户可以在浏览器底部看到密码和用户名,这可能会给用户一种不安全的感觉。为什么我不能在 POST 正文中发送参数?
  • 为什么登录有效(因为authenticity_token)我不知道。但是我检查了我的应用程序日志,当我发送 POST 时,它说:警告:无法验证 CSRF 令牌的真实性,但是我仍然可以登录...
  • 感知安全性是我建议使用创建单独操作的方法来处理它的另一个原因。出现在 URL 中的这种限制仅仅是因为 link_to 是如何实现的。当您在 link_to 上设置方法然后单击它时,jquery-rails 会创建一个表单,然后将其作为 POST 请求提交。这一切都是在 javascript 中完成的,所以我只是认为他们简化了它而不是解析他们将发布到 URL 的参数,Rails 将取出这些参数。否则浏览器中的链接无法在没有这种覆盖的情况下执行 POST 请求。
  • 如果你想再混淆一些,你可以在自己的商业网站上手动编写一些jQuery来处理post请求。这只是肤浅的,好像有人真的想知道,他们可以挖掘您网站的来源。但是,如果这只是您担心的感知,那将有所帮助。关于 CSRF 令牌,我不确定。我知道根据我的经验,我的请求被拒绝了。但是我在我自己的应用程序的开发/生产中都尝试了它,它就像你说的那样工作。也许默认的 Rails 行为在某个时候被改变了?
  • 谢谢它现在更清楚了...我喜欢在我的会话控制器中创建一个新动作的方法。我正在使用 devise 作为我的身份验证系统,您知道如何添加新方法来设计会话控制器吗?
猜你喜欢
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 2014-07-21
  • 2021-12-29
  • 2010-10-10
  • 2011-02-19
相关资源
最近更新 更多