😺

Error: invalid expiresIn option for string payload の解決方法

2021/11/14に公開

概要

jwt を用いた認証認可処理を実装していると以下のようなエラーに遭遇しました。

Error: invalid expiresIn option for string payload

解決方法について記述します。

解決方法

以下の記事が参考になりました。
https://stackoverflow.com/questions/35131333/jsonwebtoken-sign-fails-with-expiresin-option-set

jwt.sign()の第一引数はオブジェクトでないといけないようです。なので解決方法は以下のようになります。

解決前

import { Router } from "express";
import passport from "../middleware/auth";
import jwt from "jsonwebtoken";
import config from "../../config";

const route = Router();

route.post(
  "/login",
  passport.authenticate("local", { session: false }),
  (req, res, next) => {
    // 直接定数を指定してはいけない
    const user = req.user;
    const token = jwt.sign(user, config.jwt_secret, {
      expiresIn: "10s",
    });
    res.json({ user, token });
  }
);

export default route;

解決後

import { Router } from "express";
import passport from "../middleware/auth";
import jwt from "jsonwebtoken";
import config from "../../config";

const route = Router();

route.post(
  "/login",
  passport.authenticate("local", { session: false }),
  (req, res, next) => {
    const email = req.user;
    // 一度オブジェクトにしてから、第一引数に代入する
    const payload = { email: email };
    const token = jwt.sign(payload, config.jwt_secret, {
      expiresIn: "10s",
    });
    res.json({ email, token });
  }
);

export default route;

Discussion