Temel kimlik doğrulama için doğru bir yetkilendirme başlığı nasıl gönderilir


101

API'mden verileri POST yapmaya çalışıyorum ancak temel kimlik doğrulamasını geçemiyorum.

Denerim:

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

Sunucu yapılandırma yanıtım:

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

Aldığım başlıklar:

Üstbilgi İste

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

Yanıt başlığı

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"

Gelişmiş REST İstemcisinden (Chrome Uzantısı) API'ye erişebildiğim için sunucu yapılandırmasının iyi olduğunu tahmin ediyorum

Herhangi bir öneri?

PD: Advanced REST istemcisinden aldığım başlık:

    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

ve

    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

SEÇENEK yöntemi gönderme


19
Bu gönderinin çoktan öldüğünün farkındayım, ancak Yetkilendirme: başlığınızı göndererek aslında şifrenizi açık bir şekilde paylaştığınızın farkında değilseniz, belirtmek isterim. Buradaki anlamsız sözcükler dizisi, kullanıcı adınızın yalnızca base64 kodlamasıdır: şifre, böylece herkes şifrenizi görebilir. Umarım bunu fark
etmişsinizdir

Bu, ssrs rapor sunucusu 2017 ile iyi çalışır. URL'deki şifre ve kullanıcı adını gizler.
Clark Vera

@Lexelby: Kullanıcı adı "kullanıcı" ve şifre İspanyolca "ve şifre" dir. Bu yüzden bunların gerçek kimlik bilgileri olmadığını tahmin ediyorum.
pdr

Yanıtlar:


48

Kullanıcıyı ve şifreyi URL'nin bir parçası olarak ekleyebilirsiniz:

http://user:passwd@www.server.com/index.html

daha fazlası için bu URL'ye bakın

URL ve şifrelemede geçirilen HTTP Temel Kimlik Doğrulama kimlik bilgileri

elbette, kullanıcı adı şifresine ihtiyacınız olacak, değil 'Basic hashstring.

Bu yardımcı olur umarım...


6
Bu çözüm, Android'in Yerel Tarayıcısı (Pre KitKat) için çalışmayacaktır. Kullanıcı adı / giriş formu yine de kullanıcınız için açılır, bu yüzden dikkatli olun.
Sterling Bourne

59
Bu yöntem, kullanıcı adını ve parolayı ağda veya cihazlarda dinleyen herkese ifşa eder ...
Adam

5
@Adam hash string de güvenli değil
Mustafa

40
Bu soruya hiç cevap vermiyor. URL olarak iletmek başlık değildir.
jemiloii

5
olumsuz oylama nedeni: developer.mozilla.org/en-US/docs/Web/HTTP/Authentication . Makalenin sonuna doğru, bu sözThe use of these URLs is deprecated
anurupr

72

Https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding ve http://en.wikipedia.org/wiki/Basic_access_authentication uyarınca , burada bunun yerine bir başlık ile Temel kimlik doğrulamanın nasıl yapılacağı açıklanmaktadır kullanıcı adı ve şifreyi URL'ye koyma. Bunun, kullanıcı adını veya şifreyi ağa veya bu JS koduna erişimi olan herhangi birinden (örneğin, bir tarayıcıda çalıştıran bir kullanıcı) gizlemediğini unutmayın:

$.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))))
  }
});

1
Not: Bu özelliğin IE6,7,8,9'da çalışması için Base64.js gibi bir window.btoa çoklu dolgusu gerekecektir. Ayrıca, unescape, ECMAScript v3 uyarınca kullanımdan kaldırılmıştır.
null

@Techbrunch, yanılıyorsunuz, seanp2k'in örneği çok iyi çalışıyor, Unicode karakterlerini ASCII'ye çözmek için çok bilinen bir numara kullanıyor, aslında (un) kaçışının Unicode'u desteklemediği, ancak (dec) encodeURIComponent'in desteklediği gerçeğini kullanıyor ..

43

NodeJS yanıtı:

NodeJS ile yapmak istemeniz durumunda: Authorizationbaşlık ile JSON uç noktasına GET oluşturun ve Promisegeri alın:

İlk

npm install --save request request-promise

( npm'ye bakın ) ve sonra .jsdosyanızda:

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

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

var base64encodedData = Buffer.from(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
});

1
Teşekkürler, günümü kurtardın :)
Sparw

Teşekkürler bu, "getir" kullanan react uygulamamda çalıştı
MohsenFM

13

Bir tarayıcı ortamındaysanız, btoa'yı da kullanabilirsiniz .

btoabağımsız değişken olarak bir dizge alan ve Base64 kodlu bir ASCII dizesi üreten bir işlevdir. Tarayıcıların% 97'si tarafından desteklenmektedir .

Misal:

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

Daha sonra ekleyebilir Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=için authorizationbaşlığındaki.

HTTP BASIC kimlik doğrulaması ile ilgili olağan uyarıların geçerli olduğunu unutmayın, en önemlisi trafiğinizi https üzerinden göndermezseniz, gizlice dinlenen bir Base64 kodlu dizginin kodunu çözebilir ve böylece şifrenizi elde edebilir.

Bu security.stackexchange.com yanıtı, bazı dezavantajlara iyi bir genel bakış sağlar.


3

URL'nin bir parçası olarak kullanıcı ve şifre kullanmaya gerek yok

bunu deneyebilirsin

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

String USER_PASS = new String(encodedBytes);

HttpUriRequest request = RequestBuilder.get(url).addHeader("Authorization", USER_PASS).build();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.