2013-06-04 25 views
5

Tôi đã viết bộ điều khiển sau để kiểm tra Xác thực cơ bản HTTP bằng Angular JS.Không thể đặt tiêu đề Xác thực cơ sở HTTP trong AngularJS

function TestCtrl($scope, $http, Base64){ 
    $http.defaults.headers.common.Authorization = 'Basic ' + Base64.encode('admin:secret'); 
    $http.jsonp('http://localhost:5000/test'+'/?callback=JSON_CALLBACK', {query:{isArray:true }}). 
    then(function (response) { 
     $scope.test = response.data; 
    }); 
} 

Tôi có thể thấy tiêu đề được đặt khi tôi console.log($http.defaults.headers). Nhưng khi tôi kiểm tra các tiêu đề yêu cầu bằng Thanh công cụ dành cho nhà phát triển Chrome hoặc Firebug trong Firefox, tôi không thấy tiêu đề Cấp quyền.

Máy chủ nhận yêu cầu không nhận được tiêu đề Cấp quyền.

Tôi đang làm gì sai ở đây?

+1

Bạn không thể tùy chỉnh tiêu đề bằng JSONP. Xem http://stackoverflow.com/questions/3073287/set-headers-with-jquery-ajax-and-jsonp –

+0

Thanks .. Đoán tôi nên sử dụng get hoặc post sau đó. – Manu

Trả lời

4

Tôi tin câu trả lời là "Có, đối với các yêu cầu AJAX thông thường, bạn sẽ có thể đặt tiêu đề xác thực phù hợp".

Tuy nhiên, bạn không thực hiện cuộc gọi XHR chuẩn khi bạn sử dụng JSONP (dựa trên ví dụ), thay đổi câu trả lời thành "Không".

Nếu bạn gặp khó khăn khi sử dụng JSONP, tôi không nghĩ bạn có thể gửi bất kỳ tiêu đề xác thực nào. JSONP đơn giản không hoạt động giống như ví dụ của Angular's $http.get.

Xem chi tiết http://schock.net/articles/2013/02/05/how-jsonp-really-works-examples/, nhưng phiên bản ngắn là JSONP đặt thẻ <script> tìm nạp một số dữ liệu. Dữ liệu được trả về gọi hàm mà bạn cung cấp (JSON_CALLBACK trong ví dụ của bạn) xung quanh dữ liệu mà máy chủ cung cấp. Do đó, bạn không thể thay đổi tiêu đề - yêu cầu là yêu cầu HTTP GET chính xác như thể bạn đã dán URL cho thẻ tập lệnh vào thanh vị trí của trình duyệt.

1

JJ đã trả lời một cách hoàn hảo.

Để biết thêm thông tin về các trình duyệt đó, nếu bạn chỉ cần vượt qua tiêu đề Cấp quyền cơ bản, bạn có thể chỉ cần đặt tên người dùng và mật khẩu ở đầu URL. Điều này sẽ gửi tiêu đề.

Ví dụ, sử dụng localhost như URL và quản trị: bí mật như tên người dùng: mật khẩu, thay đổi:

http://localhost:5000 

tới:

http://admin:[email protected]:5000 

Lưu ý: @OliBlogger đã chỉ ra rằng phiên bản Chrome mới nhất không còn hỗ trợ tính năng này nữa. Kiểm tra nhận xét của anh ấy để biết liên kết đến cập nhật trạng thái Chrome thực tế.

+0

tại sao bỏ phiếu xuống? – eclipse1121

+0

Đã cố gắng điều này trong thanh địa chỉ của trình duyệt nhưng nó chỉ đưa ra một lỗi. Đây có thể là một tính năng của thư viện JS? Có lẽ downvote là vì thiếu chi tiết cụ thể cũng như có lẽ không phải là một thực hành tốt nhất, nhưng nó là một tính năng thú vị để biết về. – user1944491

+0

cảm ơn nhận xét. đây là [ví dụ] (http://i.imgur.com/l0os1pJ.png) về cách bạn có thể làm điều đó bằng cách sử dụng API sọc, sử dụng Basic Auth. những gì có thể được yêu cầu là URL được yêu cầu phải trả về tiêu đề Cơ bản xác thực cũng như tiêu đề 401 trái phép, nhưng tôi không chắc chắn – eclipse1121

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