Como enviar um cabeçalho de autorização correto para autenticação básica

100

Estou tentando POSTAR dados da minha API, mas não consigo passar na autenticação básica.

Eu tento:

$.ajax({
  type: 'POST',
  url: http://theappurl.com/api/v1/method/,
  data: {},
  crossDomain: true,
  beforeSend: function(xhr) {
    xhr.setRequestHeader('Authorization', 'Basic [REDACTED]');
  }
});

Minha resposta de configuração do servidor é:

response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Methods"] = "POST"
response["Access-Control-Max-Age"] = "1000"
response["Access-Control-Allow-Headers"] = "*"

Os cabeçalhos que recebo são:

Solicitar cabeçalhos

OPTIONS /api/v1/token-auth/ HTTP/1.1
Host: theappurl.com
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31
Access-Control-Request-Headers: origin, authorization, content-type
Accept: */*
Referer: http://127.0.0.1:8080/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: es,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

Cabeçalho de resposta

HTTP/1.1 401 Unauthorized
Server: nginx/1.1.19
Date: Fri, 16 Aug 2013 01:29:21 GMT
Content-Type: text/html
Content-Length: 597
Connection: keep-alive
WWW-Authenticate: Basic realm="Restricted"

Acho que a configuração do servidor é boa porque posso acessar a API a partir do cliente REST avançado (extensão do Chrome)

Alguma sugestão?

PD: O cabeçalho que recebo do cliente REST avançado é:

    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31
    Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
    Authorization: Basic [REDACTED]
    Content-Type: application/x-www-form-urlencoded 
    Accept: */*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: es,en;q=0.8
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

e

    Server: nginx/1.1.19 
    Date: Fri, 16 Aug 2013 01:07:18 GMT 
    Content-Type: application/json; charset=utf-8 
    Transfer-Encoding: chunked 
    Connection: keep-alive
    Vary: Accept, Cookie 
    Allow: POST, OPTIONS 
    X-Robots-Tag: noindex

método OPTION de envio

individuo7
fonte
19
Sei que este post está morto há muito tempo, mas só quero salientar caso você não saiba que, ao postar o cabeçalho Authorization:, você basicamente postou sua senha em claro. A sequência de caracteres sem sentido é apenas a codificação base64 do seu nome de usuário: senha, para que todos possam ver sua senha. Espero que você tenha percebido isso e usado uma senha fictícia aqui :)
Lexelby
Isso funciona bem com o servidor de relatório ssrs 2017. Ele oculta a senha e o nome de usuário na URL.
Clark Vera
@Lexelby: O nome de usuário é "o usuário" e a senha é "e a senha" em espanhol. Acho que essas não são credenciais reais.
PDR

Respostas:

48

Você pode incluir o usuário e a senha como parte do URL:

http://user:[email protected]/index.html

veja este URL, para mais

Credenciais de autenticação básica HTTP passadas em URL e criptografia

claro, você precisará da senha do nome de usuário, não é 'Basic hashstring.

espero que isto ajude...

Dru
fonte
6
Essa solução não funcionará com o navegador nativo do Android (Pré KitKat). O formulário de nome de usuário / login ainda aparecerá para o seu usuário, então tome cuidado.
Sterling Bourne de
58
Este método expõe o nome de usuário e a senha a qualquer pessoa que esteja ouvindo na rede ou dispositivos ...
Adam
5
String hash @Adam também não é segura
Mustafa
38
Isso não responde à pergunta de forma alguma. Passá-lo como url não é um cabeçalho.
jemiloii
5
motivo do voto negativo: developer.mozilla.org/en-US/docs/Web/HTTP/Authentication . No final do artigo, ele menciona queThe use of these URLs is deprecated
anurupr de
70

Por https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding e http://en.wikipedia.org/wiki/Basic_access_authentication , aqui está como fazer autenticação básica com um cabeçalho de colocar o nome de usuário e a senha no URL. Observe que isso ainda não esconde o nome de usuário ou a senha de ninguém com acesso à rede ou este código JS (por exemplo, um usuário executando-o em um navegador):

$.ajax({
  type: 'POST',
  url: http://theappurl.com/api/v1/method/,
  data: {},
  crossDomain: true,
  beforeSend: function(xhr) {
    xhr.setRequestHeader('Authorization', 'Basic ' + btoa(unescape(encodeURIComponent(YOUR_USERNAME + ':' + YOUR_PASSWORD))))
  }
});
seanp2k
fonte
1
Observação: um polyfill window.btoa, como Base64.js, será necessário para que esse recurso funcione no IE6,7,8,9. Além disso, o unescape está obsoleto de acordo com o ECMAScript v3.
nulo
@Techbrunch você está enganado, o exemplo de seanp2k funciona muito bem, ele usa um truque muito conhecido para decodificar caracteres Unicode para ASCII, na verdade usa o fato de que (des) escape não suporta Unicode, mas (dec) encodeURIComponent sim ..
40

Resposta do NodeJS:

Caso você queira fazer isso com NodeJS: faça um endpoint GET to JSON com Authorizationcabeçalho e obtenha um Promiseretorno:

Primeiro

npm install --save request request-promise

( veja no npm ) e depois em seu .jsarquivo:

var requestPromise = require('request-promise');

var user = 'user';
var password = 'password';

var base64encodedData = new Buffer(user + ':' + password).toString('base64');

requestPromise.get({
  uri: 'https://example.org/whatever',
  headers: {
    'Authorization': 'Basic ' + base64encodedData
  },
  json: true
})
.then(function ok(jsonData) {
  console.dir(jsonData);
})
.catch(function fail(error) {
  // handle error
});
jakub.g
fonte
1
Obrigado, você salvou meu dia :)
Sparw
Obrigado, isso funcionou em meu aplicativo de reação que usava "fetch"
MohsenFM
13

Se você estiver em um ambiente de navegador, também pode usar btoa .

btoaé uma função que recebe uma string como argumento e produz uma string ASCII codificada em Base64. É suportado por 97% dos navegadores .

Exemplo:

> "Basic " + btoa("billy"+":"+"secretpassword")
< "Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ="

Você pode então adicionar Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=ao authorizationcabeçalho.

Observe que as advertências usuais sobre a autenticação HTTP BASIC se aplicam, mais importante, se você não enviar seu tráfego por https, um interceptado pode simplesmente decodificar a string codificada em Base64, obtendo assim sua senha.

Esta resposta security.stackexchange.com oferece uma boa visão geral de algumas das desvantagens.

fernandohur
fonte
3

não há necessidade de usar usuário e senha como parte do URL

você pode tentar isso

byte[] encodedBytes = Base64.encodeBase64("user:passwd".getBytes());

String USER_PASS = new String(encodedBytes);

HttpUriRequest request = RequestBuilder.get(url).addHeader("Authorization", USER_PASS).build();
Erhanck
fonte