5

Angular 将X-XSRF-TOKEN标头设置为XSRF-TOKENcookie 的值:

var xsrfValue = isSameDomain(config.url, $browser.url())
                ? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName]
                : undefined;
if (xsrfValue) {
  headers[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;
}

但是,如果使用(例如,用于 Rails 集成)设置XSRF-TOKENcookie :$cookieStore

$cookieStore.put("XSRF-TOKEN", "my_token"); 

cookie 存储为 JSON 字符串:

put: function(key, value) {
  $cookies[key] = angular.toJson(value);
}

这意味着标题将有额外的双引号:

X-XSRF-TOKEN    "my_token"

为什么 Angular 在设置标头的值时不调用fromJson(),以便标头看起来像这样:

X-XSRF-TOKEN    my_token

?

这将使我们免于删除服务器端的额外双引号。

我在这里遗漏了一些明显的东西吗?

注意:我不是在寻找解决方法。我试图了解这种行为是否是预期的行为,如果是,理由是什么?

4

1 回答 1

8

这是我得到的官方答案:

这里真正的问题是您试图将 $cookieStore 用于错误的目的。$cookieStore 是 $cookie 之上的抽象,它处理对象并将它们序列化为 JSON。如果你想分配 XSRF 令牌,那么只需使用 $cookie 来编写它,它直接与字符串一起使用。

换句话说,一个人应该这样做:

$cookies["XSRF-TOKEN"] = "my_token"; // Stored as: my_token

而不是:

$cookieStore.put("XSRF-TOKEN", "my_token"); // Stored as: "my_token"

于 2013-05-20T11:02:59.797 回答