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

时间:2015-11-22 19:45:21

标签: javascript angularjs authentication token

我正在实施身份验证,我从服务器端添加了一个令牌。 enter image description here

我正在尝试读取angularjs中从服务器返回的此标头值,但是我没有看到此标头值存在。这是我的javascript控制台。 enter image description here

修改

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;
            });

1 个答案:

答案 0 :(得分:4)

访问/身份验证端点是否将令牌作为success方法中的数据返回,还是在服务器端代码中设置了令牌?

-Update -

如果您在HttpContext.Current.Response.AppendHeader('X-Token', "<some token value">);中设置令牌,您应该可以在$ http承诺中抓取它

$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是发送到服务器的标头,例如accept和任何授权标头。

data.headers() 是返回设置为服务器端的所有标头的函数。 response.Headers.Add("Access-Control-Expose-Headers", TOKEN_NAME);此行将确保此标头可供服务器使用

enter image description here

enter image description here

data.config vs data.headers()

因此,如果我正确理解您在api请求的标头中传递x-token,并且Delegating Handler正在寻找TOKEN_NAME,然后重置它,然后您尝试在$ http的承诺中访问它。我只是为这个案例组成了一个测试,并且我正在取回x-token;

-Sample angular app

        (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"]);
            });
        });

    })();

- 控制台窗口 enter image description here

-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);
        }