AngularJS 中的授权标头不起作用

2024-01-06

我正在为我的 API 使用 Django REST 令牌身份验证。

我发布了我的凭据来获取令牌端点。但是,当我尝试以正确的方式设置标头时,它会不断响应 http 401 错误。我尝试使用curl -X GET http://127.0.0.1:8000/events/ -H 'Authorization: Token 4d92d36768ca5d555b59cf68899eceab39c23704 '这确实有效!这是我的代码:

app.controller('HomeController', ['$scope','$http', function($scope,$http) {
    $scope.username = '';
    $scope.password = '';
    $scope.submitLogin = function () {
        var credentials = {
            username : $scope.username,
            password : $scope.password,
        };

        var req = $http.post('http://127.0.0.1:8000/api-token-auth/', credentials);
        req.success(function(data, status, headers, config) {
            $scope.token = data.token;
            var str1 = 'Token ';
            $scope.tokenheader = str1.concat($scope.token);
            $http.defaults.headers.common.Authorization = $scope.tokenheader;
        });
        req.error(function(data, status, headers, config) {
            alert( "failure message: " + JSON.stringify({data: data}));
        });
    };
    $scope.getEvents = function () {
        var req = {
            method: 'GET',
            url: 'http://127.0.0.1:8000/events/',
        }
        $http(req).then( 
           function() {
                       console.log('succes')
           }, 
           function(){
                       console.log('fail') 
        });
    };
}]);

以及chrome开发工具中的错误消息:

XMLHttpRequest cannot load http://127.0.0.1:8000/events/. 
Response for preflight has invalid HTTP status code 401

我该如何摆脱这个 401 错误?

Edit:我刚刚发现问题在于我的 API 上没有安装 CORS。我在 Chrome 中使用 CORS 插件,该插件适用于我的 api 的身份验证部分,但不适用于我的事件 url!


您是否检查过令牌实际上已添加到您的请求中?

例如,您可以使用 Chrome 开发人员工具来执行此操作。

就我个人而言,我更喜欢使用 $httpprovider.interceptor,如下所述:

angularjs $httpProvider 拦截器文档 https://stackoverflow.com/questions/26171986/angularjs-httpprovider-interceptor-documentation

这可确保令牌始终出现在任何调用中。

如果您要访问多个 API,您应该考虑添加如下内容:

           $httpProvider.interceptors.push(['$q', '$location', '$log', 'loginService', 'restHelperService',
            function ($q, $location, $log, loginService, restHelperService) {
                return {
                    request: function (config) {
                        // check if the request comes with an url
                        if (config.url) {
                            // check that the call is to the REST api, if yes add token
                            if (restHelperService.isRestCall(config.url)) {
                                // add auth header or revert to login
                                if (loginService.userIsLoggedIn()) {
                                    config.headers = config.headers || {};
                                    config.headers.Authorization = 'Token ' + loginService.getToken().token;
                                } else {
                                    $location.path('/login');
                                }
                            }
                        }
                        return config;
                    },
                    responseError: function (response) {
                        if (response.status === 401 || response.status === 403) {
                            // clear auth token if the REST call failed with the current token
                            if (response.config && response.config.url && restHelperService.isRestCall(response.config.url)) {
                                $log.debug(" restCall failed due to bad credentials, resetting credentials");
                                loginService.resetCredentials();
                                $location.path('/login');
                            }
                        }
                        return $q.reject(response);
                    }
                };
            }]);
    }])

这可以避免当您开始将令牌添加到不需要它们的 API 调用时出现的问题。此外,该代码还确保如果凭据无效,用户将自动重定向到登录页面。

例如,我正在使用两项附加服务。管理令牌的 loginService 和管理 REST 框架 url 的restHelperService。

我建议您执行相同的操作,否则将很难从控制器外部访问凭据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularJS 中的授权标头不起作用 的相关文章

