¿Cómo definir la autenticación HTTP básica usando cURL correctamente?

161

Estoy aprendiendo Apigility ( Apigility docu -> Tutorial de servicio REST ) e intento enviar una solicitud POST con autenticación básica a través de cURL:

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

YXBpdXNlcjphcGlwd2Q=es la cadena codificada de base 64 con mis credenciales apiuser:apipwd. Las credenciales se guardan en /data/htpasswd( apiuser:$apr1$3J4cyqEw$WKga3rQMkxvnevMuBaekg/).

Se ve así:

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"

¿Dónde está el error aquí? ¿Cómo hacer que funcione?

automezcla
fuente

Respuestas:

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

Desde la página de documentación:

-u, --user <usuario: contraseña>

Especifique el nombre de usuario y la contraseña que se usarán para la autenticación del servidor. Invalida -n, --netrc y --netrc-opcional.

Si simplemente especifica el nombre de usuario, curl le pedirá una contraseña.

El nombre de usuario y las contraseñas se dividen en el primer colon, lo que hace que sea imposible usar dos puntos en el nombre de usuario con esta opción. La contraseña puede, aún.

Cuando use Kerberos V5 con un servidor basado en Windows, debe incluir el nombre de dominio de Windows en el nombre de usuario, para que el servidor obtenga con éxito un Ticket Kerberos. Si no lo hace, el protocolo de enlace de autenticación inicial puede fallar.

Cuando se usa NTLM, el nombre de usuario puede especificarse simplemente como el nombre de usuario, sin el dominio, si hay un solo dominio y bosque en su configuración, por ejemplo.

Para especificar el nombre de dominio, utilice los formatos Nombre de inicio de sesión de nivel inferior o UPN (Nombre principal de usuario). Por ejemplo, EJEMPLO \ usuario y [email protected] respectivamente.

Si utiliza un binario curl habilitado para Windows SSPI y realiza la autenticación Kerberos V5, Negotiate, NTLM o Digest, puede indicarle a curl que seleccione el nombre de usuario y la contraseña de su entorno especificando dos puntos con esta opción: "-u:" .

Si esta opción se usa varias veces, se usará la última.

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

Tenga en cuenta que no necesita --basicmarca, ya que es el valor predeterminado.

Gajus
fuente
14
Si su contraseña contiene algunos caracteres especiales como? o @ entonces tienes que ponerlo en marcas simples. curl -u 'nombre de usuario:? p @ ssword' http: //
Mirko Ebert
2
pero, ¿cómo se ve esta solicitud real? Siento que muchas personas prueban con curl pero luego escriben código ect en cualquier idioma que usen. ¿Se envía la información del usuario como un encabezado? Si es así, ¿cómo debería ser ese encabezado
Verty00
@GautamKathrotiya en Postman hay una opción de autenticación básica en la pestaña Autorización de una solicitud, insertará este encabezado de autorización para usted.
Kyle Calica-St
1
@ Verty00 puede usar la bandera -v con curl para ver el contenido de la solicitud.
Zach
17

como encabezado

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
fuente