发送一个POST,在Rails 3中创建一个从商业站点到应用程序站点的会话

时间:2012-10-19 15:12:52

标签: ruby-on-rails authentication devise

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

我正在尝试这个

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

1 个答案:

答案 0 :(得分: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很可能会忽略您的请求,因为您将丢失Rails在加载页面时自动生成的CSRF令牌。为了实现这一点,您将不得不在处理登录的控制器中放置一个protect_from_forgery方法调用。假设您的/ login路由映射到 SessionsController 操作创建

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请求的链接,只需要将 GET 路由映射到 SessionsController 的* demo_account *操作。这将另外允许此链接在任何地方使用,而不是仅在您的应用程序中使用(例如在@allaire建议的以前的评论者之一的电子邮件中)。但是,如果您希望它从Rails应用程序中的链接开始工作,那么只需忽略我关于CSRF令牌的部分答案。