[RUBY] [Rails] Zugriff auf signierte / verschlüsselte Cookies mit Anforderungsspezifikation

Umgebung

Problem / was du machen willst

Auf das signierte Cookie und das verschlüsselte Cookie kann in der Anforderungsspezifikation nicht zugegriffen werden. Der folgende Fehler wird angezeigt.

     NoMethodError:
       undefined method `signed' for #<Rack::Test::CookieJar:0x00007fbc6751fa38>

Dies liegt daran, dass das in der Anforderungsspezifikation verwendete Cookies-Objekt eine Instanz von "Rack :: Test :: CookieJar" anstelle von "ActionDispatch :: Cookies :: CookieJar" ist und die Methoden "signiert" und "verschlüsselt" implementiert. Weil es nicht ist.

Lösungen

Verwenden Sie "ActionDispatch :: Cookies :: CookieJar".

it do
  get some_url
  expect(response).to have_http_status(:success)

  jar = ActionDispatch::Cookies::CookieJar.build(request, cookies.to_hash) #Hier
  expect(jar.signed['foo']).to eq('something') #signierter Cookie auch
  expect(jar.encrypted['bar']).to eq('something_else') #Verschlüsselte Cookies können ebenfalls gelesen werden
end

Ergänzung

Dies allein funktioniert jedoch nicht im Fall von "Secure: True" (Einstellung zum Senden von Cookies nur an den https-Server). (Der Teil von jar.signed ['foo'] wird zu nil)

    cookies.signed[:foo] = {
      value: 'your_value_comers_here',
      expires: 1.day.from_now,
      secure: true,  #Diese Einstellung
      httponly: true
    }

Verwenden Sie in diesem Fall nicht "Secure: True" in den Umgebungen "Development" und "Test".

    def method_that_uses_cookie
      foo = 'foo'
      cookies.encrypted[:foo] = build_cookies(foo)
    end

    def build_cookies(value)
      cookie = {
        value: value,
        expires: 1.day.from_now,
        httponly: true
      }

      if Rails.env.development? || Rails.env.test?
        cookie
      else
        cookie.merge(secure: true)
      end
    end

Ergänzung 2

Als ergänzende Alternative zu ↑ habe ich auch versucht, rspec im SSL-Modus auszuführen. protocol: 'https: //' undprotocol :: https wie unter https://stackoverflow.com/questions/6785261/test-an-https-ssl-request-in-rspec-rails beschrieben Ich habe es versucht, aber es hat nicht funktioniert. Es scheint, dassprotocol von rspec überhaupt nicht unterstützt wird, da dort 'ArgumentError: unknown keyword: protocol steht.

Frühere Geschichte

Ich habe auf diesen Artikel verwiesen. https://philna.sh/blog/2020/01/15/test-signed-cookies-in-rails/

Recommended Posts

[Rails] Zugriff auf signierte / verschlüsselte Cookies mit Anforderungsspezifikation
Spielen Sie Videos mit eingeschränktem Zugriff (HLS-Format) unter CloudFront mit Video.js mit signierten Cookies ab
Zugangsbeschränkungen für Schienen