【问题标题】:How do I access cookies set by passportjs in angularjs如何在angularjs中访问passportjs设置的cookie
【发布时间】:2014-10-12 01:02:51
【问题描述】:

我真的希望这不是一个愚蠢的问题,但我怀疑它是。我已经用谷歌搜索了所有我能理解的东西,但我仍然不明白如何读取使用 nodejs/express/passport 设置的 cookie。

我正在使用 Angular 的 ngCookies 和 $cookies 服务,但是当我尝试打印出我在服务器端设置的 cookie 时,我看到了这个(使用 console.log($cookies["connect.sess"]))

s:j:{"passport":{"user":{"id":1,"email":"xxxxxx@yyyy.com","role":"Admin"}}}.0lKpQzpgzCAjgkIayDkUiOLhktIYsohr61U/4xSwWFA

我的 cookie 在里面。但它都存储为一个字符串,周围有其他东西。我应该看一个不同的对象吗?它不会让我访问 -->

$cookies["connect.sess"].passport

因为这是未定义的,这是有道理的,因为 $cookies["connect.sess"] 返回一个字符串。关于我在哪里出错的任何提示?我需要做的就是访问这些在服务器中设置的 cookie。我不需要改变它们。我希望对此有更多的关注可以解决问题。我难住了!

我尝试使用 res.cookie 设置我自己的 cookie。在我创建 cookie 的服务器端,它看起来不错。但是在 angular 之间的某个地方,它看起来像 "j:{my json cookie}" 这次没有 s: 在前面,最后没有 gobble-de-gook。当然我可以解析出这些东西并找到我的 json,但是这些东西是在哪里添加的,为什么?

我做了一些探索,如果你传入一个对象,那么 express response.cookie 会在 json 前面添加 j:。和 s: 在 json 对象之后带有简介是他们签署 cookie 的方式。所以我发现我并不真的需要护照发送的会话 cookie。我可以只使用会话 cookie 中的用户 ID 在服务器端进行身份验证,并创建自己的电子邮件和角色 cookie,使用:

res.cookie("email", user.email, {my cookie options}) 
res.cookie("role", user.role, {my cookie options})

而不是尝试使用 json 对象填充会话 cookie。鉴于我今天所知道的,我在下面选择的答案是最好的选择。尽管我很难相信您必须从对象中删除字符才能正确获取客户端 cookie。似乎很奇怪。我是一个 cookie 新手,所以如果有人有解释或阅读的好链接,我很乐意听到。

【问题讨论】:

  • 如果它可以帮助任何人看到这个。我还在用快递3。但是最新版本的护照和角度。

标签: angularjs node.js cookies passport.js


【解决方案1】:

Cookies 总是以字符串的形式存储,所以这就是你在执行 console.log($cookies["connect.sess"]) 时得到一个字符串的原因,而这个字符串是对象的 json 表示。

由于您的 cookie 包含一些非 json 内容,首先您需要提取括号“{}”之间的所有内容,然后将字符串反序列化为 javascript 对象。

要将 JSON 字符串反序列化为 javascript 对象,您必须使用 angular.fromJson(json)。

例子:

//'s:j:{"passport":{"user":{"id":1,"email":"xxxxxx@yyyy.com","role":"Admin"}}}.0lKpQzpgzCAjgkIayDkUiOLhktIYsohr61U/4xSwWFA';
var s = $cookies["connect.sess"];

// First extract json object from the crazy cookie string
//There is also an option to to this with regular expressions
var jsonString = s.substring(s.indexOf("{"), s.lastIndexOf("}") + 1);

// Then convert to a javascript object
var obj = angular.fromJson(jsonString);
var passport = obj.passport;

https://docs.angularjs.org/api/ng/function/angular.fromJson

【讨论】:

  • 对,我试过了,我得到以下错误: SyntaxError: Unexpected token s at Object.parse (native) at Object.fromJson (localhost:8888/bower_components/angular/angular.js:1134:14)
  • 我得到的字符串是一个 json 对象,被非 jsony 的东西包围,这使得反序列化尝试失败。
  • 知道了,你得到的是 "s:j:{real stuff}.0lhktIYsohr61U/4xSwWFA" 吗?我将在我的答案中发布一种“提取”杰森字符串的方法。
  • 是的。 “s:j{这是我的 cookie json}.0lKpQzpgzCAjgkIayDkUiOLhktIYsohr61U/4xSwWFA”是 $cookies["connect.sess"] 中的内容
猜你喜欢
  • 2017-10-28
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 2017-11-17
  • 2017-08-23
  • 1970-01-01
相关资源
最近更新 更多