Authentification de base HTTP et de jeton de support

115

Je développe actuellement une REST-API qui est protégée par HTTP-Basic pour l'environnement de développement. Comme l'authentification réelle se fait via un jeton, j'essaie toujours de savoir comment envoyer deux en-têtes d'autorisation.

J'ai essayé celui-ci:

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Authorization: Bearer mytoken123"

Je pourrais par exemple désactiver l'authentification HTTP pour mon IP mais comme je travaille habituellement dans différents environnements avec des IP dynamiques, ce n'est pas une bonne solution. Alors est-ce que je manque quelque chose?

Azngeek
la source
2
Je dois m'authentifier via HTTP Basic car le serveur Dev est protégé avec lui et j'ai besoin de l'authentification basée sur les jetons pour l'API. Mais comme j'utilise curl pour tester l'API, j'ai besoin d'un moyen d'envoyer les deux en-têtes d'authentification. Donc le premier (basique) à passer HTTP Basic et le second (jeton) pour s'authentifier auprès de mon application. Et oui, c'est ma propre création.
Azngeek
1
Vous avez déjà compris cela? J'ajoute une prime
Adam Waite
4
Bonjour Adam, malheureusement pas. J'ai maintenant changé la façon dont l'authentification fonctionne en changeant mon en-tête d'autorisation pour le jeton en "x-auth" qui n'est pas un en-tête standard.
Azngeek
1
Mon serveur nginx n'acceptera même pas 2 en-têtes d'autorisation. Il renvoie un 400 Bad request. Idiot.
Rudie
1
Quel est le problème avec l'utilisation d'un en-tête personnalisé pour votre jeton API? Je ne vois pas pourquoi les gens ici ont "mis au rebut" en utilisant HTTP Basic Auth pour garder leurs serveurs de développement / de préparation loin des regards indiscrets.
Sunil D.

Réponses:

68

Essayez celui-ci pour pousser l'authentification de base à l'url:

curl -i http://username:[email protected]/api/users -H "Authorization: Bearer mytoken123"
               ^^^^^^^^^^^^^^^^^^

Si ci-dessus ne fonctionne pas, vous n'avez rien à voir avec cela. Alors essayez les alternatives suivantes.

Vous pouvez passer le jeton sous un autre nom. Parce que vous gérez l'autorisation de votre application. Vous pouvez donc facilement utiliser cette flexibilité à cette fin particulière.

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Application-Authorization: mytoken123"

Remarquez que j'ai changé l'en-tête en Application-Authorization. Donc, à partir de votre application, récupérez le jeton sous cet en-tête et traitez ce que vous devez faire.

Une autre chose que vous pouvez faire est, pour passer le à tokentravers les POSTparamètres et la valeur de saisir le paramètre du côté serveur. Par exemple en passant un jeton avec le paramètre curl post:

-d "auth-token=mytoken123"
Sabuj Hassan
la source
1
Bonjour Sabuj, le problème n'est pas la façon dont vous transmettez le nom d'utilisateur et le mot de passe, mais plusieurs en-têtes d'autorisation ne fonctionnent tout simplement pas. En regardant les spécifications ( ietf.org/rfc/rfc2617.txt ), je peux voir que cela devrait être possible. Mais comme indiqué également "" L'agent utilisateur DOIT choisir d'utiliser l'un des défis avec le schéma d'authentification le plus puissant qu'il comprend et demander des informations d'identification à l'utilisateur en fonction de ce défi. "Donc, comme je l'ai écrit il y a 2 jours, je devais réussir le jeton à un en-tête non standard, ce qui est tout à fait acceptable lorsque vous traitez avec des architectures non standard.
Azngeek
5
@Azngeek Curl envoie les deux en-têtes d'autorisation lorsque vous effectuez la tâche. Vous devez le gérer du côté de votre serveur. Exécutez simplement votre commande curl avec les deux en-têtes avec -vparam. Vous constaterez que son envoi Authorization: Basic Ym9zY236Ym9zY28=, Authorization: Bearer mytoken123à l'en-tête de demande. Du côté de votre serveur, si vous cochez, vous constaterez que vous avez un en-tête d'autorisation comme celui-ci Authorization: Basic Ym9zY236Ym9zY28=, Bearer mytoken123séparé par une virgule. Donc, je pensais que je devrais vous suggérer des substituts.
Sabuj Hassan
34

Standard ( https://tools.ietf.org/html/rfc6750 ) indique que vous pouvez utiliser:

  • Paramètre de corps codé sous forme: Autorisation: Bearer mytoken123
  • Paramètre de requête URI: access_token = mytoken123

Il est donc possible de passer de nombreux jetons au porteur avec URI, mais cela est déconseillé (voir la section 5 de la norme).

Janek Olszak
la source
4

Si vous utilisez un proxy inverse tel que nginx entre les deux, vous pouvez définir un jeton personnalisé, tel que X-API-Token .

Dans nginx, vous le réécririez pour que le proxy en amont (votre api de repos) soit simplement auth:

proxy_set_header Authorization $http_x_api_token;

... tandis que nginx peut utiliser l'en-tête Authorization d'origine pour vérifier HTTP AUth.

déchiquetage
la source
3

J'ai eu un problème similaire - authentifier l'appareil et l'utilisateur sur l'appareil. J'ai utilisé un en- Cookietête à côté d'un en- Authorization: Bearer...tête.

Iiridayn
la source
Pas clair pourquoi le vote négatif. Je suis tombé sur cette question à la recherche d'une réponse à un problème connexe - c'est ainsi que je l'ai résolu. L'en- Cookietête est déjà fréquemment utilisé pour l'authentification.
Iiridayn
2

curl --anyauth

Dit à curl de déterminer la méthode d'authentification par elle-même et d'utiliser la méthode la plus sécurisée que le site distant prétend prendre en charge. Ceci est fait en effectuant d'abord une requête et en vérifiant les en-têtes de réponse, induisant ainsi éventuellement un aller-retour réseau supplémentaire. Ceci est utilisé au lieu de définir une méthode d'authentification spécifique, ce que vous pouvez faire avec --basic, --digest, --ntlm et --negotiate.

bbaassssiiee
la source
1

Il existe une autre solution pour tester les API sur le serveur de développement.

  • Ensemble HTTP Basic Authentication uniquement pour les itinéraires Web
  • Laissez toutes les routes API exemptes d'authentification

Configuration du serveur Web pour nginxet Laravelserait comme ceci:

    location /api {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;

        auth_basic "Enter password";
        auth_basic_user_file /path/to/.htpasswd;
    }

Authorization: Bearer fera le travail de défendre le serveur de développement contre les robots d'exploration et autres visiteurs indésirables.

Andrew Kolpakov
la source
0

Avec nginx, vous pouvez envoyer les deux jetons comme celui-ci (même si c'est contre la norme):

Authorization: Basic basic-token,Bearer bearer-token

Cela fonctionne tant que le jeton de base est le premier - nginx le transmet avec succès au serveur d'applications.

Ensuite, vous devez vous assurer que votre application peut extraire correctement le porteur de la chaîne ci-dessus.

Lacho Tomov
la source