2017-06-12 103 views
1

即时通讯尝试使附加用户令牌的拦截器在每个请求中都存在的情况下,该令牌存在但它不发送它......通话结束后,我查看F12(Chrome开发工具)的电话和授权标题不存在...AngularJS不发送身份验证标头

但是,如果我一步一步调试,我可以看到如何在config.headers.Authorization有我的令牌...但仍然没有发送通过请...我可以请求一些帮助吗?

这是我拦截

$httpProvider.interceptors.push(function($q, $location, $cookies){ 
    return { 
     request: function(config){ 
      config.headers = config.headers || {}; 
      let token = $cookies.get('user'); 
      if (token) { 
       config.headers.Authorization = 'Bearer ' + token; 
      } 
      return config; 
     }, 
     response: function(response){ 
      return response; 
     }, 
     responseError: function(response){ 
      if(response.status === 401 || response.status === 403){ 
       $location.path('/login') 
      } 
      return $q.reject(response); 
     } 
    } 
    }) 

CORS配置

var allowCrossDomain = function(req, res, next) { 
    res.header('Access-Control-Allow-Origin', '*'); 
    res.header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE, OPTIONS'); 
    res.header('Access-Control-Allow-Headers', 'X-Requested-With,Content-Type,Authorization'); 
    next(); 
} 

配置在它之前发送

config before it be send

REQ/RES预检 req/res preflight

+0

您的预检'选项'请求是否返回'Access-Control-Allow-Headers:X-Requested-With,Content-Type,Authorization'? – lin

+0

是的这是,这些是我把我的服务器端允许的标头 – FridoxFL

+0

你可以尝试'console.log(配置);'直接上面'返回配置;'是你的配置里面?这一切对我来说似乎都很好。 – lin

回答

2

确保您的OPTIONS请求不需要“身份验证”,您会没事的。 W3 spec for CORS preflight requests表示应排除用户凭证。

如果HTTP-Status 401已被OPTIONS请求返回,则不应该由客户端发送子请求。但似乎有一些浏览器的错误。即使OPTIONS请求返回401,此浏览器也会发送子请求。

node.js您可以使用req.method === 'OPTIONS'检查请求方法。

+0

谢谢你,这解决了我的问题,我刚刚添加了这个 if( req.method ===“OPTIONS”) res.sendStatus(200); else next(); – FridoxFL