随机推荐

  • 如何使用 VSTS 2008 Database Edition GDR 版本编辑数据库对象的默认模板

    我正在尝试使用 Visual Studio Team System 2008 数据库版 GDR 版本 来完成我正在开发的一个新项目 并且遇到了一个有点烦人的问题 我希望有人知道如何解决该问题 简而言之 我想更改用于生成数据库对象 特别是存储
  • 使用 FireDac (Delphi) 在 Firebird 中创建数据库

    我最近从 AnyDac 更改为 FireDac 8 0 5 3365 我们正在运行 Delphi 2006 当我使用该组件的 AnyDac 版本时 我可以通过执行以下操作来创建一个新数据库 设置我的连接 fConnection LoginP
  • 在 C# 应用程序中管理多个 Windows 窗体

    关于管理具有多种形式的应用程序的好方法的任何想法 建议 模式 第一个页面是登录 加载 主表单 用户可以从那里启动许多其他 子表单 可能会随着时间的推移而增长 用户应该能够随时取消整个应用程序 我知道我现在做事的方式并不总是优雅的 Cody
  • 使用 git/github 对 R 包进行版本控制?

    我在确定更新 github 上 R 包版本号的工作流程时遇到问题 以避免错误命名 中间 版本 这就是我现在所做的 提交并推送 例如版本 1 0 0 并将发行版设置为 1 0 0 提交并推送一些错误修复等 而不更改描述文件 最终决定我应该将版
  • git pull 实际上并没有从远程恢复我丢失的文件

    我一直在一个分支机构工作 我提交并将其推送到远程存储库 现在该分支上的一些文件丢失了 希望它们在远程分支上仍然可用 所以我尝试这样做git pull git pull origin feature my branch 然而 git表示所有内
  • Objective C - 隐藏 iVar

    这是我的问题 假设我有一个名为 WebServiceBase h 的类 我需要在该类中添加一个名为 NSString requestData 的 iVar 但我不需要将该 iVar 添加到头文件中并使其对外部人员可见 如果我将其作为类库分发
  • SQL在分割字符串后将数据插入到其他表中

    我有一张桌子WCA ID TYPE 1 1 3 5 2 1 5 现在我想将数据移动到新表WCA TYPE ID WCA ID TYPE 1 1 1 2 1 3 3 1 5 4 2 1 5 2 5 这里的ID是自动增加的 如何在 MS SQL
  • 数据更改时 LiveData 不更新

    我正在使用 LiveData 从服务器获取数据并观察它 我的onChanged 方法只在第一次被调用 当服务器中的数据更新时不会被调用 用户片段 UserViewModel userViewModel ViewModelProviders
  • 如何向 QMainWindow 添加背景图像?

    大家好 我是 QT 创建者的新手 我尝试了很多方法来设置 Q 主窗口的背景图像 我添加了一个带有图像的资源文件夹 我尝试在 UI 中使用 setstylesheet 添加并尝试对其进行编码 当我使用用户界面时 我可以看到图像 但当我运行它时
  • 具有多个命名空间的 VBA SelectSingleNode xpath

    我遇到了与其他人类似的问题 尝试通过具有两个命名空间的 XML 使用 xPath 进行搜索 但仍在查看其他主题 但它似乎不起作用 XML
  • 更新一类中的多个项目,而不仅仅是一个

    在此代码的更新部分中 只有第一个制作的蝙蝠受到 Bat 类中 update 的影响 主循环之外 START BAT COUNT 30 BAT IMAGE PATH os path join Sprites Bat enemy Bat 1 p
  • Kubernetes - 如果容器无法重新触发初始化容器,则强制 pod 重新启动

    我在我的 pod 中发现 如果容器因存活探针失败而失败或被终止 容器会重新启动 但 pod 不会 这意味着initContainers在容器崩溃的情况下不会再次运行 就我而言 我确实需要运行其中之一initContainers每次主容器失败
  • 我应该用什么来替换 hibernate 已弃用的 @TypeDef 和 @Type 注释?

    我刚刚将 Hibernate 使用的版本升级到 5 6 1 现在似乎弃用了一些与类型相关的注释 TypeDef name json typeClass JsonBinaryType class Type type json 我没有找到任何关
  • 使用 Inno Setup 安装隐藏文件

    我需要使用 Inno Setup 创建的安装程序在最终用户计算机上安装一组跨越多个文件夹的隐藏文件 我已经提到过在 Inno Setup 中复制隐藏文件 https stackoverflow com questions 34050206
  • 游戏中心与 Sprite Kit 集成?

    如何将 Game Center 或 GameKit Framework 与 Sprite Kit Xcode 模板结合使用 在Sprite套件中 它使用Scenes 但通常要查看排行榜 例如您需要 presentModalViewContr
  • 解决 C++ 对临时变量的非常量引用的限制

    我有一个 C 数据结构 它是其他计算所需的 暂存器 它的寿命不长 并且不经常使用 因此对性能不是至关重要的 然而 它在其他可更新的跟踪字段中包括一个随机数生成器 虽然生成器的实际值并不重要 但它is重要的是该值被更新而不是复制和重用 这意味
  • 如何使用 Google Plus 登录让用户登录 Firebase

    我喜欢在 FireBase 中使用 Google 加号进行身份验证 Google Plus 的signinCallback 返回一个auth 对象 如何使用此信息让我的用户安全登录 FireBase Auth auth 对象如下所示 acc
  • 固定页眉、页脚和侧边栏,滚动内容区域位于中心

    从这个开始演示模板 http jsfiddle net kFBuD 91 我想创建这个布局 但我有以下问题 两个侧边栏不包含在可滚动内容 div 内 内容div不采用固定大小 可滚动内容溢出时不呈现滚动条 最好使用浏览器的主滚动条 有人可以
  • 如何在 Android 中显示组合框? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 Android 中显示组合框 在 Android 中 它被称为 Spinner 您可以在此处查看教程 你好 旋转者 https
  • AngularJS 中的授权标头不起作用

    我正在为我的 API 使用 Django REST 令牌身份验证 我发布了我的凭据来获取令牌端点 但是 当我尝试以正确的方式设置标头时 它会不断响应 http 401 错误 我尝试使用curl X GET http 127 0 0 1 80