从AngularJs App访问Django服务器:简单的身份验证解决方案?

时间:2016-11-22 23:46:13

标签: angularjs django authentication http-headers restful-authentication

我一直在寻找各处,但似乎无法找到有帮助的答案。

我写了一个角度应用程序,试图从我公司编写的django RESTful后端提取数据。我有一个用户名和密码,但我不确定如何编写get请求以向后端提供身份验证凭据。我还对我应该在标题中提供的内容感到困惑。

最终,我们将使用nginx进行通信。

我想要什么

我正在寻找修补程序,以便在角度应用程序中自行编写。我试图尽可能将角度应用程序与django后端分开。我已经启用了跨源资源共享。

这将是一个乐队助手修复,只是为了显示来自后端的数据。无论如何,它不需要是永久性的。

到目前为止,我已经尝试过:

app.factory('mySamples', ['$http', function($http) {
    return $http.get('website/api/foo', {
    headers: {'username':"foo", 'password': 'bar'}
  }).success(function(data) {
    return data;
  }).error(function(err) {
    return err;
  }); 
};

app.factory('mySamples', ['$http', function($http) {
    return $http({method: 'GET', url: 'website/api/samples/', headers: {
        'user': 'foo', 'auth':'bar'}
    });
};

我写的第二个工厂在返回的标题下的网络检查器中返回METHOD:OPTIONS。有没有人只是为了从我的api获取数据而快速修复?

编辑:我的django后端不支持基本身份验证,只支持基于会话。我该如何编辑我的获取请求?

2 个答案:

答案 0 :(得分:1)

(1)如果您使用的是基本身份验证,则可以添加如下基本身份验证:

app.factory('mySamples', ['$http', function($http) {
    var credentials = btoa(username + ':' + authtoken);
    var authorization = {
        'Authorization': 'Basic ' + credentials
    };        
    return $http({method: 'GET', url: 'website/api/samples/', headers: authorization });
};

如果您的所有$ http调用都使用相同的身份验证,则可以使用$http.defaults.headers.common.Authorization

(2)我很确定nginx不提供会话处理 - 你必须在django中这样做。

(3)我通常不使用REST会话,因为REST通常是无状态的。

OP询问如何启用CORS。启用CORS通常在服务器端完成。你可以通过添加:

在nginx中完成
 add_header 'Access-Control-Allow-Origin' '*';
 add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

到适当的location块。您也可以在django端使用django-cors-middleware(https://pypi.python.org/pypi/django-cors-middleware)或django-cors-headers(https://pypi.python.org/pypi/django-cors-headers)等中间件版本执行此操作。

答案 1 :(得分:1)

首先需要知道服务器端实现了哪种AuthenticationAuthorization,即服务器查找身份验证/授权凭据的头部以及服务器期望的格式,然后在该标头密钥下发送凭据。例如,如果服务器在格式为Authorization的{​​{1}}标头中检查身份验证凭据,则需要添加标题,如

username::password