Bởi vì việc sử dụng xác thực CORS và http với AngularJS có thể khó khăn nên tôi đã chỉnh sửa câu hỏi để chia sẻ một bài học kinh nghiệm. Đầu tiên tôi muốn cảm ơn igorzg. Câu trả lời của anh ấy đã giúp tôi rất nhiều. Tình huống như sau: Bạn muốn gửi yêu cầu POST đến một miền khác với dịch vụ AngularJS $ http. Có một số điều phức tạp cần lưu ý khi tải AngularJS và thiết lập máy chủ.
Đầu tiên: Trong cấu hình ứng dụng của bạn, bạn phải cho phép cuộc gọi tên miền chéo
/**
* Cors usage example.
* @author Georgi Naumov
* gonaumov@gmail.com for contacts and
* suggestions.
**/
app.config(function($httpProvider) {
//Enable cross domain calls
$httpProvider.defaults.useXDomain = true;
});
Thứ hai: Bạn phải chỉ định withCredentials: true và tên người dùng và mật khẩu vào yêu cầu.
/**
* Cors usage example.
* @author Georgi Naumov
* gonaumov@gmail.com for contacts and
* suggestions.
**/
$http({
url: 'url of remote service',
method: "POST",
data: JSON.stringify(requestData),
withCredentials: true,
headers: {
'Authorization': 'Basic bashe64usename:password'
}
});
Тthứ ba: Thiết lập máy chủ. Bạn phải cung cấp:
/**
* Cors usage example.
* @author Georgi Naumov
* gonaumov@gmail.com for contacts and
* suggestions.
**/
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Origin: http://url.com:8080");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization");
Đối với mọi yêu cầu. Khi bạn nhận được OPTION, bạn phải vượt qua:
/**
* Cors usage example.
* @author Georgi Naumov
* gonaumov@gmail.com for contacts and
* suggestions.
**/
if($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
header( "HTTP/1.1 200 OK" );
exit();
}
Xác thực HTTP và mọi thứ khác sau đó.
Đây là ví dụ đầy đủ về cách sử dụng phía máy chủ với php.
<?php
/**
* Cors usage example.
* @author Georgi Naumov
* gonaumov@gmail.com for contacts and
* suggestions.
**/
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Origin: http://url:8080");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization");
if($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
header( "HTTP/1.1 200 OK" );
exit();
}
$realm = 'Restricted area';
$password = 'somepassword';
$users = array('someusername' => $password);
if (isset($_SERVER['PHP_AUTH_USER']) == false || isset($_SERVER['PHP_AUTH_PW']) == false) {
header('WWW-Authenticate: Basic realm="My Realm"');
die('Not authorised');
}
if (isset($users[$_SERVER['PHP_AUTH_USER']]) && $users[$_SERVER['PHP_AUTH_USER']] == $password)
{
header( "HTTP/1.1 200 OK" );
echo 'You are logged in!' ;
exit();
}
?>
Có một bài viết trên blog của tôi về vấn đề này có thể được xem ở đây .