12

Dans le cadre d'une API que je construis, il existe une méthode d'authentification utilisateur qui en cas de succès, retourne une charge utile d'informations utilisateur utiles, jeton API, etc.HTTP Test de base Auth dans Rails 2.2+

En écrivant fonctionnelle tests pour le contrôleur qui gère cela, je cours dans un problème de test HTTP Basic auth; J'ai trouvé de nombreux blogs qui mentionnent le code suivant doit être utilisé pour les en-têtes spoof pour une tentative d'authentification:

@request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials(email, pass) 

Le problème est que cela n'a pas d'effet; authenticate_with_http_basic ne voit pas les en-têtes et retourne donc faux même en présence d'informations d'identification valides.

Ai-je raté quelque chose?

Notez que l'application est gelée vers Rails 2.2.2 si cela est utile pour répondre.

+2

Je veux juste noter que dans l'année 2011 et dans Rails 3. * le code que vous avez cité fonctionne parfaitement. – Arsen7

Répondre

9

Je ne suis pas sûr si cela aide, mais je viens de faire un de ces tests dans ma propre application, sauf que j'utilise Rails 2.3.2. Dans mon cas, l'écueil était que j'avais oublié de mettre dans les appareils pour les utilisateurs, donc le crypted_password ne correspondait pas (pourquoi il avait une valeur à tous est encore un mystère pour moi ... Je suppose que Rails n'a pas nettoyé la base de données de test avant d'exécuter le test?)

class DonglesControllerTest < ActionController::TestCase 
    fixtures :users 

    test "index api" do 
    @request.env['HTTP_AUTHORIZATION'] = encode_credentials('one', 'one') 

    get(:index, { :name_contains => 'XXXX0001', :format => 'json' }) 

    assert_equal 'application/json', @response.content_type 
    dongles = ActiveResource::Formats::JsonFormat.decode(@response.body) 

    expected_dongles = [ 
     { 'id' => 1, 
     'name' => 'XXXX0001', 
     'key_id' => 'usbstor\disk&ven_flash&prod_drive_sm_usb20&rev_1100\0000000000000000&0' } 
    ] 

    assert_equal expected_dongles, dongles 
    end 

    private 

    # verbatim, from ActiveController's own unit tests 
    def encode_credentials(username, password) 
    "BasiC#{ActiveSupport::Base64.encode64("#{username}:#{password}")}" 
    end 
end