3

내 응용 프로그램의 구성 요소는 다음과 같습니다.grape api 끝점에서 활성 관리 사용자를 인증합니다.

admin 패널은 myapp.com/admin에서 활성 관리로 작성되었습니다. AnglesJs로 작성한 dashboard.myapp.com의 사용자를위한 대시 보드가 있고 myapp.com/api에서 포도로 api를 만들었습니다.

관리자가 대시 보드에 다른 사용자로 로그인 할 수있는 기능이 관리자 패널에 있습니다. 이 capture_session을 호출합니다. 기본적으로 사용자 세션은 admin에 의해 캡쳐되고 우리는 값이 admin_user의 id 인 쿠키 admin_capture를 드롭합니다.

여기 내가 달성하고자하는 것이 있습니다. 내 포도 API 엔드 포인트 중 하나에서 세션이 캡처되었는지 확인하고 세션을 캡처 한 관리자 사용자가 관리자 패널에 로그인했는지 확인해야합니다.

이제 세션을 캡처했는지 여부를 알아 내면 이미 쿠키가 있으므로 쉽습니다. 하지만 관리자 사용자가 로그인했는지 어떻게 확인할 수 있습니까? 은 활성 관리 방법으로, 도우미는 grape api 끝점에서 호출 할 수 없습니다. 쿠키 또는 세션으로이를 수행 할 수 있습니까? 어떤 도움은 매우 그래서 여기 내가이 문제를 해결하는 방법입니다

감사

답변

2

을 이해할 수있을 것이다 .. 나는 암호화 된 세션과 다른 쿠키 admin_session을 설정 한 후 대시 보드에서 헤더와 같은 쿠키를 반환했습니다.

포도 종점에서 나는 세션을 암호 해독하고 관리 사용자의 ID와 암호화 된 암호의 초기 부분을 얻었습니다. 이 정보를 사용하여 관리자를 확인했습니다.

여기 코드가 있습니다.

admin_id  = ADMIN_ID_HEADER 
    admin_session = ADMIN_SESSION_HEADER 
    admin_user = AdminUser.find_by_id(admin_id) 
    return unless admin_id.present? && admin_session.present? && admin_user.present? 

    salt   = Rails.application.config.action_dispatch.encrypted_cookie_salt 
    signed_salt = Rails.application.config.action_dispatch.encrypted_signed_cookie_salt 
    key_generator = ActiveSupport::KeyGenerator.new(ENV['SECRET_KEY_BASE'], :iterations => 1000) 
    secret  = key_generator.generate_key(salt) 
    signed_secret = key_generator.generate_key(signed_salt) 
    encryptor  = ActiveSupport::MessageEncryptor.new(secret, signed_secret, :serializer => ActiveSupport::MessageEncryptor::NullSerializer) 
    session_data = JSON.parse(encryptor.decrypt_and_verify(CGI::unescape(admin_session))) rescue {} 
관련 문제