2013-09-03 1 views
9

웹 사이트에 로그인하고 레일스 조치로 보안 페이지로 리디렉션하려고합니다. 내 코드는 다음과 같습니다.ruby를 사용하여 브라우저에 로그인 세션 쿠키 저장 mechanize

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_jar에서 쿠키를 저장하려고 시도했지만 정확한 방법을 찾을 수 없습니다. 누군가가 나를 도울 수 있습니까?

+0

에이전트를 인스턴스 var로 만들거나 redirect_to로 전달하십시오. 쿠키가있어 저장하지 않아도됩니다. – pguardiario

+0

감사합니다. 그러나 @agent = Mechanize.new가 작동하지 않았습니다. 또한 redirect_to가 에이전트를 매개 변수로 사용하지 않습니다. 그걸 보여줄 수 있습니까? – Vijendra

+0

나는 자만하지 않고 너를 도울 줄 모른다. Mechanize 객체를 여러분의 메쏘드의 지역 변수로 인스턴스화하지 않아야하는 이유에 대해 생각해보십시오. (힌트 - 오래 걸리지 않을 것입니다.) – pguardiario

답변

1

코드를 제공해은 블록이 유지 인증 내에서 코드를 생성 다음을 참조하십시오,

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

는 나는 오랫동안이 일 고투! StackOverflow에 대한 다른 답변은 쿠키를 캐시하고 검색하는 방법을 정확히 설명하지 못했기 때문에 내가 읽은 다른 대답과 내 경험을 결합하여 여기에 하나의 해결책을 제시합니다.

(참조 :

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

).

실제 OAuth2.0을 지원하지 않는 웹 사이트에 대해 맞춤 OAuth2.0을 만들 때이 솔루션을 사용했습니다.

  1. 사용자가 다른 사이트에 대한 자격 증명을 제공했습니다. 내 세션 제어기의 작성 메소드에서 Mechanize를 통해 사이트로 전달하고 즉시 폐기했습니다. (가능한 한 다른 사람의 보안 정보에 접촉하고 싶지 않습니다.이 모든 것이 SSL 하에서도 일어나는 이유입니다.)

  2. 즉, 내 앱에서 다른 곳으로 리디렉션하면 필요한 쿠키가 포함 된 Mechanize 인스턴스가 삭제됩니다. 예를 들어, 내 응용 프로그램에서 다음 index 메서드로 내 Sessions Controller 리디렉션했습니다. 레일스를 처음 사용하는 경우 create에서 index까지 동일한 인스턴스 변수 (해당 쿠키가있는 기계화 에이전트와 같음)를 사용할 수 있다고 생각할 수도 있지만 그게 잘못되면 각 리디렉션이 모든 것을 파괴합니다! (기본적으로)

  3. 그래서 리디렉션 전에 쿠키를 저장해야합니다. 이러한 요청을 캐시간에 저장하는 유일한 방법은 캐시를 통해 전체 mechanize 인스턴스를 저장하는 것을 좋아하지 않습니다. 대신 직렬화 된 쿠키를 저장해야합니다. 유일한 문제는 Mechanize가 쿠키를 문자열로 출력하는 방법을 가지고 있지 않아 파일로 저장할 수 있다는 것입니다. 무엇을해야합니까?

  4. StringIO to the rescue! 근본적으로 StringIO로 파일을 위조 할 수 있습니다. 내가 cookie_jar의 저장 방법에 session: true을 통과

    @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 
    

참고 : 모든 것을 이야기 한 후, 여기에 코드입니다. 이 매개 변수가 없으면 쿠키는 비 세션 쿠키 만 저장합니다.

  1. 이제 세션 캐시에는 mechanize의 쿠키가 모두 포함 된 문자열이 있습니다. 리디렉션 후에 리디렉션을 다시 얻으려면 다시 StringIO가 필요합니다.

    @agent = Mechanize.new 
    cookies = session[:login_cookies] 
    @agent.cookie_jar.load StringIO.new(cookies) 
    
  2. 그리고 voila! 새 에이전트는 이전 에이전트처럼 행동 할 준비가되었습니다.

+0

Mechanize로 똑같은 작업을 수행하는 방법을 찾고있었습니다 (쿠키를 저장하고 실제 파일을 저장하고로드하지 않고로드합니다). 정말 고맙습니다! – uechan

+0

빛나는 게시물! 감사합니다! – flunder

+0

대단한 반응이지만 나는 1 개의 질문을 가지고있다 : 나는 Ruby에 대해서만 익숙하므로'session [: login_cookies] = cookies' 행에서 구문이 무엇을 의미하는지 확신 할 수 없다. 'session' 변수가 무엇인지 알지 못하기 때문에 현재 오류가 발생합니다. 감사! –