【问题标题】:How to get the current user using jsonwebtoken in Sails.js?如何在 Sails.js 中使用 jsonwebtoken 获取当前用户?
【发布时间】:2017-04-27 16:48:05
【问题描述】:

几周前我一直在使用 Sails,我来自 Rails,我没有任何使用 Node.js 的经验。

现在我正在尝试使用 jsonwebtoken 进行强大的令牌身份验证。 https://github.com/auth0/node-jsonwebtoken

我按照本指南http://thesabbir.com/how-to-use-json-web-token-authentication-with-sails-js/ 操作,一切正常。 我可以注册、登录,然后正确使用令牌进行不同的操作。

现在,我想在一些操作中使用登录用户, 类似设计current_user 助手。 例如,创建评论时,该评论应该属于当前用户。

使用 Sabbir Ahmed 指南,在 isAuthorized.js 策略的第 33 行中,令牌被解密,因此我可以从那里获取当前用户 ID。

所以,我的问题是,获取当前用户并稍后在某些控制器中使用它的最佳方式应该是什么? 例如,我尝试了类似的方法:

# isAuthorized.js line 34, after getting decrypted token
User.findOne({id: token.id}).exec(function findOneCB(err, found){
    currentUser = found;
});

但是,在这种方式下,因为这是一个异步操作,我不能在控制器中使用这个 currentUser。

我想存储当前用户,以便以后能够在某个控制器中使用它,而无需在每个控制器中重复相同的代码,比如帮助程序或服务。

【问题讨论】:

    标签: sails.js json-web-token


    【解决方案1】:

    诀窍在于您放置next() 的位置。由于您正在进行异步调用,因此只有在数据库操作完成后,控制权才应转移到下一个策略/控制器。

    您应该将政策修改为:

    User.findOne({id: token.id}).exec(function findOneCB(err, found){
        if(err) next(err);
        req.currentUser = found;
        next();
    });
    

    您应该能够通过req.currentUser 访问使用isAuthorized 策略的控制器中的用户详细信息

    【讨论】:

      【解决方案2】:

      如果通过

      例如,创建评论时,该评论应该属于当前用户。

      您的意思是某些属性,例如用户名和国家/地区等,而不是在验证后查询数据库,您可以选择将这些附加属性发送到@987654322 中的 jwToken.issue @

      例如。

      jwToken.issue({ 
          id: user.id,
          username: user.name,
          country: user.country
          })
      

      这有什么帮助,您可以保持 api/policies/isAuthorized.js 原样,并且在您将来使用的所有控制器中,您可以从原样访问有效负载值

      token.username or token.country
      

      不必再次查询数据库,从而为您节省宝贵的响应时间。

      但是,请注意您选择在令牌中发送的数据(如果您愿意,您也可以发送 {user:user}),因为您可以想象,解密有效负载不需要密钥或散列@jwt.io,你可能要克制。

      【讨论】:

        猜你喜欢
        • 2014-04-02
        • 2016-10-20
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        • 2018-07-03
        • 2020-10-05
        • 2015-06-01
        • 1970-01-01
        相关资源
        最近更新 更多