如何从 angularjs 中的响应的 header 中读取令牌

How to read Token from header of a response in angularjs

我正在实施身份验证,我在服务器端响应中添加了一个令牌。

我正在尝试读取 angularjs 中服务器返回的 header 值,但是我没有看到 header 值存在。这是我的 javascript 控制台。

编辑:

return base.SendAsync(request, cancellationToken).ContinueWith(task =>
            {
                var response = task.Result;
                if (response.RequestMessage.Headers.Contains(TOKEN_NAME))
                {
                    string token = response.RequestMessage.Headers.GetValues(TOKEN_NAME).FirstOrDefault();
                    response.Headers.Add("Access-Control-Expose-Headers", TOKEN_NAME);
                    response.Headers.Add(TOKEN_NAME, token);
                }

                return response;
            });

access/authenticate 端点是在成功方法中将令牌作为数据返回还是在服务器端代码中设置了令牌?

-更新-

如果您在 HttpContext.Current.Response.AppendHeader('X-Token', "<some token value">); 中设置令牌,您应该能够在 $http promise

中获取它
$http.get("<api endpoint>").then(function(data){
            $log.log("data.config", data.config);
            $log.log("data.headers()", data.headers());
            $log.log("X-Token Header", data.headers()['x-token']);
});

data.config 是发送到服务器的 headers,例如接受和任何授权 headers。

data.headers()是服务器端设置的returns所有header的功能。 response.Headers.Add("Access-Control-Expose-Headers", TOKEN_NAME); 此行将确保此 header 可用于服务器

因此,如果我理解正确的话,您在 api 请求的 header 中传递 x-token 并且委托处理程序正在寻找 TOKEN_NAME 然后重置它,然后你试图在 $http 的承诺中访问它。我刚刚对这种情况进行了测试,然后我回来了 x-token;

-示例 angular 应用程序

        (function () {
        var app = angular.module('app', []);

        app.config(function ($httpProvider) {
            $httpProvider.defaults.headers.common["x-token"] = "";
        });


        app.controller('home', function ($http, $log) {
            $http.get('/api/car/get')
                .then(function (response) {
                $log.log("Response headers",response.headers());
                $log.log(response.headers()["x-token"]);
            });
        });

    })();

-控制台window

-CustomDelegatingHandler 我不使用变量令牌,因为我没有令牌端点来获取一个。相反,我只是传回了一个随机的 GUID。

 protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
          CancellationToken cancellationToken)
        {
            return await base.SendAsync(request, cancellationToken).ContinueWith(task =>
            {
                var response = task.Result;
                //Are you sure your passing this check by setting the x-token common header in your angular $http requests?
                if (response.RequestMessage.Headers.Contains(TOKEN_NAME))
                {
                    string token = response.RequestMessage.Headers.GetValues(TOKEN_NAME).FirstOrDefault();
                    response.Headers.Add("Access-Control-Expose-Headers", TOKEN_NAME);
                    response.Headers.Add(TOKEN_NAME, Guid.NewGuid().ToString());
                }

                return response;
            }, cancellationToken);
        }