🎉
(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