AngularJS:未发送 X-Auth-Token(错误 401)

Posted

技术标签:

【中文标题】AngularJS:未发送 X-Auth-Token(错误 401)【英文标题】:AngularJS: X-Auth-Token not sent (error 401) 【发布时间】:2014-09-08 22:17:30 【问题描述】:

我在这里是因为我尝试了所有方法,但我不明白我做错了什么。

作为后端,我使用 Spring MVC、Rest 和 Spring Security。我正在使用基于令牌(完全无状态)的自定义身份验证系统。我还有一个 CORS 的过滤器,因为我的前端应用程序没有在同一台服务器上运行。

这就是我在 angularJS 中所做的,以便在我想访问受保护的资源时获得身份验证:

我创建了一个拦截器,可以更改每个请求以添加从 cookie 中找到的令牌 我在请求中添加了一个自定义标头

这是我的拦截器所做的:

request: function(config) 
            var token = $cookieStore.get("token");
            if (token && token.key) 

                config.headers["X-Auth-Token"]=token.key;

            
            console.log(config.headers);

            return  config || $q.when(config);
        

但是当我尝试访问受保护的资源时,即使令牌仍然有效,它也不会将 X-Auth-Token 标头放在请求中!它试图发送一个选项的请求,但由于 401 错误而失败!

但如果我对 url 参数(如 token=....)执行相同操作,拦截器将按预期工作...(我已经实现了两个系统:通过参数和通过标头)

我不明白为什么标题没有按预期放置?以及为什么它与 POSTMAN 之类的东西完美配合?

请帮忙,我正在为此失去头发......

【问题讨论】:

【参考方案1】:

这样做可能比您接受的答案更干净。

if (request.getMethod().equals("OPTIONS")) 
    response.setStatus(HttpServletResponse.SC_OK);
 else 
    chain.doFilter(request, response);

【讨论】:

您好,我遇到了完全相同的问题,并且解决方案确实有效。但是我不完全理解为什么。有人可以解释一下吗?为什么选项的处理方式不同,为什么会跳过过滤器链?【参考方案2】:

我通过更改过滤器解决了这个问题:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException HttpServletRequest 请求 = (HttpServletRequest) 请求; LOG.info("继续过滤");

    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET,  DELETE, PUT");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Accept, Content-Type, Origin, Authorization, X-Auth-Token");
    response.addHeader("Access-Control-Expose-Headers", "X-Auth-Token");
    if (request.getMethod().equals("OPTIONS")) 
        try 
            response.getWriter().print("OK");
            response.getWriter().flush();
         catch (IOException e) 
            LOG.error(e.getMessage());
        
     else 
        chain.doFilter(request, response);
    


【讨论】:

【参考方案3】:

不确定这是否能解决您的问题,但 $cookieStore 只能获取/设置字符串,因此如下:

var token = $cookieStore.get("token");
        if (token && token.key) 

永远不会评估为真。

【讨论】:

谢谢,我这样做是因为找不到 cookie。即使没有条件,问题仍然存在。奇怪的是,如果我执行 config.headers 的 console.log,x 身份验证令牌就存在。但是当请求执行时,它直接失败并且令牌不存在。不确定问题是在角度还是在我的后端。

以上是关于AngularJS:未发送 X-Auth-Token(错误 401)的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS 不发送授权或任何额外的键/值标头

从 PHP 到 AngularJS 的数据不匹配

CORS AngularJS 不使用 POST 或 DELETE 发送 Cookie/凭据,但 GET OK

XmlHttpRequest CORS POST 未发送 cookie

护照通过json发送错误

使用节点 js、AngularJs 和 JWT 使用用户名和密码进行身份验证