我的身份验证令牌拦截器不拦截新路由的请求/响应

时间:2015-01-26 08:42:10

标签: angularjs node.js authentication jwt express-jwt

我正在尝试为我的nodejs,express和angularjs app实现jwt身份验证。到目前为止,我已经生成了令牌,并将其存储在我的localStorage中。根据{{​​3}}教程,我在角度工厂中实现了authInterceptor,如下所示:

app.factory('authInterceptor', function ($rootScope, $q, $window) {
  return {
    request: function (config) {
      config.headers = config.headers || {};
      if ($window.localStorage.myToken) {
        config.headers.Authorization = 'Bearer ' + $window.localStorage.myToken;

      }
      return config;
    },
    response: function (response) {
      if (response.status === "401") {
        $window.location.replace('/dash');
      }
      return response || $q.when(response);
    }
  };
});

我已经在配置文件中推送了拦截器,如下所示:

$httpProvider.interceptors.push('authInterceptor');

到目前为止,我已将凭据发送到服务器,生成令牌并将其存储在localStorage中。

因此,只要我没有从localStorage中删除令牌,并且令牌未过期,我认为它应该持续存在。如果我使用angularjs的后台ajax调用从加载的页面内发出请求,则认证标头按照预期设置。

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYSIsInR5cGUiOiJzYWxlcyIsImlhdCI6MTQyMjI2MDExMCwiZXhwIjoxNDIyMjc4MTEwfQ.Iv6W-Tc8Qm4FGclzmgbtjvWFz_tyDwEvrFmMmucONpY

但是,当我导航到新路线时,我的请求和我的回复都没有被截获。例如,我有我的' / sales'路线。但是当我从地址栏导航到销售路线时,拦截器都没有设置请求认证头,因此从服务器返回授权错误401,也没有截获;因此不会重定向到/dash

这是错误的链接,以及GET请求到未授权路由' / sales'的标题: request and response header at 401 error

2 个答案:

答案 0 :(得分:2)

你的后端是否发送了WWW-Authenticate标题以及401状态?如果是,并且它包含Basic,浏览器将捕获响应并在Angular捕获之前显示凭据弹出窗口。

尝试删除或更改它。

参考文献:

答案 1 :(得分:1)

到目前为止我所理解的是,通常在javascript前端框架之前如何提供http请求:

  • 我们在地址栏中输入网址。
  • 浏览器发送请求。
  • 服务器获取请求。
  • 提供必要的html,js和css文件。
  • 浏览器呈现它。

但是随着最近向各种javascript前端框架的转变以及RESTful api.s的使用已经开始,请求需要具有授权标头。因此,在许多具有javascript框架的单页网页应用程序中,例如angularjs,

  • 对' /'的初始请求路由器已发送
  • 服务器将Web应用程序提供给浏览器
  • Web应用程序中的所有进一步路由都是在前端应用程序中完成的,因此"#"在网址之后。
  • 应用程序通过角度js从应用程序获取,更新,删除或发布请求。

因此,当从角度应用程序发出请求时,它会从角度应用程序中截取并被拦截器截获。但是,当从地址栏输入URL时,浏览器会直接向服务器发送请求,因为在请求的那一点,浏览器尚未加载角度Web应用程序。

我所做的是你将html5mode设置为false并在路线前放置#

localhost/#/some-route类似,并从路由提供商处进行路由。当您的路由前有#时,/的请求将转到服务器,应用程序加载,然后通过应用程序发送请求。现在从这个some-route,让一些控制器向所需的服务器端点发出请求,该端点将被拦截器截获。