Comment définir correctement l'authentification HTTP de base en utilisant cURL?

162

J'apprends Apigility ( Apigility docu -> REST Service Tutorial ) et j'essaie d'envoyer une requête POST avec une authentification de base via cURL:

$ curl -X POST -i -H "Content-Type: application/hal+json" -H "Authorization: Basic YXBpdXNlcjphcGlwd2Q=" http://apigilityhw.sandbox.loc/status

YXBpdXNlcjphcGlwd2Q=est la chaîne encodée en base 64 avec mes informations d'identification apiuser:apipwd. Les informations d'identification sont enregistrées dans le /data/htpasswd( apiuser:$apr1$3J4cyqEw$WKga3rQMkxvnevMuBaekg/).

Le ressemble à ceci:

HTTP/1.1 401 Unauthorized
Server: nginx/1.4.7
Date: Mon, 22 Sep 2014 07:48:47 GMT
Content-Type: application/problem+json
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.5.12-1~dotdeb.1
WWW-Authenticate: Basic realm="api"

Où est l'erreur ici? Comment le faire fonctionner?

automatix
la source

Réponses:

292
curl -u username:password http://
curl -u username http://

Depuis la page de documentation:

-u, --user <utilisateur: mot de passe>

Spécifiez le nom d'utilisateur et le mot de passe à utiliser pour l'authentification du serveur. Remplace -n, --netrc et --netrc-facultatif.

Si vous spécifiez simplement le nom d'utilisateur, curl vous demandera un mot de passe.

Le nom d'utilisateur et les mots de passe sont répartis sur les premiers deux-points, ce qui rend impossible l'utilisation de deux points dans le nom d'utilisateur avec cette option. Le mot de passe peut, encore.

Lorsque vous utilisez Kerberos V5 avec un serveur Windows, vous devez inclure le nom de domaine Windows dans le nom d'utilisateur, afin que le serveur puisse obtenir avec succès un ticket Kerberos. Si vous ne le faites pas, la négociation d'authentification initiale peut échouer.

Lorsque vous utilisez NTLM, le nom d'utilisateur peut être spécifié simplement comme nom d'utilisateur, sans le domaine, s'il existe un seul domaine et forêt dans votre configuration par exemple.

Pour spécifier le nom de domaine, utilisez les formats Nom de connexion de bas niveau ou UPN (Nom principal de l'utilisateur). Par exemple, EXAMPLE \ user et [email protected] respectivement.

Si vous utilisez un binaire curl Windows SSPI et effectuez une authentification Kerberos V5, Negotiate, NTLM ou Digest, vous pouvez demander à curl de sélectionner le nom d'utilisateur et le mot de passe de votre environnement en spécifiant un simple deux-points avec cette option: "-u:" .

Si cette option est utilisée plusieurs fois, la dernière sera utilisée.

http://curl.haxx.se/docs/manpage.html#-u

Notez que vous n'avez pas besoin de --basicdrapeau car c'est la valeur par défaut.

Gajus
la source
14
Si votre mot de passe contient des caractères spéciaux comme? ou @ alors vous devez le mettre en un seul tick. curl -u 'nom d'utilisateur:? p @ ssword' http: //
Mirko Ebert
2
mais à quoi ressemble cette demande réelle? J'ai l'impression que beaucoup de gens testent avec curl mais écrivent ensuite du code ect dans la langue qu'ils utilisent. les informations --user sont-elles envoyées sous forme d'en-tête? Si tel est le cas, à quoi devrait ressembler cet en-tête
Verty00
@GautamKathrotiya dans Postman il y a une option d'authentification de base dans l'onglet Autorisation d'une demande, elle insérera cet en-tête d'autorisation pour vous.
Kyle Calica-St
1
@ Verty00 vous pouvez utiliser l'indicateur -v avec curl pour voir le contenu de la requête.
Zach
17

comme en-tête

AUTH=$(echo -ne "$BASIC_AUTH_USER:$BASIC_AUTH_PASSWORD" | base64 --wrap 0)

curl \
  --header "Content-Type: application/json" \
  --header "Authorization: Basic $AUTH" \
  --request POST \
  --data  '{"key1":"value1", "key2":"value2"}' \
  https://example.com/
srghma
la source