Como definir a autenticação HTTP básica usando cURL corretamente?

161

Estou aprendendo Apigility ( Apigility docu -> Tutorial de serviço REST ) e tentando enviar uma solicitação POST com autenticação básica via cURL:

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

YXBpdXNlcjphcGlwd2Q=é a cadeia codificada de base 64 com minhas credenciais apiuser:apipwd. As credenciais são salvas em /data/htpasswd( apiuser:$apr1$3J4cyqEw$WKga3rQMkxvnevMuBaekg/).

A aparência é assim:

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"

Onde está o erro aqui? Como fazê-lo funcionar?

automatix
fonte

Respostas:

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

Na página de documentação:

-u, --user <usuário: senha>

Especifique o nome de usuário e a senha a serem usados ​​na autenticação do servidor. Substitui -n, --netrc e --netrc-opcional.

Se você simplesmente especificar o nome de usuário, o curl solicitará uma senha.

O nome de usuário e as senhas são divididos na primeira vírgula, o que torna impossível o uso de dois pontos no nome de usuário com esta opção. A senha pode, ainda.

Ao usar o Kerberos V5 com um servidor baseado no Windows, você deve incluir o nome de domínio do Windows no nome do usuário, para que o servidor obtenha com êxito um tíquete Kerberos. Caso contrário, o handshake de autenticação inicial poderá falhar.

Ao usar o NTLM, o nome do usuário pode ser especificado simplesmente como o nome do usuário, sem o domínio, se houver um único domínio e floresta na sua configuração, por exemplo.

Para especificar o nome do domínio, use os formatos Nome de logon de nível inferior ou UPN (Nome principal do usuário). Por exemplo, EXEMPLO \ usuário e usuá[email protected], respectivamente.

Se você usar um binário de curl habilitado para SSPI do Windows e executar a autenticação Kerberos V5, Negotiate, NTLM ou Digest, poderá solicitar ao curl para selecionar o nome de usuário e a senha do seu ambiente, especificando dois pontos únicos com esta opção: "-u:" .

Se esta opção for usada várias vezes, a última será usada.

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

Observe que você não precisa de --basicsinalizador, pois é o padrão.

Gajus
fonte
14
Se sua senha contiver alguns caracteres especiais como? ou @, você deve colocá-lo em ticks únicos. curl -u 'nome de usuário:? p @ ssword' http: //
Mirko Ebert
2
mas como é essa solicitação real? Sinto que muitas pessoas testam com curl, mas depois escrevem código ect em qualquer idioma que elas usem. as informações --user são enviadas como um cabeçalho? Em caso afirmativo, como deve ser esse cabeçalho
#
@GautamKathrotiya no Postman, existe uma opção de Autenticação Básica na guia Autorização de uma solicitação, ele inserirá esse cabeçalho de Autorização para você.
Kyle Calica-St
1
@ Verty00 você pode usar o sinalizador -v com curl para ver o conteúdo da solicitação.
Zach
17

como cabeçalho

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
fonte