Ruby on rails 使用ruby mechanize在浏览器中存储登录会话cookie
我正在尝试登录到一个网站,并从rails操作重定向到一个安全页面。我的代码看起来像这样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.
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
会话控制器的索引方法。如果您是rails新手,您可能会认为相同的实例变量(如带有这些cookie的mechanize代理)可以从create
到index
,但这是错误的,每个重定向都会破坏一切!(基本上)
@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
@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
这行的语法是什么意思。当前获取错误,因为它不知道会话
变量是什么。谢谢@TylerRussellsession
是一种行为类似于散列的方法。它应该在您的控制器中可用。看到这个帖子:@KCE谢谢你的回复,前几天我已经完成了。当做