微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在测试中使用 jwt.verify 指定 expiresIn 时未设置 JWT Cookie

如何解决在测试中使用 jwt.verify 指定 expiresIn 时未设置 JWT Cookie

我在使用 jest 和 supertest 测试 node.js API 中的端点时遇到问题。我正在尝试使用新的 jwt 令牌更新会话。会话结构如下所示:

req.session = {
  jwt: SOME_JWT_TOKEN
}

以下是在会话 (endpoint.ts) 上设置新令牌的代码

const setUserPayload: THandler = async (
  req: Request,res: Response
): Promise<void> => {
  try {
    // Create payload
    userPayload = {
      id: SOME_ID,};

    // Convert payload to JWT
    const jwtUserPayload = jwt.sign(userPayload,process.env.JWT_SECRET!,{
      algorithm: 'HS256',expiresIn: '7 days',});

    // Store it on the session
    if (req.session && req.session.jwt) {
      req.session.jwt = jwtUserPayload;
    } else {
      throw new Error('jwt key is not defined on the session');
    }

    res.status(200).send({
      userPayload: userPayload,});
  } catch (e) {
    throw e;
  }
};

下面是测试头是否设置的测试代码(test.ts):

import request from 'supertest';
import { app } from '../config/app';
import jwt from 'jsonwebtoken';

it('sets cookie after updating the user payload with descriptive cookie',async () => {
  // Payload
  const payload: IUserPayload = {
    id,record: {
        id: 'abcd',},account: {
      email: 'test@test.com',};

  // Cookie
  const token = jwt.sign(payload,{
    algorithm: 'HS256',});
  const session = { jwt: token };
  const sessionjsON = JSON.stringify(session);
  const base64 = Buffer.from(sessionjsON).toString('base64');
  const cookie = [`express:sess=${base64}`];

  // Get updated cookie
  const response = await request(app)
    .get(`/api/profile/v1/current-user`)
    .set('Cookie',cookie)
    .expect(200);
  

  // Check the 'Set-Cookie' header
  expect(response.get('Set-Cookie')).tobedefined();
});

奇怪的是,只要我没有设置 jwt 的过期时间(在 endpoint.ts 中),测试就会工作。如果我删除 expiresIn,则测试通过。但是如果我设置 expiresIn 测试偶尔会通过(平均 1/6 次),否则测试会失败。

任何帮助或见解或希望将不胜感激。非常感谢!

更新:我发现如果我删除现有负载上的“iat”和“exp”属性并创建一个新的 cookie,它会起作用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?