Angular cors 从 django rest 框架后端获取数据并获得许可

Posted

技术标签:

【中文标题】Angular cors 从 django rest 框架后端获取数据并获得许可【英文标题】:Angular cors GET data from a django rest framework backend with permission 【发布时间】:2015-08-06 04:33:00 【问题描述】:

我有一个 Angular 应用程序使 CORS 消耗了一个休息 api(Django Rest 框架)。现在我想GET 来自http://127.0.0.1/api/users 的所有用户。我已经启用我的后端以允许 cors 请求,如果 django 视图未设置任何权限限制 (permission_classes = ()),我可以毫无问题地获取数据。但是如果有权限限制IsAdminUser,我会失败。如果以管理员身份登录,我可以在浏览器中成功查看具有权限的用户。我的问题是如何让 Angular 使用 csrftoken 在获得许可的情况下使用其余 api。

用户列表视图:

# List all the users or create a new user
class UserList(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (IsAdminUser,)

angular中的代码:

$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
$httpProvider.defaults.withCredentils = true;

和:

.run(function run($http, $cookies)
    // For CSRF token compatibility with Django
    $http.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken;

错误:

Failed to load resource: the server responded with a status of 403 (Forbidden)

【问题讨论】:

【参考方案1】:

这取决于 DRF 身份验证方法。例如,如果您使用TokenAuthentication - 您需要将令牌设置为默认标头:

$http.defaults.headers.common.Authorization = 'Token ' + token;

其中token - 从服务器接收到的用户特定令牌。

【讨论】:

它不起作用。如果我直接从 Web 浏览器访问后端 rest api,我发现请求标头中有一个 csrftoken。我如何让我的 gulp 服务的前端 Angular 可以使用该令牌?关于angular-gulp-generator 我找到了一个类似的 question 但我仍然得到 403。 1.您执行什么类型的请求(GET 或 POST)? csrf 与 GET 请求无关,不能产生 403 异常。 2.您在后端使用什么类型的身份验证? 1.得到。为什么 GET 请求不能产生 403 异常。我认为这是一个 csrftoken 问题。因为如果我从 django 后端删除权限限制,我会得到正确的结果。我可以使用 $cookies.csrftoken 获得csrftoken。但我不知道如何将它放在请求标头中的正确位置。 2.使用默认的Django身份验证,如this

以上是关于Angular cors 从 django rest 框架后端获取数据并获得许可的主要内容,如果未能解决你的问题,请参考以下文章

CORS - Angular 和 Express 的 http OPTIONS 错误

CORS 403 错误 Angular 和 Express

使用 Django 和 Angular 的 CORS 预检请求

如何使用 Angular 7 在 django1.1 中启用 cors?

django、cordova、ionic 和 angular.js 的 CORS 问题

Django+Angular CORS 不适用于 POST