やりたいこと
-
/api/auth/signup
POST
リクエストをして、新規でユーザーが作成する -
/api/auth/login
POST
リクエストして、ログインに成功した場合はユーザー情報とJWTのトークンを返却する
Routesの設定
src/routes/auth.ts
import { Router } from 'express'
import { login, signup } from '../controllers/auth'
const authRouter: Router = Router()
authRouter.post('/signup', signup) // POSTリクエストにするため、 .post に変更
authRouter.post('/login', login) // POSTリクエストにするため、 .post に変更
export default authRouter
Controller の処理
src/controllers/auth.ts
import { Request, Response } from 'express'
import { compareSync, hashSync } from 'bcrypt'
import * as jwt from 'jsonwebtoken'
import { prisma } from '..'
import { JWT_SECRET } from '../secrets'
export const signup = async (req: Request, res: Response) => {
const { email, password, name } = req.body
const existingUser = await prisma.user.findFirst({
where: {
email,
},
})
if (existingUser) {
return res.status(400).json({ message: '既に存在するユーザーです' })
}
const user = await prisma.user.create({
data: {
email,
name,
password: hashSync(password, 10),
},
})
res.json({ user })
}
export const login = async (req: Request, res: Response) => {
const { email, password } = req.body
const user = await prisma.user.findFirst({
where: {
email,
},
})
if (!user) {
return res.status(400).json({ message: 'ユーザーが見つかりません' })
}
if (!user.password) {
return res.status(400).json({ message: 'パスワードが設定されていません' })
}
const validPassword = compareSync(password, user.password)
if (!validPassword) {
return res.status(400).json({ message: 'パスワードが間違っています' })
}
const token = jwt.sign({ id: user.id }, JWT_SECRET, { expiresIn: '1h' })
res.json({ user, token })
}
Tips
リクエストに含まれる値を取得したい
req.body
を使って取得できる
上記では、分割代入を活用して const { email, password, name } = req.body
のように記述している
パスワードをハッシュ化したい
bcrypt
のライブラリの hashSync
メソッドを使ってパスワードのハッシュ化ができる
ハッシュ化されたパスワードと受け取ったパスワードを比較して間違っていないか調べたい
bcrypt
のライブラリの compareSync
メソッドを使ってハッシュ化されたパスワードと入力されたパスワードを比較して真偽値を出せる
JWTのトークンを作成したい
jsonwebtoken
のライブラリの jwt
から sign
メソッドを使って、JWTのトークンを生成できる