2013-09-03 46 views
9

Tôi đang cố gắng đăng nhập vào một trang web và chuyển hướng đến một trang được bảo mật từ hành động đường ray. Mã của tôi trông giống như thế này.Cookie phiên đăng nhập cửa hàng trong trình duyệt bằng cách sử dụng cơ chế ruby ​​

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 

Đăng nhập thành công trong nền, nhưng chuyển hướng thực sự đến trang quản trị đang yêu cầu xác thực trong trình duyệt vì cookie phiên không được lưu trữ trong trình duyệt. Đã thử lưu trữ các cookie từ cookie_jar, nhưng không thể tìm thấy cách chính xác để thực hiện điều đó. Ai đó có thể giúp tôi trong việc này?

+0

Đặt đại lý một ví dụ var hoặc chuyển nó sang redirect_to. Nó có cookie, không cần phải lưu trữ nó. – pguardiario

+0

Cảm ơn. Nhưng làm cho @agent = Mechanize.new không hoạt động. Ngoài ra, redirect_to không lấy đại lý làm tham số. Có thể hiển thị một ví dụ cho điều đó không? – Vijendra

+0

Tôi không biết làm thế nào để giúp bạn mà không bị hạ mình. Chỉ cần suy nghĩ về lý do tại sao bạn không nên instantiating đối tượng Mechanize như là một biến địa phương của phương pháp của bạn (gợi ý - nó sẽ không dính xung quanh lâu dài.) – pguardiario

Trả lời

1

Vui lòng tham khảo sau code.This tạo ra một mã trong một khối này sẽ duy trì thẩm định,

def redirect_to_external 
    @agent = Mechanize.new 
    @agent.get('http://example.com/home.asp') do | home_page | 
    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 
6

tôi vật lộn với cái này trong một thời gian dài! Các câu trả lời khác trên StackOverflow không chính xác địa chỉ làm thế nào để bộ nhớ cache các cookie và lấy chúng, vì vậy tôi kết hợp kinh nghiệm của tôi với các câu trả lời khác tôi đã đọc, vào một giải pháp ở đây.

(Xem:

Rails 3 - Log into another site and keep cookie in session

Store login session cookie in browser using ruby mechanize

Get Mechanize to handle cookies from an arbitrary POST (to log into a website programmatically)

keep mechanize page over request boundaries

).

Tôi đã sử dụng giải pháp này để tạo OAuth2.0 tùy chỉnh cho trang web không hỗ trợ OAuth2.0 thực.

  1. Người dùng đã cấp cho tôi bằng chứng xác thực cho trang web khác. Tôi đưa chúng vào trang web thông qua Mechanize trong phương thức tạo của bộ điều khiển Phiên của tôi và ngay lập tức tiêu diệt chúng (Tôi không muốn chạm vào những thứ an toàn của người khác càng nhiều càng tốt. Đó là lý do tại sao tất cả điều này cũng diễn ra dưới dạng SSL).

  2. Điều đó có nghĩa là trường hợp Cơ chế của tôi với các cookie tôi cần sẽ bị hủy khi tôi chuyển hướng bất kỳ nơi nào khác trong ứng dụng của mình. Ví dụ: trong ứng dụng của tôi, tôi đã chuyển hướng đến phương thức index của mình Sessions Controller. Nếu bạn mới dùng ray, bạn có thể nghĩ rằng các biến mẫu giống nhau (như tác nhân cơ giới hóa với các cookie đó) sẽ có sẵn từ create đến index, nhưng đó là sai, mỗi chuyển hướng sẽ phá hủy mọi thứ! (về cơ bản)

  3. Vì vậy trước khi chuyển hướng, bạn cần lưu trữ các cookie. Cách duy nhất để lưu trữ một cái gì đó như thế này giữa các yêu cầu là thông qua bộ nhớ cache, và bộ nhớ cache không thích để lưu trữ toàn bộ cơ thể dụ. Thay vào đó, bạn cần phải lưu trữ các tập tin cookie được tuần tự hóa. Vấn đề duy nhất là, Mechanize không có phương thức xuất cookie của nó như là một chuỗi, nó chỉ có thể lưu chúng dưới dạng một tệp. Phải làm gì?

  4. StringIO để giải cứu! Bạn về cơ bản có thể giả mạo một tập tin với StringIO. Sau khi tất cả nói chuyện rằng, đây là các mã:

    @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 
    

Lưu ý rằng tôi đã thông qua session: true đến phương pháp tiết kiệm của cookie_jar. Không có tham số đó, cookie sẽ chỉ lưu các cookie không phiên.

  1. Vì vậy, bộ nhớ cache phiên của chúng tôi có một chuỗi có tất cả các cookie từ cơ giới hóa. Để đưa họ trở lại sau khi chuyển hướng, bạn cần có lại StringIO:

    @agent = Mechanize.new 
    cookies = session[:login_cookies] 
    @agent.cookie_jar.load StringIO.new(cookies) 
    
  2. Và thì đấy! Đại lý mới của bạn đã sẵn sàng hoạt động giống như một đại lý cũ.

+0

Đã tìm cách làm điều tương tự với Mechanize (lưu cookie và tải chúng mà không phải lưu và tải các tệp thực). Cảm ơn bạn rất nhiều! – uechan

+0

Bài đăng phát sáng! Cảm ơn bạn! – flunder

+0

Phản hồi tuyệt vời, tôi có một câu hỏi mặc dù: Tôi chỉ quen thuộc với Ruby, vì vậy tôi không chắc cú pháp có nghĩa là gì trên dòng 'session [: login_cookies] = cookies' đang làm. Hiện đang gặp lỗi vì không biết biến 'session' là gì. Cảm ơn! –

Các vấn đề liên quan