【问题标题】:JSON web token not storing data OR I can't access it correctlyJSON Web 令牌未存储数据或我无法正确访问它
【发布时间】:2017-02-20 08:53:54
【问题描述】:

我有一个 MEAN 堆栈应用程序,它将用户信息存储在 JSON Web 令牌中,我正在尝试向 JSON Web 令牌添加一个值以供我的应用程序引用。我相信数据存储在 JSON Web 令牌中,我无法访问它,但我可能是错的。

这里是创建 JSON 网络令牌的地方服务器端:

userSchema.methods.generateJwt = function() {
console.log("I'm creating a JSON WebToken");
console.log(this.hasPaid); // HERE I CAN CLEARLY SEE THIS HAS THE VALUE I'M WANTING
var expiry = new Date();
expiry.setDate(expiry.getDate() + 7);
return jwt.sign({
    _id: this._id,
    email: this.email,
    name: this.name,
    hasPaid : this.hasPaid, // HERE IS THE VALUE I WANT
    exp: parseInt(expiry.getTime() / 1000),
}, "MY_SECRET");
};

这是我的 AngularJS 身份验证服务

var currentUser = function() {
  if(isLoggedIn()){
    var token = getToken();
    var payload = token.split('.')[1];
    payload = $window.atob(payload);
    payload = JSON.parse(payload);
    console.log(payload);
    return {
      email : payload.email,
      name : payload.name,
      hasPaid : payload.hasPaid // Here is my value
    };

  }
};

然后,在我的 APP.JS 中,我尝试调用该函数:

console.log(authentication.currentUser().hasPaid); // This works because when i call currentUser().name

获取令牌功能

var getToken = function () {
  return $window.localStorage['mean-token'];
};

提前致谢!

【问题讨论】:

  • 很难跟上你的申请流程。 getToken() 真的有效吗?您是否确认确实为 token 设置了一个值?
  • @JonBlack 它肯定会起作用,因为 CurrentUser 函数对电子邮件和用户名成功运行。
  • 那么当你console.log(payload)时你看到了什么?
  • @JonBlack 我在任何地方都看不到 console.log。我查看了开发人员控制台和节点控制台,但没有看到它在哪里说什么,甚至没有尝试
  • 嗯,这很有趣。它至少应该显示一些东西。当您进行此服务器端调用时,您会在“网络”选项卡中看到什么?

标签: javascript angularjs json node.js json-web-token


【解决方案1】:

嗯。在我看来,您将很难尝试解码令牌客户端,而不使用“MYSECRET”对其进行解码(这实际上是 JWT 的“安全”功能)。

令牌只能在最初签署它的服务器之外以任何方式进行验证、更改、验证或操作

编辑:好的。我的错。完全可以解码PAYLOAD。没有“秘密”(实际上是 BASE64Encoded,等于零安全性)。没有秘密是不可能的就是解码/验证签名

无论如何,这就是原因,因为标准建议是不要在 JWT 的负载上保存机密/敏感/秘密信息。

在那里保存您的用户电子邮件、角色、付款信息,这是一个非常高的安全风险,因为它可以存储在 COOKIES 和/或本地存储中。所以如果攻击者可以攻破浏览器,就可以轻松获取这些数据

一个想法可以存储一些不允许的用户唯一 ID 例如,登录一个唯一 ID 字段,并可能添加一些声明,例如角色和/或权限的唯一 ID,以某种安全形式(如 MDHashed)。

所以我对你的令牌有效负载的建议是这样的:

 var crypto = require('crypto');
 // some more code 
 var userClaims={ hasPaid: this.hasPaid}
 return jwt.sign({
     _id: this._id,
     claims:  crypto.createHash('md5').update(userClaims).digest('hex')
 }, "MY_SECRET")

注意:忘记我最近的三个cmets

【讨论】:

  • 正在获取用户名和电子邮件。在其当前状态。也许我误解了你在说什么
  • 好的。我解释。查看您的服务器端代码。你发的那个。看到 jwt.sign() 调用了吗?你正在使用一个seceret avlue“MYSECRET”用一些加密算法签署你的令牌(我认为默认值是HMACSHA256,但不确定)。那么如何假设您能够在客户端不知道“MYSECRET”的情况下对其进行解码?
  • 请。你能用虚拟数据生成一个令牌并在这里发布吗?
  • 添加获取令牌功能。
【解决方案2】:

我想通了。我道歉。如果有人想使用此信息,我做的一切都是正确的,上述功能将起作用。但是,我使用了一个缩小应用程序,它正在使用我没有更新的缩小身份验证服务。呸!!对不起大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2021-05-06
    • 1970-01-01
    相关资源
    最近更新 更多