[英]Store login session cookie in browser using ruby 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.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_jar
存儲 cookie,但找不到確切的方法。 有人可以幫助我嗎?
我與這個斗爭了很長時間! StackOverflow 上的其他答案並沒有完全解決如何緩存 cookie 和檢索它們,所以我將我的經驗與我讀過的其他答案結合到一個解決方案中。
(看:
Rails 3 - 登錄另一個站點並在會話中保留 cookie
使用 ruby mechanize 在瀏覽器中存儲登錄會話 cookie
獲取 Mechanize 以處理來自任意 POST 的 cookie(以編程方式登錄網站)
)。
我使用此解決方案為不支持真正 OAuth2.0 的網站創建了自定義 OAuth2.0。
用戶給了我另一個站點的憑據。 我通過我的 Sessions 控制器的 create 方法中的 Mechanize 將它們傳遞到站點上並立即銷毀它們(我不想盡可能多地接觸其他人的安全內容。這就是為什么這一切都在 SSL 下發生的原因)。
這意味着一旦我重定向到我的應用程序中的任何其他地方,我的帶有我需要的 cookie 的 Mechanize 實例就會被銷毀。 例如,在我的應用程序中,我接下來重定向到我的Sessions Controller
的index
方法。 如果您是 Rails 的新手,您可能認為從create
到index
都可以使用相同的實例變量(例如帶有這些 cookie 的機械化代理),但這是錯誤的,每次重定向都會破壞一切! (基本上)
所以在重定向之前,您需要存儲 cookie。 在請求之間存儲類似內容的唯一方法是通過緩存,而緩存不喜歡存儲整個機械化實例。 相反,您需要存儲序列化的 cookie。 唯一的問題是,Mechanize 沒有將其 cookie 輸出為字符串的方法,它只能將它們保存為文件。 該怎么辦?
StringIO 來救援! 您基本上可以使用 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_jar
的 save 方法。 如果沒有該參數,cookie 將只保存非會話 cookie。
所以現在我們的會話緩存有一個字符串,其中包含來自機械化的所有 cookie。 要在重定向后取回它們,您將再次需要 StringIO:
@agent = Mechanize.new cookies = session[:login_cookies] @agent.cookie_jar.load StringIO.new(cookies)
瞧! 您的新代理已准備好像舊代理一樣行事。
請參考以下代碼。這會在一個塊中創建一個代碼,這將保持身份驗證,
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.