在测试中使用 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.JdbcOdbc...