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 错误
使用 Django 和 Angular 的 CORS 预检请求
如何使用 Angular 7 在 django1.1 中启用 cors?