代码之家  ›  专栏  ›  技术社区  ›  Don Diego

解码时的Javascript标记、JWT和数字

  •  1
  • Don Diego  · 技术社区  · 6 年前

    我对使用JWT和令牌是完全陌生的;我只是想这么做:

    console.log("logged " + data);  
    
    //prints { _id: 5a82ee98e918b22e83d6c3e0,
    //username: 'test2',
    //name: 'test',
    //surname: '2',
    //password: '...'
    //[etc]
     //}
    
    console.log("logged _id " + data._id);
    
    //prints 5a82ee98e918b22e83d6c3e0
    
    var token = jwt.sign(data._id, secret, {
                        expiresIn: "24h" // expires in 24 hours
                    });
    console.log("saved token " + token);
    
    //prints the token in style eyJhbGciOi[...].eyJfYnNvbn[...].usoLRz-[...]
    
    
    console.log("decoded: " + JSON.stringify( jwt.decode(token) ) )
    
    
    //prints the token in this way:
    //{"_bsontype":"ObjectID","id":{"type":"Buffer","data":[90,130,238,152,233,24,178,46,131,214,195,224]},"iat":1519502719,"exp":1519589119}
    
    1. 为什么不以纯文本形式打印id号?
    2. 如何获取我在令牌中输入的id号?

    更新: 我在一个登录功能;数据是登录后的答案,包含登录用户;我有

    var login = function(req, res) { 
        passport.authenticate('local', function(err, data, info) { 
            if (err) { console.log(err); 
        } 
        console.log("data in auth " + data);
        if (!data) { 
            return res.status(404); 
        } 
        req.logIn(data, function(err) { 
            if (err) { 
                console.log("err " + err); 
            } 
            console.log("logged " + data);
            console.log("logged _id " + data._id);
            var token = jwt.sign[continues on top]
        [...]
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   radhey shyam    6 年前

    您没有正确解码令牌

    let decodedData = JWT.decode(token,secret);
    console.log(decodedData._id);
    

    无需对数据进行字符串化。它会很好地工作。如果您有任何错误,请随时与我联系。

        2
  •  1
  •   Don Diego    6 年前

    解决了的。 问题是我输入了令牌数据_id直接作为字符串;就像这样 link 表示,令牌有效负载必须以以下方式构建:

    {
        "_id" : data._id
    }
    

    所以我不必这样做:

    console.log("logged _id " + data._id);
    
    //WRONG
    var token = jwt.sign( data._id, secret, {
        expiresIn: "24h" 
    });
    

    但我必须这样做:

    console.log("logged _id " + data._id);
    var myId = {
        "_id" : data._id
    }
    
    var token = jwt.sign( myId, secret, {
        expiresIn: "24h" 
    });
    

    所以现在如果我用

    let decodeddata = jwt.decode(token,secret);
    console.log("decoded: " + JSON.stringify(decodeddata,null,4) )
    

    那么这就行了。 感谢大家帮助我找到问题!