[RUBY] [Rails] Accéder aux cookies signés / chiffrés avec les spécifications de la demande

environnement

Problème / ce que vous voulez faire

En l'état, le cookie signé et le cookie crypté ne sont pas accessibles dans la spécification de la demande. L'erreur suivante s'affiche.

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

Ceci est dû au fait que l'objet cookies utilisé dans la spécification de la requête est une instance de Rack :: Test :: CookieJar au lieu de ʻActionDispatch :: Cookies :: CookieJar et implémente les méthodesigned et ʻencrypted. Parce que ce n'est pas.

Solution

ʻUtiliser ActionDispatch :: Cookies :: CookieJar`.

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

  jar = ActionDispatch::Cookies::CookieJar.build(request, cookies.to_hash) #ici
  expect(jar.signed['foo']).to eq('something') #cookie signé aussi
  expect(jar.encrypted['bar']).to eq('something_else') #Le cookie crypté peut également être lu
end

Supplément

Cependant, cela seul ne fonctionnera pas dans le cas de secure: true (paramètre pour envoyer des cookies uniquement au serveur https). (La partie de jar.signed ['foo'] devient nil)

    cookies.signed[:foo] = {
      value: 'your_value_comers_here',
      expires: 1.day.from_now,
      secure: true,  #Ce paramètre
      httponly: true
    }

Dans ce cas, n'utilisez pas secure: true dans les environnements development et 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

Supplément 2

Comme alternative supplémentaire à ↑, j'ai également essayé d'exécuter rspec en mode ssl. protocol: 'https: //' et protocol :: https comme décrit dans https://stackoverflow.com/questions/6785261/test-an-https-ssl-request-in-rspec-rails J'ai essayé '', mais cela n'a pas fonctionné. Il semble que protocol n'est pas supporté par rspec en premier lieu parce qu'il dit ʻArgumentError: unknown keyword: protocol.

Ancienne histoire

J'ai fait référence à cet article. https://philna.sh/blog/2020/01/15/test-signed-cookies-in-rails/

Recommended Posts

[Rails] Accéder aux cookies signés / chiffrés avec les spécifications de la demande
Lire des vidéos à accès restreint (format HLS) sous CloudFront avec Video.js à l'aide de cookies signés
Restrictions d'accès aux rails