복붙노트

[RUBY-ON-RAILS] 3 개 비활성화 세션 쿠키를 레일

RUBY-ON-RAILS

3 개 비활성화 세션 쿠키를 레일

내가 RoR에 3에 기록하여 RESTful API가 있습니다. 나는 "SET-Cookie 헤더를"(클라이언트가 AUTH_TOKEN 매개 변수를 사용하여 권한을 부여하는) 보낼 수없는 내 응용 프로그램을 만들 수 있습니다.

내가 사용하는 세션에 시도 : 오프 reset_session하지만 이해가되지 않습니다. 나는 인증 프레임 워크로 유증을 사용하고 있습니다.

여기 내와 ApplicationController입니다

class ApplicationController < ActionController::Base
  before_filter :reset_session #, :unless => :session_required?
  session :off #, :unless => :session_required?

  skip_before_filter :verify_authenticity_token
  before_filter :access_control_headers!

  def options
    render :text => ""
  end

  private
  def access_control_headers!
    response.headers["Access-Control-Allow-Origin"] = "*"
    response.headers["Access-Control-Allow-Methods"] = "GET, POST, PUT, DELETE, OPTIONS"
    response.headers["Access-Control-Allow-Credentials"] = "true"
    response.headers["Access-Control-Allow-Headers"] = "Content-type"
  end

  def session_required?
    !(params[:format] == 'xml' or params[:format] == 'json')
  end
end

