0
0

TypeExpressTutorial - 5

Last updated at Posted at 2024-07-05

やりたいこと

  • /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のトークンを生成できる

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0