2014-11-16 2 views
2

세션 쿠키를 수동으로 deserialize하여 사용자를 추출해야합니다. 환경은 http 서버 컨텍스트에 있지 않지만 레일입니다. 따라서 자동으로 deserialise 할 장치가 필요하지 않습니다. Warden :: SessionSerializer가 있습니다. 실제로 사용법을 알지 못했습니다. 어떤 사람들은 수동으로 쿠키를 역 직렬화하는 것은 이제까지 할 수있는 상황이 있는지 의심 될 수 있기 때문에장치/감시 세션 쿠키에서 사용자 가져 오기

def decrypt_cookie(cookie) 
    cookie = CGI.unescape(cookie) 
    config = Rails.application.config 

    encrypted_cookie_salt = config.action_dispatch.encrypted_cookie_salt 
    encrypted_signed_cookie_salt = config.action_dispatch.encrypted_signed_cookie_salt 

    key_generator = ActiveSupport::KeyGenerator.new(config.secret_key_base, iterations: 1000) 
    secret = key_generator.generate_key(encrypted_cookie_salt) 
    sign_secret = key_generator.generate_key(encrypted_signed_cookie_salt) 

    encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret) 
    encryptor.decrypt_and_verify(cookie) 
end 

: 내가 고안를 사용하지되기 전에

은 그래서 레일 세션 쿠키를 직렬화하기 위해이 방법을 사용 적절한 : 클라이언트 (브라우저)는 HTTP를 통해 인증되며 세션은 물론 쿠키에 저장됩니다. Rails는 특정 권한 동작에 응답하는 websocket 서버도 실행합니다 (레일 러너). 이 경우 사용자를 (다시) 인증해야합니다. 누군가 다른 방식 (더 나은)을 보게되면 그것을 읽게되어 기쁩니다. :)

답변

0

쿠키를 deserialize하는 방법은 올바른 방법입니다. 그것은 Devise에서 실제로 동일합니다. 키가 방금 변경되었으며 계속해서 다른 serilization 프로세스가 진행되어야한다는 결론을 내 렸습니다.

-1

컨트롤러의 session 개체에 액세스 할 수 있습니다. user_id를 저장하기 위해 어떤 키를 사용합니까? session[:key]을 수행 할 수 있어야합니다. 따라서 ID를 user_id로 저장하는 경우 session[:user_id]으로 저장하십시오.

+0

레일 스크립트로 스크립트를 시작하기 때문에 (일반 환경이로드되므로) 컨트롤러 내부에 있지 않으므로 궁극적으로 나를 비 직렬화하지 않았습니다. –

+0

Warden 객체에 접근 할 수 있다면 (질문에 주어진 스크립트에서 할 수 있다고 가정하면)'# {warden_instance} .request.session'을 사용할 수 있습니다. – Bryce

+0

요청도없고, http가 아닌 컨텍스트 –

-1

Devise를 사용해야합니까? 나는 posted previously에 대해 Warden을 사용하여 완벽하게 통제 할 수있는 자신 만의 토큰 인증을 롤백합니다. 내게 쉬운 일을하고 스스로 인증을 구현하기로 결정한 경우 모델을 통해 토큰에서 사용자를 쉽게 찾을 수 있습니다.

+0

예, 고맙습니다. 그러나 고안이 필요합니다. 나는 내 자신의 확인/리셋/... 논리를 작성하지만, 나는 그것을 처리하는 방법을 좋아한다. –