7
votes

Comment puis-je dire aux spécifications de contrôleur d'utiliser la demande de OAuth signée

Je construis un fournisseur de OAuth à 2 pattes pour mon API. Tout est connecté correctement et je peux apporter des appels signés de la console de rails. Le problème que j'ai est que j'ai du mal à intégrer Oauth dans le contrôleur_spec code>.

Voici un exemple d'un appel de travail sur mon serveur: P>

Processing by Api::ClientApplicationsController#index as JSON
  Parameters: {"api_version"=>1}
  Rendered text template (0.0ms)
Filter chain halted as #<OAuth::Controllers::ApplicationControllerMethods::Filter:0x007f85a51a8858 @options={:interactive=>false, :strategies=>:two_legged}, @strategies=[:two_legged]> rendered or redirected
Completed 401 Unauthorized in 15ms (Views: 14.1ms | ActiveRecord: 0.0ms)
   (0.2ms)  ROLLBACK


9 commentaires

On dirait que ce n'est pas vraiment une spécification de contrôleur. Avez-vous essayé comme une demande de demande?


C'est une spécification de contrôleur. L'exemple a été simplement dépouillé à son essentiel. Si vous êtes correct et que ce type de test devrait entrer dans la demande de demande, comment suis-je censé tester mon contrôleur lorsque je l'ai protégé par OAuth?


Je teste une API ces jours-ci et dans des spécifications de contrôleur, je passe simplement des valeurs appropriées dans l'en-tête. Je suis désolé, je ne sais pas vraiment pour OAuth. Ce que je crains dans votre cas, c'est que create_signed_request ne reçoit pas le résultat attendu. Avez-vous essayé de le déboguer? Juste pensant: vous pouvez contourner certains avant_filters pendant le test


Le seul filtre avant que j'ai est la méthode OauthiciCe à partir du gemme de plug-in oauth. create_signed_request est celui qui fonctionne, c'est le test du contrôleur qui n'est pas. Je pense que ce qui pourrait se produire est que apply_oauth! est effectué avant le obtenu: l'appel appelle est effectué, ce qui entraîne la voie de ne pas être dans la signature. Je devrais peut-être faire mon propre wrapper autour du Obtenir un appel pour déterminer ce que le chemin est, le définit, le signer, puis appelez la super mise en œuvre d'obtenir. On dirait que beaucoup de travail inutile si ...


Eh bien, j'essaie d'expliquer, je doute create_signed_request obtient ce qu'il attend car aucun serveur n'est exécuté dans des spécifications de contrôleur. Si vous souhaitez simplement tester le reste de votre contrôleur, contournez le avant_filter . Si vous souhaitez tester l'authentification, essayez dans une demande de demande.


Je vois ce que tu veux dire. Alors quelque chose comme : skip_before_filter: authentifier au début (: tous) des tests du contrôleur. Laisse moi essayer


Laissez-nous Continuez cette discussion en chat


Je viens de voir que tu es attaché à me contacter par chat. Toujours aucune solution adéquate trouvée maintenant?


Pas encore ... Il y a une prime maintenant.


3 Réponses :


0
votes

Je vais jeter un coup d'oeil sur la manière dont le test d'Omniauth aide au travail, en particulier ces fichiers: https://github.com/intridea/omniauth/tree/master/lib/omniauth/test . Voir leur page wiki sur l'intégration Test pour des idées de la manière dont cela est configuré. Je me rends compte que vous construisez un fournisseur, pas un client, mais cela peut être un bon point de départ. En outre, comme certains des commentateurs ont déjà dit, je ne sais pas si vous pouvez le faire avec un test de contrôleur; Vous aurez peut-être besoin d'une demande ou d'un test d'intégration pour simuler complètement l'environnement de rack.


0 commentaires

0
votes

s'avère que le meilleur moyen de tester mon contrôleur était aussi le plus simple. Au lieu d'essayer de signer chaque test afin que le contrôleur reçoit les bonnes informations (quelque chose qui appartienne effectivement à une spécification de requête, pas une spécification de contrôleur), j'ai compris que je pouvais simplement donner au contrôleur les informations nécessaires nécessaires manuellement.

à Faites ceci, je devais simplement faire du talon 2 méthodes: xxx

équergbing the Autoriser? La méthode causée par le rack authentifie en pensant qu'il a été authentifié. . Autoriser? Définissez également le Client_Application en fonction des informations d'identification, alors je devais faire supporter cela aussi. Maintenant que l'authentifie est hors de la route, je peux tester correctement mon contrôleur.


0 commentaires

1
votes

Si vous souhaitez le tester dans une spécification de demande et que vous devez réellement tester sans encercler, vous pouvez construire un consommateur OAuth et signer une demande comme celle-ci:

    @access_token = FactoryGirl.create :access_token
    @consumer = OAuth::Consumer.new(@access_token.app.key, @access_token.app.secret, :site => "http://www.example.com/")
    @path = "/path/to/request"
    @request = @consumer.create_signed_request(:get, @path, OAuth::AccessToken.new(@consumer, @access_token.token, @access_token.secret))
    get @path, nil, { 'HTTP_AUTHORIZATION' => @request.get_fields('authorization').first }


0 commentaires