簡體   English   中英

使用 ruby​​ mechanize 在瀏覽器中存儲登錄會話 cookie

[英]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。

  1. 用戶給了我另一個站點的憑據。 我通過我的 Sessions 控制器的 create 方法中的 Mechanize 將它們傳遞到站點上並立即銷毀它們(我不想盡可能多地接觸其他人的安全內容。這就是為什么這一切都在 SSL 下發生的原因)。

  2. 這意味着一旦我重定向到我的應用程序中的任何其他地方,我的帶有我需要的 cookie 的 Mechanize 實例就會被銷毀。 例如,在我的應用程序中,我接下來重定向到我的Sessions Controllerindex方法。 如果您是 Rails 的新手,您可能認為從createindex都可以使用相同的實例變量(例如帶有這些 cookie 的機械化代理),但這是錯誤的,每次重定向都會破壞一切! (基本上)

  3. 所以在重定向之前,您需要存儲 cookie。 在請求之間存儲類似內容的唯一方法是通過緩存,而緩存不喜歡存儲整個機械化實例。 相反,您需要存儲序列化的 cookie。 唯一的問題是,Mechanize 沒有將其 cookie 輸出為字符串的方法,它只能將它們保存為文件。 該怎么辦?

  4. 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。

  1. 所以現在我們的會話緩存有一個字符串,其中包含來自機械化的所有 cookie。 要在重定向后取回它們,您將再次需要 StringIO:

     @agent = Mechanize.new cookies = session[:login_cookies] @agent.cookie_jar.load StringIO.new(cookies)
  2. 瞧! 您的新代理已准備好像舊代理一樣行事。

請參考以下代碼。這會在一個塊中創建一個代碼,這將保持身份驗證,

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM