Cara mengirim header otorisasi yang benar untuk otentikasi dasar

100

Saya mencoba untuk POST data dari API saya tetapi saya tidak bisa melewati otentikasi dasar.

Saya coba:

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

Respons konfigurasi server saya adalah:

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

Header yang saya dapatkan adalah:

Minta Header

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

Header respons

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"

Saya kira konfigurasi servernya bagus karena saya dapat mengakses API dari Klien REST Lanjutan (Ekstensi Chrome)

Ada saran?

PD: Header yang saya dapatkan dari klien REST Lanjutan adalah:

    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

dan

    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

mengirim metode OPTION

individuo7
sumber
19
Saya menyadari posting ini sudah lama mati, tetapi saya hanya ingin menunjukkan jika Anda tidak menyadari bahwa dengan memposting header Otorisasi: Anda, pada dasarnya Anda telah memposting kata sandi Anda dengan jelas. String omong kosong hanya ada pengkodean base64 dari nama pengguna Anda: kata sandi, sehingga semua orang dapat melihat kata sandi Anda. Semoga Anda menyadari ini dan menggunakan kata sandi palsu di sini :)
Lexelby
Ini berfungsi dengan baik dengan server laporan ssrs 2017. Ini menyembunyikan kata sandi dan nama pengguna di URL.
Clark Vera
@Lexelby: Nama pengguna adalah "pengguna" dan kata sandi adalah "dan kata sandi" dalam bahasa Spanyol. Jadi saya kira ini bukan kredensial yang nyata.
pdr

Jawaban:

49

Anda dapat memasukkan pengguna dan kata sandi sebagai bagian dari URL:

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

lihat URL ini, untuk lebih lanjut

Kredensial Otentikasi Dasar HTTP diteruskan dalam URL dan enkripsi

tentu saja, Anda memerlukan kata sandi nama pengguna, bukan 'Basic hashstring.

semoga ini membantu...

Dru
sumber
6
Solusi itu tidak akan berfungsi untuk Browser Asli Android (Pra KitKat). Nama pengguna / formulir login akan tetap muncul untuk pengguna Anda, jadi berhati-hatilah.
Sterling Bourne
58
Metode ini memperlihatkan nama pengguna dan kata sandi kepada siapa pun yang mendengarkan di jaringan atau perangkat ...
Adam
5
@Adam hash string juga tidak aman
Mustafa
38
Ini sama sekali tidak menjawab pertanyaan itu. Meneruskannya sebagai url bukanlah header.
jemiloii
5
alasan downvote: developer.mozilla.org/en-US/docs/Web/HTTP/Authentication . Menjelang akhir artikel, disebutkan bahwaThe use of these URLs is deprecated
anurupr
70

Sesuai https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding dan http://en.wikipedia.org/wiki/Basic_access_authentication , berikut adalah cara melakukan Autentikasi dasar dengan tajuk memasukkan nama pengguna dan kata sandi di URL. Perhatikan bahwa ini masih tidak menyembunyikan nama pengguna atau kata sandi dari siapa pun yang memiliki akses ke jaringan atau kode JS ini (mis. Pengguna yang menjalankannya di browser):

$.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
sumber
1
Catatan: Polyfill window.btoa seperti Base64.js akan diperlukan agar fitur ini berfungsi di IE6,7,8,9. Juga unescape tidak digunakan lagi sesuai ECMAScript v3.
nol
@Techbrunch Anda salah, contoh seanp2k bekerja dengan sangat baik, menggunakan trik yang sangat terkenal untuk mendekode karakter Unicode ke ASCII, sebenarnya menggunakan fakta bahwa (un) escape tidak mendukung Unicode, tetapi (dec) encodeURIComponent tidak ..
41

Jawaban NodeJS:

Jika Anda ingin melakukannya dengan NodeJS: buat titik akhir GET ke JSON dengan Authorizationheader dan dapatkan Promisekembali:

Pertama

npm install --save request request-promise

( lihat di npm ) dan kemudian di .jsfile Anda :

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
});
jakub.g
sumber
1
Terima kasih, Anda menyelamatkan hari saya :)
Sparw
Terima kasih ini bekerja di aplikasi reaksi saya yang menggunakan "ambil"
MohsenFM
13

Jika Anda berada di lingkungan browser, Anda juga dapat menggunakan btoa .

btoaadalah fungsi yang mengambil string sebagai argumen dan menghasilkan string ASCII yang dikodekan Base64. Ini didukung oleh 97% browser .

Contoh:

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

Anda kemudian dapat menambahkan Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=ke authorizationheader.

Perhatikan bahwa peringatan biasa tentang autentikasi HTTP BASIC berlaku, yang paling penting jika Anda tidak mengirim lalu lintas melalui https, penyadapan dapat dengan mudah mendekode string yang dikodekan Base64 sehingga mendapatkan kata sandi Anda.

Jawaban security.stackexchange.com ini memberikan gambaran umum yang bagus tentang beberapa kelemahan.

fernandohur
sumber
3

tidak perlu menggunakan pengguna dan kata sandi sebagai bagian dari URL

kamu bisa mencoba ini

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

String USER_PASS = new String(encodedBytes);

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