2013-08-16 29 views
63

Tôi đang cố gắng có được một dữ liệu POST từ API của tôi nhưng tôi không thể vượt qua xác thực cơ bản ...Làm thế nào để gửi một tiêu đề uỷ quyền chính xác cho xác thực cơ bản

tôi cố gắng:

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

đáp ứng 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à:

Request Headers

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 đề đáp ứng

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 những gì cấu hình máy chủ là tốt vì tôi có thể truy cập vào API từ Advanced REST Client (Chrome Extension)

Bất kỳ đề xuất?

PD: Các tiêu đề mà tôi nhận được từ nâng cao REST của khách hàng 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 ZWx1c3VhcmlvOnlsYWNsYXZl 
    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 pháp OPTION

+9

Tôi nhận thấy bài đăng này đã chết, 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 đề Cấp quyền: bạn đã đăng mật khẩu của mình rõ ràng. Chuỗi vô nghĩa chỉ có mã hóa base64 của tên người dùng của bạn: mật khẩu, vì vậy mọi người đều có thể nhìn 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 khẩu giả ở đây :) – Lexelby

Trả lời

37

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:[email protected]/index.html 

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

HTTP Basic Authentication credentials passed in URL and encryption

tất nhiên, bạn sẽ cần mật khẩu Tên truy nhập, nó không phải 'Basic hashstring.

hy vọng điều này giúp ...

+0

Cảm ơn giải pháp này đơn giản và nhanh hơn những giải pháp khác mà tôi đã tìm thấy – individuo7

+0

vui lòng chỉnh sửa câu trả lời của bạn và thay đổi url để ngăn google hoặc bot lập chỉ mục – individuo7

+4

Giải pháp đó đã thắng 't làm việc cho trình duyệt Native 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. –

50

mỗi 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 để làm auth cơ bản với một tiêu đề thay vì đặ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 của bất kỳ ai có quyền truy cập vào mạng hoặc mã JS này (ví dụ:một người sử dụng thực hiện nó trong một trình duyệt):

$.ajax({ 
    type: 'POST', 
    url: http://theappurl.com/api/v1/method/, 
    data: {}, 
    crossDomain: true, 
    beforeSend: function(xhr) { 
    xhr.setRequestHeader('Authorization', 'Basic ' + window.btoa(unescape(encodeURIComponent(YOUR_USERNAME + ':' + YOUR_PASSWORD)))) 
    } 
}); 
+1

Lưu ý: Một polyfill window.btoa như Base64.js sẽ được yêu cầu để 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. – Techbrunch

+0

@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 phổ biến để 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 không .. –

1

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

bạn có thể thử 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(); 
16

NodeJS trả lời:

Trong trường hợp bạn muốn làm điều đó với NodeJS: hãy tạo điểm truy cập GET đến JSON với tiêu đề Authorization và nhận được Promise quay lại:

Đầu tiên

npm install --save request request-promise 

(see on npm) và sau đó trong .js tập tin 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 
}); 
2

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

btoa là một hàm lấy chuỗi làm đối số và tạo chuỗi ASCII được mã hóa Base64. Được hỗ trợ bởi 97% of browsers.

Ví dụ:

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

Bạn có thể sau đó thêm Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ= đến authorization tiêu đề. Lưu ý rằng các thông báo trước về HTTP BASIC auth đượ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 qua https, bạn có thể giải mã chuỗi mã hóa Base64 để lấy mật khẩu của mình.

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

Các vấn đề liên quan