繁体   English   中英

如何在 nodejs + react 中创建 session

[英]How to create session in nodejs + react

我正在研究 React 前端应用程序,中间件是用 nodejs 编写的。 我正在使用 oauth 访问令牌,它会在 3600 毫秒后过期,所以我需要创建 session 7 天,这样用户就不会在 7 天之前注销。

session的创建方法是什么? 我需要在反应应用程序或 node.js 应用程序中做吗?

PS 我们不想实施刷新令牌方法。 有什么方法可以设置 session 且有效期为 7 天?

您可以使用访问令牌 + 刷新令牌来实现此目的。 使用较短的访问令牌并保持刷新令牌的 7 天到期。

访问令牌过期后,您可以通过传递刷新令牌来刷新它。 这将一直有效,直到您的刷新令牌到期 7 天。 然后用户必须重新登录。

像下面这样的东西。

export const generateAccessToken = (user: UserResponse): string => {
  return jwt.sign(
    {
      userId: user.user_id,
      clientId: user.client_id,
      createdAt: new Date().getTime(),
      storageKey: user.storageKey ?? "",
      pipelineKey: user.pipelineKey ?? "",
    },
    process.env.ACCESS_TOKEN_SECRET,
    { expiresIn: `3600s` }
  );
};
export const generateRefreshToken = async (
  user: UserResponse
): Promise<string> => {
  const refreshTOken = jwt.sign(
    {
      userId: user.user_id,
    },
    process.env.REFRESH_TOKEN_SECRET,
    { expiresIn: `7d` }
  );
  const status = await storeRefreshToken(user.user_id, refreshTOken);
  if (status) {
    return refreshTOken;
  } else {
    throw new Error("Error while storing refresh token");
  }
};

刷新令牌端点将是这样的

authRouter.post("/refresh-token", async (request: any, response: any) => {
  await transformAndValidate(RefreshTokenRequestDto, request.body)
    .then(async (refreshTokenRequest: any) => {
      if (authenticateRefreshToken(refreshTokenRequest.refreshToken)) {
        const dbRefreshToken = await getRefreshTokenByToken(
          refreshTokenRequest.refreshToken
        );
        if (
          dbRefreshToken &&
          dbRefreshToken.user_id &&
          dbRefreshToken.active &&
          dbRefreshToken.expiry_at >= new Date()
        ) {
          const user = await getUserById(dbRefreshToken.user_id);
          if (user) {
            const jwtToken = generateAccessToken(user);
            response.status(200).send(
              generateSuccessResponse({
                accessToken: jwtToken,
                refreshToken: dbRefreshToken.token,
                fullName: user.username,
              })
            );
          } else {
            return response
              .status(400)
              .json(
                generateFailedResponse(
                  "Invalid User",
                  AppCodes.REFRESHTOKENFAIL
                )
              );
          }
        } else {
          return response
            .status(400)
            .json(
              generateFailedResponse(
                "Refresh Token Failed",
                AppCodes.REFRESHTOKENFAIL
              )
            );
        }
      } else {
        return response
          .status(400)
          .json(
            generateFailedResponse(
              "Refresh Token JWT Validation Failed",
              AppCodes.REFRESHTOKENFAIL
            )
          );
      }
    })
    .catch((err) => {
      response
        .status(400)
        .json(
          generateFailedResponse(
            formatValidationErrorMsg(err),
            AppCodes.VALIDATIONFAILED
          )
        );
    });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM