Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用ruby mechanize在浏览器中存储登录会话cookie_Ruby On Rails_Ruby_Cookies_Mechanize - Fatal编程技术网

Ruby on rails 使用ruby mechanize在浏览器中存储登录会话cookie

Ruby on rails 使用ruby mechanize在浏览器中存储登录会话cookie,ruby-on-rails,ruby,cookies,mechanize,Ruby On Rails,Ruby,Cookies,Mechanize,我正在尝试登录到一个网站,并从rails操作重定向到一个安全页面。我的代码看起来像这样 def redirect_to_external agent = Mechanize.new page = agent.get('http://example.com/home.asp') login_form = page.form_with(:name => "loginForm") login_form.login = 'username' login_form.

我正在尝试登录到一个网站,并从rails操作重定向到一个安全页面。我的代码看起来像这样

 def redirect_to_external 
   agent = Mechanize.new
   page = agent.get('http://example.com/home.asp')
   login_form = page.form_with(:name => "loginForm")
   login_form.login = 'username'
   login_form.password = 'password'
   agent.submit(login_form)

   #cookies = agent.cookie_jar.store.map {|i|  i} #need to store the cookie with a specific in browser
   redirect_to('http://example.com/admin.asp') #page behind password protection
 end

在后台登录成功,但由于会话cookie未存储在浏览器中,实际重定向到管理页面时再次要求在浏览器中进行身份验证。尝试从
cookie\u jar
存储cookie,但找不到确切的方法。有人能帮我吗?

请参考以下代码。这将在块中创建一个代码,这将维护身份验证

 def redirect_to_external 
    @agent = Mechanize.new
    @agent.get('http://example.com/home.asp') do | home_page | # Need to pass the others requests into the block
      login_form = home_page.form_with(:name => "loginForm")
      login_form.login = 'username'
      login_form.password = 'password'
      @agent.submit(login_form)
      #cookies = agent.cookie_jar.store.map {|i|  i} #need to store the cookie with a specific in browser
      @agent.get('http://example.com/admin.asp') #page behind password protection
   end  
 end

我和这个挣扎了很长时间!StackOverflow上的其他答案并没有确切说明如何缓存cookies并检索它们,因此我将我的经验与我阅读的其他答案结合到一个解决方案中

(见:

)

我使用这个解决方案为一个不支持真正OAuth2.0的网站创建了一个自定义OAuth2.0

  • 用户给了我其他站点的凭据。我通过会话控制器的create方法中的Mechanize将它们传递到站点上,并立即销毁了它们(我不想尽可能多地接触其他人的安全内容。这就是为什么这一切都在SSL下发生的原因)

  • 这意味着我的Mechanize实例和我需要的Cookie将在我重定向到应用程序中的任何其他位置时被销毁。例如,在我的应用程序中,我下一步重定向到我的
    会话控制器的
    索引方法。如果您是rails新手,您可能会认为相同的实例变量(如带有这些cookie的mechanize代理)可以从
    create
    index
    ,但这是错误的,每个重定向都会破坏一切!(基本上)

  • 因此,在重定向之前,您需要存储cookies。在请求之间存储类似内容的唯一方法是通过缓存,而缓存不喜欢存储整个mechanize实例。相反,您需要存储序列化的cookies。唯一的问题是,Mechanize没有将cookie输出为字符串的方法,它只能将cookie保存为文件。怎么办

  • 斯特林吉奥去营救!实际上,您可以使用StringIO伪造文件。经过这么多的讨论,下面是代码:

    @agent = Mechanize.new
    #handle the sign in stuff
    stringio = StringIO.new
    @agent.cookie_jar.save(stringio, session: true)
    cookies = stringio.string
    session[:login_cookies] = cookies
    
  • 注意,我将
    session:true
    传递给
    cookie\u jar
    的save方法。如果没有该参数,cookie将只保存非会话cookie

  • 因此,现在我们的会话缓存有一个字符串,其中包含来自mechanize的所有cookie。要在重定向后将其恢复,您需要再次使用StringIO:

    @agent = Mechanize.new
    cookies = session[:login_cookies]
    @agent.cookie_jar.load StringIO.new(cookies)
    
  • 瞧!你的新代理人已经准备好像旧代理人一样行事了


  • 将代理设置为实例变量,或将其传递给重定向到。它有饼干,不需要储存。谢谢。但是使@agent=Mechanize.new无效。此外,将_重定向到未将代理作为参数。请举个例子好吗?我不知道怎样才能不屈尊俯就地帮助你。想想为什么不应该将Mechanize对象实例化为方法的局部变量(提示-它不会停留太久)。我已经尝试将代理作为实例变量,但没有成功。问题是,它没有将会话cookie添加到浏览器(客户端)。因此,一旦我重定向到第三方网站,我的控制权将丢失。我正在研究如何使用Mechanize做完全相同的事情(保存cookies并加载它们,而不必保存和加载实际文件)。非常感谢你!发光的柱子!谢谢你!回答得很好,但我确实有一个问题:我对Ruby只稍微熟悉一点,所以我不确定
    会话[:login\u cookies]=cookies
    这行的语法是什么意思。当前获取错误,因为它不知道
    会话
    变量是什么。谢谢@TylerRussell
    session
    是一种行为类似于散列的方法。它应该在您的控制器中可用。看到这个帖子:@KCE谢谢你的回复,前几天我已经完成了。当做