为啥我的 jwt 令牌在背面而不是正面返回 null

Posted

技术标签:

【中文标题】为啥我的 jwt 令牌在背面而不是正面返回 null【英文标题】:why is my jwt token returning null on the backside but not the front为什么我的 jwt 令牌在背面而不是正面返回 null 【发布时间】:2018-04-05 18:10:08 【问题描述】:

我正在尝试向我的 mLab 数据库发出 GET 请求。我将 JWT 令牌与请求一起传递,并将其记录在客户端和服务器上。它在客户端上正确读取,但在服务器上显示为 null。任何帮助将非常感激。我正在使用 Node.js 和 Angular。 我对此很陌生,所以如果错误很明显,我提前道歉。 这是服务器的 GET 路由:

router.get('/', (req, res, next) => 
    var decoded = jwt.decode(req.query.token);
    console.log(decoded);
    console.log('employees');
    if(decoded) 
        return Company.find(_id: decoded._id)
            .populate('user', 'firstName')
            .exec(function(err, company) 
                if (err) 
                    return res.status(500).json(
                        title: 'An error occurred',
                        error: err
                    );
                
                res.status(200).json(
                    message: 'Success',
                    obj: company
                );
            );
     else 
        return res.status(401).json(
            title: 'Not authenticated',
            error: 
                message: 'Please create an account or sign in'
            
        );
    
    console.log(company);

);

这里是客户端:

getEmployees() 
    const token = localStorage.getItem('token')
        ? '?token=' + localStorage.getItem('token')
        : '';
    console.log(token);
    return this.http.get('http://localhost:3000/company' + token)
        .map((response: Response) => 
            const employees = response.json().obj;
            console.log(employees);
            let transformedEmployees: Employee[] = [];
            for (let employee of employees) 
                transformedEmployees.push(new Employee(
                    employee.firstName,
                    employee.lastName,
                    employee.email,
                    employee.password,
                    employee.jobTitle,
                    employee.isAdmin,
                    employee.tasks
                ));
            
            console.log(transformedEmployees)
            this.employees = transformedEmployees;
            return transformedEmployees;
        )
        .catch((error: Response) => 
            this.errorService.handleError(error.json());
            return Observable.throw(error.json())
        );

【问题讨论】:

console.log(req.query.token); 说什么?您是否在服务器端使用 jwt 库(解码功能来自哪里)?为什么您不使用签名令牌时也使用的密钥进行解码? 【参考方案1】:

您不应将令牌放在请求的 Authorization 标头中。

您使用 express 中间件来解码令牌:

const myDecoder = (req, res, next) => 
  req.user = jwt.decode(req.headers.authorization);
  next();

然后,您将放置在您的路线中:

router.get('/', myDecoder, (req, res) => 
    let user = req.user;
    console.log(user);
    console.log('employees');
    if (user)  blah     
    ...

不应通过 URL 本身传递整个令牌。

【讨论】:

以上是关于为啥我的 jwt 令牌在背面而不是正面返回 null的主要内容,如果未能解决你的问题,请参考以下文章

如何翻转正面带有标签而背面带有另一个标签的视图 - 参见图片

为啥要使用环境变量对 JSON Web 令牌 (JWT) 进行签名?

为啥我收到的 jwt 格式错误?

JWT, 为啥需要刷新令牌?

为啥 JWT 是无状态认证?

为啥我的 JWT 不记名身份验证在令牌说 5 分钟后将令牌识别为过期?