Cách gửi tiêu đề ủy quyền chính xác để xác thực cơ bản


99

Tôi đang cố ĐĂNG dữ liệu từ API của mình nhưng tôi không thể vượt qua xác thực cơ bản.

Tôi thử:

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

Phản hồi cấu hình máy chủ của tôi là:

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

Các tiêu đề mà tôi nhận được là:

Yêu cầu tiêu đề

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

Tiêu đề phản hồi

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"

Tôi đoán cấu hình máy chủ tốt vì tôi có thể truy cập vào API từ Máy khách REST nâng cao (Tiện ích mở rộng của Chrome)

Bất kỳ đề xuất?

PD: Tiêu đề mà tôi nhận được từ máy khách REST nâng cao là:

    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

    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

gửi phương thức OPTION


19
Tôi nhận ra rằng bài đăng này đã chết từ lâu, nhưng tôi chỉ muốn chỉ ra trong trường hợp bạn không biết rằng bằng cách đăng tiêu đề Authorization: của bạn, về cơ bản bạn đã đăng rõ ràng mật khẩu của mình. Chuỗi vô nghĩa ở đó chỉ là mã hóa base64 của tên người dùng: mật khẩu của bạn, vì vậy mọi người có thể thấy mật khẩu của bạn. Hy vọng rằng bạn nhận ra điều này và sử dụng một mật khẩu giả ở đây :)
Lexelby

Điều này hoạt động tốt với máy chủ báo cáo ssrs 2017. Nó ẩn mật khẩu và tên người dùng trong URL.
Clark Vera

@Lexelby: Tên người dùng là "người dùng" và mật khẩu là "và mật khẩu" bằng tiếng Tây Ban Nha. Vì vậy, tôi đoán đây không phải là thông tin xác thực thực sự.
pdr

Câu trả lời:


48

Bạn có thể bao gồm người dùng và mật khẩu như một phần của URL:

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

xem URL này, để biết thêm

Thông tin xác thực HTTP cơ bản được chuyển vào URL và mã hóa

tất nhiên, bạn sẽ cần mật khẩu tên người dùng, không phải vậy 'Basic hashstring.

hi vọng điêu nay co ich...


6
Giải pháp đó sẽ không hoạt động đối với Trình duyệt gốc của Android (Pre KitKat). Tên người dùng / biểu mẫu đăng nhập sẽ vẫn bật lên cho người dùng của bạn, vì vậy hãy cẩn thận.
Sterling Bourne

58
Phương pháp này tiết lộ tên người dùng và mật khẩu cho bất kỳ ai đang nghe trên mạng hoặc các thiết bị ...
Adam

5
@ Adam chuỗi băm cũng không an toàn
Mustafa

38
Điều này không trả lời câu hỏi nào cả. Chuyển nó dưới dạng url không phải là tiêu đề.
jemiloii

5
phản đối lý do: developer.mozilla.org/en-US/docs/Web/HTTP/Authentication . Ở cuối bài viết, nó đề cập đến điều đóThe use of these URLs is deprecated
anurupr

70

Theo https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decodinghttp://en.wikipedia.org/wiki/Basic_access_authentication , đây là cách thực hiện Xác thực cơ bản với tiêu đề thay thế đặt tên người dùng và mật khẩu trong URL. Lưu ý rằng điều này vẫn không ẩn tên người dùng hoặc mật khẩu khỏi bất kỳ ai có quyền truy cập vào mạng hoặc mã JS này (ví dụ: người dùng thực thi nó trong trình duyệt):

$.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
Lưu ý: Cần có polyfill window.btoa như Base64.js để tính năng này hoạt động trong IE6,7,8,9. Ngoài ra, unescape không được chấp nhận theo ECMAScript v3.
null

@Techbrunch bạn đã nhầm, ví dụ của seanp2k hoạt động rất tốt, nó sử dụng một thủ thuật rất nổi tiếng để giải mã các ký tự Unicode thành ASCII, nó thực sự sử dụng thực tế là (un) Escape không hỗ trợ Unicode, nhưng (dec) encodeURIComponent thì có ..

40

Câu trả lời của NodeJS:

Trong trường hợp bạn muốn làm điều đó với NodeJS: hãy tạo điểm cuối GET to JSON với Authorizationtiêu đề và nhận Promiselại:

Đầu tiên

npm install --save request request-promise

( xem trên npm ) và sau đó trong .jstệp của bạn :

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

1
Cảm ơn, bạn đã cứu một ngày của tôi :)
Sparw,

Cảm ơn bạn này làm việc trong phản ứng của tôi ứng dụng mà sử dụng "lấy"
MohsenFM

13

Nếu bạn đang ở trong môi trường trình duyệt, bạn cũng có thể sử dụng btoa .

btoalà một hàm nhận một chuỗi làm đối số và tạo ra một chuỗi ASCII được mã hóa Base64. Nó được hỗ trợ bởi 97% trình duyệt .

Thí dụ:

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

Sau đó, bạn có thể thêm Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=vào authorizationtiêu đề.

Lưu ý rằng các cảnh báo thông thường về xác thực HTTP BASIC được áp dụng, quan trọng nhất là nếu bạn không gửi lưu lượng truy cập của mình qua https, một người bị nghe trộm có thể chỉ cần giải mã chuỗi mã hóa Base64 do đó lấy được mật khẩu của bạn.

Câu trả lời của security.stackexchange.com này cung cấp một cái nhìn tổng quan tốt về một số nhược điểm.


3

không cần sử dụng người dùng và mật khẩu như một phần của URL

bạn có thể thử cái này

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

String USER_PASS = new String(encodedBytes);

HttpUriRequest request = RequestBuilder.get(url).addHeader("Authorization", USER_PASS).build();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.