Cómo configurar el encabezado de autorización usando curl

Respuestas:

395

http://curl.haxx.se/docs/httpscripting.html

Consulte la parte 6. Autenticación HTTP

Autenticación HTTP

La autenticación HTTP es la capacidad de decirle al servidor su nombre de usuario y contraseña para que pueda verificar que se le permite hacer la solicitud que está haciendo. La autenticación básica utilizada en HTTP (que es el tipo que curl usa de manera predeterminada) está basada en texto sin formato , lo que significa que envía un nombre de usuario y una contraseña solo ligeramente ofuscados, pero que aún puede ser completamente legible por cualquier persona que huela en la red entre usted y el servidor remoto.

Para decirle a curl que use un usuario y una contraseña para la autenticación:

curl --user name:password http://www.example.com

El sitio puede requerir un método de autenticación diferente (verifique los encabezados devueltos por el servidor), y luego --ntlm, --digest, --negotiate o incluso --anyauth pueden ser opciones que le convengan.

A veces, su acceso HTTP solo está disponible mediante el uso de un proxy HTTP. Esto parece ser especialmente común en varias empresas. Un proxy HTTP puede requerir su propio usuario y contraseña para permitir que el cliente acceda a Internet. Para especificar aquellos con rizo, ejecute algo como:

curl --proxy-user proxyuser:proxypassword curl.haxx.se

Si su proxy requiere que la autenticación se realice utilizando el método NTLM, use --proxy-ntlm, si requiere Digest use --proxy-digest.

Si utiliza cualquiera de estas opciones de usuario + contraseña, pero omite la parte de la contraseña, curl solicitará la contraseña de forma interactiva.

Tenga en cuenta que cuando se ejecuta un programa, es posible ver sus parámetros al enumerar los procesos en ejecución del sistema. Por lo tanto, otros usuarios pueden ver sus contraseñas si las pasa como opciones de línea de comandos simples. Hay formas de evitar esto.

Vale la pena señalar que, si bien es así como funciona la autenticación HTTP, muchos sitios web no utilizarán este concepto cuando proporcionen inicios de sesión, etc. Consulte el capítulo Web Login más abajo para obtener más detalles al respecto.

Oli
fuente
16
@ Vixed Esta pregunta no se refiere explícitamente a PHP. [¿Qué hay de malo con los resultados de Google] (s)?
Oli
La pregunta es sobre Autorización, no autenticación, por lo que tal vez el OP debería cambiar el título de la pregunta
atasco el
321

Solo agregue para que no tenga que hacer clic:

curl --user name:password http://www.example.com

o si está intentando enviar autenticación para OAuth 2:

curl -H "Authorization: OAuth <ACCESS_TOKEN>" http://www.example.com
Tony
fuente
15
Muchas API ahora usan tokens de autorización de encabezado. La -Hopción es genial.
eliocs el
14
Si usa -u o --user, Curl codificará las credenciales en Base64 y generará un encabezado como este:-H Authorization: Basic <Base64EncodedCredentials>
Timothy Kanski
Estoy tratando de agregar un encabezado de autorización con HMAC-SHA256siempre obteniendo un error de encabezado de autorización faltante
Steven Aguilar
2
Además, si usted necesita el <Base64EncodedCredentials>tan mencionado por @ Timoteo-Kansaki, se puede obtener la credencial codificada usando el comando: cred="$( echo $NAME:$PASSWORD | base64 )"; curl -H "Authorization: Basic $cred" https://example.com. Para referencia, consulte stackoverflow.com/questions/16918602/…
David Golembiowski
170

Las fichas de portador se ven así:

curl -H "Authorization: Bearer <ACCESS_TOKEN>" http://www.example.com
Steve Tauber
fuente
77
Y si está buscando hacer una autorización 'Básica', simplemente cambie 'Portador' por 'Básico'
un
Tengo lo más extraño, obtengo un "Formato incorrecto de encabezado de autorización" y "HTTP-200". ¿Entonces el servidor acepta mi autorización, pero el formato es incorrecto?
Groostav
65

(para aquellos que buscan respuesta php-curl )

$service_url = 'https://example.com/something/something.json';
$curl = curl_init($service_url);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, "username:password"); //Your credentials goes here
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post_data);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //IMP if the url has https and you don't want to verify source certificate

$curl_response = curl_exec($curl);
$response = json_decode($curl_response);
curl_close($curl);

var_dump($response);
Rao
fuente
64

Esto funcionó para mí:

 curl -H "Authorization: Token xxxxxxxxxxxxxx" https://www.example.com/
timj98
fuente
¿Qué estás usando para JWT?
Ciasto piekarz
1
No quiere decir Authorization: bearer xxxxxxxxx?
jlh
@jlh quieres decirBearer
Daniel W.
Estaba casi seguro de que no distingue entre mayúsculas y minúsculas, pero parece que estoy equivocado. Sí, quise decir Bearer.
jlh
20

Para autenticación básica HTTP:

curl -H "Authorization: Basic <_your_token_>" http://www.example.com

reemplazar _your_token_y la URL.

Devaroop
fuente
Al usar oauth, ¿de dónde vendría el token de autorización? Estoy tratando de usar curl para descargar archivos de un sitio donde uso un usuario y una contraseña, pero parece estar fallando debido a oauth2 en uso.
ctrl-alt-delete
@toasteez tienes que pasar por el flujo de Oauth2 para recibir un token. Por lo general, es un proceso de dos pasos y debe detallarse en la documentación del servidor.
Devaroop
13
buena respuesta. un pequeño ayudante echo -ne "<your-user>:<your-pass>" | base64 --wrap 0generará el token de autenticación básico.
Mike D
3
@MikeD -H "Authorization: Basic <_your_token_>"hace el mismo efecto que --user login:password. Puede comprobarlo concurl -v
vladkras
1
@vladkras mi respuesta es una ayuda para esta respuesta. en mi experiencia, es mejor entender cómo crear el token en lugar de depender de curl para generarlo.
Mike D
14

Tenga cuidado cuando use: curl -H "Authorization: token_str" http://www.example.com

token_stry Authorizationdebe estar separado por espacios en blanco, de lo contrario, el lado del servidor no obtendrá el HTTP_AUTHORIZATIONentorno.

jianpx
fuente
2
No es cierto, si se requiere un espacio en blanco, su servidor HTTP está roto. También necesita dos cadenas por tipo y luego el token.
Alexis Wilke
5

Si no tiene el token al momento de realizar la llamada, tendrá que hacer dos llamadas, una para obtener el token y la otra para extraer el token de la respuesta, preste atención a

token grep | corte -d, -f1 | cortar -d \ "-f4

ya que es la parte que se ocupa de extraer el token de la respuesta.

echo "Getting token response and extracting token"    
def token = sh (returnStdout: true, script: """
    curl -S -i -k -X POST https://www.example.com/getToken -H \"Content-Type: application/json\" -H \"Accept: application/json\" -d @requestFile.json | grep token | cut -d, -f1 | cut -d\\" -f4
""").split()

Después de extraer el token, puede usar el token para realizar llamadas posteriores de la siguiente manera.

echo "Token : ${token[-1]}"       
echo "Making calls using token..."       
curl -S -i -k  -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer ${token[-1]}" https://www.example.com/api/resources 
Upul Doluweera
fuente