【问题标题】:Angular cors GET data from a django rest framework backend with permissionAngular cors 从 django rest 框架后端获取数据并获得许可
【发布时间】: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)

【问题讨论】:

    标签: angularjs django rest cors django-cors-headers


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2015-12-07
    • 2017-06-03
    • 2021-05-26
    • 2018-06-25
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多