授权标头未在后端 Angular 2 + Spring Boot 中接收

Posted

技术标签:

【中文标题】授权标头未在后端 Angular 2 + Spring Boot 中接收【英文标题】:Authorization header is not receiving in the backend Angular 2 + Spring Boot 【发布时间】:2018-01-28 19:04:10 【问题描述】:

我正在尝试在 http 请求中传递授权标头:

我的 Angular 代码是这样的:

 let headers = new Headers();
        headers.append('Content-Type', 'application/json');
        headers.append('Authorization', this.uriRequest.appendAuthHeaderValue());
        let options = new RequestOptions( headers: headers );

        console.log(JSON.stringify(options));

        this.http.post(this.urlManager.BASE_URL + this.urlManager.customerServiceURL, body, options).map(
            (response) => 
                console.log(JSON.stringify(response));
            );

在控制台上,我发现在选项中我的授权标头已正确设置:

"method":null,"headers":"Content-Type":["application/json"],"Authorization":["eyJhbGciOiJIUzIiJ9.eyJleHAiOjE1MDMyNTQ4NDIsInN1YiI6Ild25ldyIsInVzZXJJZCI6ImRlbW8iLCJyb2xlIjoiVFUiJ9.OvS69uweYIB96mQLt61RQVyoPnbY0aUhqpzUvHu40"],"body":null,"url":null,"withCredentials":null,"responseType":null

但在我的后端我无法获得令牌:

我的 COROS 文件管理器:

HttpServletResponse res = (HttpServletResponse) response;
    HttpServletRequest  req = (HttpServletRequest) request;

res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS");
res.setHeader("Access-Control-Allow-Headers", " x-requested-with, Content-Type, Accept, Accept-Encoding, Accept-Language, Host, Referer, Connection, User-Agent, Authorization, sw-useragent, sw-version");
res.setHeader("Access-Control-Expose-Headers", "Authorization");

    // Just REPLY OK if request method is OPTIONS for CORS (pre-flight)
    if ( req.getMethod().equals("OPTIONS") ) 
    res.setStatus(HttpServletResponse.SC_OK);
    return;

    chain.doFilter(request, response);

我得到我的令牌是这样的:

final String token = request.getHeader("Authorization");

请帮助我,我无法从这里继续。

附加屏幕:

选项:

发布:

响应标题:

【问题讨论】:

在浏览器 devtools 的“网络”窗格中,您看到了哪些关于正在发送的请求的详细信息(两个请求:CORS 预检 OPTIONS 请求,然后是 POST 请求)?它显示了哪些请求标头?它显示了哪些响应?什么是响应标头?响应的状态代码是什么?您应该使用***.com/posts/45784675/edit 编辑/更新您的问题并将所有这些详细信息添加到问题中。浏览器记录到 devtools 控制台的消息是什么? @sideshowbarker 我已从我的浏览器网络选项卡中附加了屏幕。 您添加的内容不显示响应标头。您希望特别显示第一个响应的响应标头 - 对 OPTIONS 请求的响应。但无论如何现在,这清楚地表明您的浏览器没有在 POST 请求中发送 Authorization 请求标头。这就是您的后端现在无法访问它的原因——授权实际上并不存在于正在发送的 POST 请求中 @sideshowbarker 对不起,我也添加了这些。 好的,所以这些标头都表明您的浏览器没有看到来自您的前端 javascript 代码的任何授权请求标头。为什么会这样,我不知道——但就您的浏览器而言,根本就没有 Authorization 请求标头 【参考方案1】:

如果你还没有找到答案。在这里。

Angular 中的标题是不可变的。所以 headers.append() 实际上返回了一个新的 header 而旧的保持不变。

你必须像这样使用它,

let headers = new Headers();
headers = headers.append("some-header", "value");
headers = headers.append("another-header", "another-value");

然后只是传递这个标题。

【讨论】:

以上是关于授权标头未在后端 Angular 2 + Spring Boot 中接收的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2:获取授权标头

设置授权标头时,角度显示错误 405 方法不允许

使用 OPTIONS 方法未使用 http 请求 Angular 6 发送授权标头

Ionic 2 / Angular 2 / CORS:HTTP 标头未随请求一起发送

Angular 2 - 没有访问控制允许原始标头[重复]

具有基本身份验证的 Angular 7 HTTP 请求 [关闭]