🎉

(Next.js) JWTトークン検証からユーザー情報取得まで

に公開

なぜこの関数を使ったのか?

この関数を作った一番の理由は、JWTトークンが存在する場合に、その中に含まれるユーザー情報(ニックネームや権限など)を簡単に取り出し、APIの処理内で活用できるようにするためです。
単にトークンの有効性を確認するだけでなく、ログインユーザーの情報を安全に取得し、権限チェックやユーザーごとの処理をスムーズに実装できます。

コード解説

import jwt, { JwtPayload } from "jsonwebtoken";

export function verifyToken(req: Request): JwtPayload | null {
  
  // ヘッダーからAuthorizationを取り出す
  const authHeader = req.headers.get("Authorization");
  if (!authHeader) {
    return null;
  }

  // Authorizationがあったら、トークンを取り出す
  const token = authHeader.split(" ")[1]; // Bearerトークン
  if (!token) {
    console.log("Token is missing");
    return null;
  }

  // トークンがあったら、JWTの中からユーザー情報(JwtPayload)を取り出す
  try {
    const decoded = jwt.verify(token, process.env.JWT_SECRET as string) as JwtPayload;
    return decoded;
  } catch (err) {
    console.error("Error verifying token", err);
    return null;
  }
}

verifyToken関数を使ったユーザー情報取得

import prisma from '@/lib/prisma';

//verifyTokenをimportする​
import { verifyToken } from "../../auth/middleware";

export async function GET(req :Request){

    // JWTトークンからユーザー情報を取得(JwtPayload)
    const user = verifyToken(req);

   // トークンがない、string型、またはuserIdがない場合は認証エラーを返す
    if(!user || typeof user === "string" || !user.userId){
        return new Response("Unauthorized", {status : 401})
    }

  // ユーザー情報がある場合は、DBからユーザープロフィールを取得
    const userProfile = await prisma.user.findUnique({
        where :{ id : user.userId},
        // 必要なフィールドだけを選択して取得
        select :{ 
            nickname : true, 
            email : true,
            role : true,
        }
    })

    // ユーザーが見つからない場合は404を返す
    if(!userProfile){
        return new Response("User not found", {status : 404})
    }
    
    // 取得したユーザープロフィールをJSONで返す
    return new Response(JSON.stringify({user: userProfile}), {status: 200})
}

これで、権限やニックネームが必要なページに適用し、今後の開発を進めていきたいと思います。

Discussion