【问题标题】:How to read Token from header of a response in angularjs如何从angularjs中的响应标题中读取令牌
【发布时间】:2016-02-24 20:54:31
【问题描述】:

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

我正在尝试在 angularjs 中读取从服务器返回的此标头值,但是我看不到此标头值。这是我的 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;
            });

【问题讨论】:

  • 可能的答案here
  • @Dvir:您添加了同样的评论以寻求有效的解决方案。

标签: javascript angularjs authentication token


【解决方案1】:

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

-更新-

如果您在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 是发送到服务器的标头,例如接受和任何授权标头。

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

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

-示例角度应用程序

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

    })();

-控制台窗口

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

【讨论】:

  • 令牌在标头而不是数据中返回。我不确定将令牌作为数据发送是否是一个好习惯。目前我正在服务器端代码的标头中设置令牌。
  • 我没有将 HttpContext 放入我的 DelegatingHandler 类
  • 那你是怎么设置标题的呢?
  • 只需突出显示您的关键就可以从您的答案中删除以反映我所缺少的内容。谢谢你的帮助。当我使用 data.headers() 时它起作用了。这在$http.success(data, status)中不可用
  • 你可以在成功方法中尝试它是 $http.get (endpoint).success (function(response, staus, headers){ $log.log (headers ('x-token' );}); 我并不是 100% 认为这是正确的,因为我从未真正尝试过。
猜你喜欢
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 2021-07-29
  • 2021-04-20
  • 1970-01-01
  • 2019-12-25
  • 2018-12-30
  • 1970-01-01
相关资源
最近更新 更多