2011-11-18 2 views
2

나는 내가 놀고있는 간단한 Sinatra 앱을 가지고 있는데, 어떤 이유로 쿠키가 특정 경로에서 작동하지 않는 것으로 보입니다.이 경로는 상당히 기괴합니다. 내가 쿠키에 가면 내가 쿠키에 가면시나 트라 쿠키가 특정 경로에서 사라집니다?

require "sinatra" 

set(:authenticate) do |*vars| 
    condition do 
     unless request.cookies.has_key?("TestCookie") 
      redirect to("/login"), 303 
     end 
    end 
end 

get "/login" do 
    return "No valid cookie" 
end 

get "/secret", :authenticate => [:auth_cookie] do 
    cookie = request.cookies["TestCookie"] 
    return "Secrets ahoy - #{cookie}" 
end 

get '/cookie/set' do 
    response.set_cookie("TestCookie", { 
     :expires => Time.now + 2400, 
     :value => "TestValue" 
    }) 
    return "Cookie is set" 
end 

get '/cookie/get' do 
    cookie = request.cookies["TestCookie"] 
    return "Cookie with value #{cookie}" 
end 

/제대로 (firecookie에서 볼 수 있음) 쿠키를 설정 설정 한 다음/I 올바른 쿠키 출력을 얻을 수. 그러나/secret에 가면 항상/login으로 리디렉션됩니다. 아직 Ruby 구문에 대해 상당히 익숙하기 때문에 인증 확장 프로그램 내 조건에 문제가있을 수 있다고 생각하여 쿠키를 제거하고 다른 쿠키처럼 쿠키를 뱉어 내 보았습니다. 그러나 아직 아무것도 없으므로 쿠키가있는 이유를 놓치지 않고 브라우저에서 볼 수 있습니다 ... 쿠키는 작동하지만 비밀은 않습니다.

Am I 여기 뭔가가 없어?

답변

5

문제는 쿠키가 경로 /cookie으로 설정된다는 것입니다. 쿠키를 설정할 때 경로를 지정할 수 있습니다. 경로는 사실상 쿠키를 적용 할 웹 사이트의 하위 부분입니다. Sinatra/Rack은 기본적으로 현재 요청의 경로를 사용합니다. /cookie/set/cookie입니다.

당신은 명시 적 경로를 지정하여 예상대로 작동하도록 할 수 있습니다

response.set_cookie("TestCookie", { 
    :expires => Time.now + 2400, 
    :value => "TestValue", 
    :path => '/' 
    }) 

아니면라는 경로에 쿠키를 설정할 수 있습니다 그 실현을 didnt, /cookie-set보다는 /cookie/set

+0

아 말하기를, 경로를 생략하면 루트 수준에 놓이게 될 것이라고 생각했지만 모두 의미가 있습니다. 고마워! – Grofit