해결법

  1. ==============================

    1.로 전송되는 것을 세션 쿠키에 방해가되지 않는 세션을 삭제, 존의 답변에 대한 댓글에 언급되어있다. 당신이 완전히하여 전송되는에서 ​​쿠키를 제거 할 경우, 랙 미들웨어를 사용해야합니다.

    로 전송되는 것을 세션 쿠키에 방해가되지 않는 세션을 삭제, 존의 답변에 대한 댓글에 언급되어있다. 당신이 완전히하여 전송되는에서 ​​쿠키를 제거 할 경우, 랙 미들웨어를 사용해야합니다.

    class CookieFilter
      def initialize(app)
        @app = app
      end
    
      def call(env)
        status, headers, body = @app.call(env)
    
        # use only one of the next two lines
    
        # this will remove ALL cookies from the response
        headers.delete 'Set-Cookie'
        # this will remove just your session cookie
        Rack::Utils.delete_cookie_header!(headers, '_app-name_session')
    
        [status, headers, body]
      end
    end
    

    다음과 같은 몸을 가진 초기화를 만들어 그것을 사용 :

    Rails.application.config.middleware.insert_before ::ActionDispatch::Cookies, ::CookieFilter
    

    완전히 시간에 혼동 될 수있는 애플리케이션 스택 추적에 결국 쿠키 필터를 방지하기 위해, 당신은 (당신이 lib 디렉토리 / cookie_filter.rb에 넣어 가정) 역 추적에 침묵 할 수 있습니다 :

    Rails.backtrace_cleaner.add_silencer { |line| line.start_with? "lib/cookie_filter.rb" }
    
  2. ==============================

    2.옵션 내장 사용합니다.

    옵션 내장 사용합니다.

    env['rack.session.options'][:skip] = true
    

    또는 동등

    request.session_options[:skip] = true
    

    여기 https://github.com/rack/rack/blob/master/lib/rack/session/abstract/id.rb#L213 그것을 위해 문서를 찾을 수 있습니다

  3. ==============================

    3.나는 그들이 고안에 추가 할 때 확실하지 않다, 그러나 AUTH_TOKEN를 사용할 때이 세션 쿠키의 전송을 해제하게됩니다 구성이있을 나타납니다 :

    나는 그들이 고안에 추가 할 때 확실하지 않다, 그러나 AUTH_TOKEN를 사용할 때이 세션 쿠키의 전송을 해제하게됩니다 구성이있을 나타납니다 :

    # By default Devise will store the user in session. You can skip storage for
    # :http_auth and :token_auth by adding those symbols to the array below.
    # Notice that if you are skipping storage for all authentication paths, you
    # may want to disable generating routes to Devise's sessions controller by
    # passing :skip => :sessions to `devise_for` in your config/routes.rb
    config.skip_session_storage = [:http_auth, :token_auth]
    

    그것은 일을 잘한다. 만 나는 여전히 토큰을 생성 / 검색하기 위해 내 token_controller에 대한 초기 요청을 할 수있을 필요가 있다고했다 있었다 실행합니다. 즉 불행하게도 세션 쿠키를 야기 POST의 /api/v1/tokens.json는 해당 요청에 대해 반환한다.

    나는 라이언 Ahearn 어쨌든 위의 쓴 것을 CookieFilter의 intializer을 구현 결국 그래서.

    내 응용 프로그램은 웹 프런트 엔드뿐만 아니라 JSON API를 모두 가지고 있기 때문에 또한, 나는 단지 JSON API의 쿠키를 필터링하고 싶었다. 내가 처음 확인에 CookieFilter 클래스를 수정하도록 요청은 API를 소유 :

    if env['PATH_INFO'].match(/^\/api/)
      Rack::Utils.delete_cookie_header!(headers, '_myapp_session')
    end
    

    확실하지 그 일을 더 나은 방법이 있다면 ...

  4. ==============================

    4.또 다른 방법 : 쿠키를 피하려고 컨트롤러,이 추가 :

    또 다른 방법 : 쿠키를 피하려고 컨트롤러,이 추가 :

    after_filter :skip_set_cookies_header
    
    def skip_set_cookies_header
      request.session_options = {}
    end
    

    당신이 API를 컨트롤러의 집합이 경우, api_controller 클래스에서이 설정하고 다른 컨트롤러가 api_controller을 상속 할 수 있습니다.

    세션 OPTS 이후 설정-Cookie 헤더 설정이 건너 뜁니다가 비어 있습니다.

  5. ==============================

    5.뭔가가 세션에 추가되지 않는 한 기본 CookieSessionStore는 "SET-쿠키"헤더를 보내지 않습니다. 당신의 스택에 뭔가가 세션에 기록되어 있습니까? (이 고안 아마)

    뭔가가 세션에 추가되지 않는 한 기본 CookieSessionStore는 "SET-쿠키"헤더를 보내지 않습니다. 당신의 스택에 뭔가가 세션에 기록되어 있습니까? (이 고안 아마)

    세션 : 오프는 더 이상 사용되지 :

    def session(*args)
      ActiveSupport::Deprecation.warn(
        "Disabling sessions for a single controller has been deprecated. " +
        "Sessions are now lazy loaded. So if you don't access them, " +
        "consider them off. You can still modify the session cookie " +
        "options with request.session_options.", caller)
    end
    

    당신의 스택에 뭔가가 세션 정보를 설정하는 경우, 당신과 같이 session.clear를 사용하여 지울 수 있습니다 :

    after_filter :clear_session
    
    def clear_session
      session.clear
    end
    

    존재하여 전송에서의 Set-Cookie 헤더를 방지 할 수있는

  6. ==============================

    6.당신이 CSRF 보호를 사용하는 경우 또한 요한의 대답에, 당신은 웹 서비스 요청이를 해제해야합니다. 당신은 응용 프로그램 컨트롤러 보호 방법으로 다음을 추가 할 수 있습니다 :

    당신이 CSRF 보호를 사용하는 경우 또한 요한의 대답에, 당신은 웹 서비스 요청이를 해제해야합니다. 당신은 응용 프로그램 컨트롤러 보호 방법으로 다음을 추가 할 수 있습니다 :

      def protect_against_forgery?
        unless request.format.xml? or request.format.json?
          super
        end
      end
    

    (여부 - 환경에 config.action_controller.allow_forgery_protection = 참 / 거짓에 따라 다름)이 방법 HTML 요청은 여전히 ​​CSRF를 사용합니다.

  7. ==============================

    7.나 자신이 진정으로 선언적 (세션을 사용하여 : OFF) 세션을 해제 할 수있는 놓쳤다

    나 자신이 진정으로 선언적 (세션을 사용하여 : OFF) 세션을 해제 할 수있는 놓쳤다

    : 그냥 평범한 된 레일 (<= 2.2)처럼 사용을 - ... 따라서 나는 "다시"를 가져왔다

    물론보다 session_off 세션 == 전무의 컨트롤러가 발생할 수 있기 때문에이 자신의 해킹 몇 가지 추가 유증의 특정 필요할 수 있습니다, 2.3 단순히 지금까지 전무을지지 않습니다 게으른 세션을 가정하기 때문에 대부분은 확장 레일.

    https://github.com/kares/session_off

  8. ==============================

    8.이모 가장 좋은 방법은 단순히 쿠키 세션 저장소 미들웨어를 제거하는 것입니다.

    이모 가장 좋은 방법은 단순히 쿠키 세션 저장소 미들웨어를 제거하는 것입니다.

    (필요한 경우 나 특정 환경에) 이렇게하려면, 당신 application.rb이 추가 :

    # No session store
    config.middleware.delete ActionDispatch::Session::CookieStore
    
  9. ==============================

    9.대신이 시도

    대신이 시도

    after_filter :skip_set_cookies_header
    
    def skip_set_cookies_header
      session.instance_variable_set('@loaded', false)
    end
    

    세션 데이터를 변경하지 않은 경우 또는 더 나은, 항상 설정-Cookie 헤더를 제거

    before_filter :session_as_comparable_array # first before_filter
    after_filter :skip_set_cookies_header      # last  after_filter
    
    def session_as_comparable_array(obj = session)
      @session_as_comparable_array = case obj
      when Hash
        obj.keys.sort_by(&:to_s).collect{ |k| [k, session_as_comparable_array(obj[k])] }
      when Array
        obj.sort_by(&:to_s).collect{ |k| session_as_comparable_array(k) }
      else
        obj
      end
    end
    
    def skip_set_cookies_header
      session.instance_variable_set('@loaded', false) if (@session_as_comparable_array == session_as_comparable_array)
    end
    
  10. from https://stackoverflow.com/questions/5435494/rails-3-disabling-session-cookies by cc-by-sa and MIT license