오늘 진행한 작업
로그인, 회원가입 API
// src > routers > sign.routers.js
import express from 'express';
import { prisma } from '../utils/prisma/index.js';
import bcrypt from 'bcrypt';
import dotenv from 'dotenv';
import jwt from 'jsonwebtoken';
dotenv.config();
const router = express.Router();
/** 사용자 회원가입 API **/
// localhost:c/api/sign-up POST
router.post('/sign-up', async (req, res) => {
const { email, password, name, age, gender } = req.body;
// 이메일 중복 체크
const isExistEmail = await prisma.accounts.findUnique({
where: { email },
});
if (isExistEmail) {
return res.status(409).json({ message: '이미 존재하는 이메일입니다.' });
}
// 이메일 형식 체크
const emailForm = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
if (!emailForm.test(email)) {
return res
.status(409)
.json({ message: '이메일 형식이 적절하지 않습니다.' });
}
// 비밀번호 형식 체크
const passwordForm = /^.{1,6}$/;
if (!passwordForm.test(password)) {
return res
.status(409)
.json({ message: 'password는 6자리 이하로만 설정할 수 있습니다' });
}
const hashedPassword = await bcrypt.hash(password, 10);
// 사용자 정보를 Accounts 테이블에 추가
const accountData = await prisma.accounts.create({
data: {
email,
password: hashedPassword,
name,
age,
gender,
},
});
return res.status(201).json({
message: '회원가입이 완료되었습니다.',
accountid: accountData.accountid,
});
});
router.post('/sign-in', async (req, res) => {
const { email, password } = req.body;
const accountData = await prisma.accounts.findFirst({ where: { email } });
if (!accountData)
return res.status(401).json({ message: '존재하지 않는 email입니다.' });
// 입력받은 사용자의 비밀번호와 데이터베이스에 저장된 비밀번호를 비교합니다.
else if (!(await bcrypt.compare(password, accountData.password)))
return res.status(401).json({ message: '비밀번호가 일치하지 않습니다.' });
// 로그인에 성공하면, 사용자의 userId를 바탕으로 토큰을 생성합니다.
const accesstoken = jwt.sign(
{
accountid: accountData.accountid,
},
// JWT를 서명하는 데 사용되는 비밀 키
// 서버가 비밀 키를 사용하여 토큰 변조 여부를 알 수 있다
process.env.SERVER_ACCESS_KEY,
{ expiresIn: '1m' }
);
// 리프레시 토큰 생성
const refreshtoken = jwt.sign(
{
accountid: accountData.accountid,
},
process.env.SERVER_REFRESH_KEY, // 리프레시 토큰을 위한 비밀 키
{ expiresIn: '7d' } // 예: 7일 동안 유효
);
// 리프레시 토큰을 토큰테이블에 저장
// 해당 리프레시 토큰과 연결된 account_id도 함께 저장
await prisma.refreshToken.create({
data: {
token: refreshtoken,
accountid: accountData.accountid,
},
});
return res.status(200).json({ message: '로그인 성공', accesstoken });
});
export default router;
매니저 생성, 삭제 API
import express from 'express';
import { prisma } from '../utils/prisma/index.js';
import dotenv from 'dotenv';
import authM from '../middlewares/auth.js';
dotenv.config();
// character.js
const router = express.Router();
router.post('/create-manager', authM, async (req, res) => {
// 요청 본문에서 nickname 추출
const { nickname } = req.body;
// authM 미들웨어에서 인증을 거친 accounts 정보를 가져오고
// accounts에서 account_id를 추출한다
const { accountid } = req.account;
// 닉네임 중복 검증
const isExistManager = await prisma.manager.findFirst({
where: { nickname },
});
if (isExistManager) {
return res.status(409).json({ message: '이미 존재하는 닉네임입니다.' });
}
// 캐릭터 생성 로직
const newManager = await prisma.manager.create({
data: {
// 뽑아온 nickname, account_id를 각 컬럼에 적용한다.
accountid: accountid,
nickname: nickname,
rating: 1000,
cash: 10000,
},
});
return res
.status(201)
.json({ message: '매니저 생성 성공', manager: newManager });
});
export default router;
///
import express from 'express';
import { prisma } from '../utils/prisma/index.js';
import authM from '../middlewares/auth.js';
const router = express.Router();
router.delete('/delete/:managerid', authM, async (req, res) => {
// 삭제할 캐릭터의 ID 값을 가져옵니다.
const managerid = parseInt(req.params.managerid, 10);
console.log(managerid);
// 삭제하려는 '캐릭터'을 가져옵니다. 없다면 에러를 발생시킵니다.
const manager = await prisma.manager.findUnique({
where: { managerid: managerid },
});
if (!manager) {
return res
.status(404)
.json({ errorMessage: '존재하지 않는 manager 데이터입니다.' });
}
// 조회된 캐릭터를 삭제합니다.
await prisma.manager.delete({ where: { managerid } });
return res.status(200).json({ message: '매니저가 삭제되었습니다.' });
});
export default router;
액세스, 리프레시 토큰 생성 엑세스 토큰 만료 시 새로운 토큰 생성
기존 엑세스 토큰이 만료된 상태에서 인증 미들웨어를 거치는 api를 생성했을 때, 테스트 처럼 새로운 엑세스 토큰이 생성되도록 하였다.
내일은 새로 생성된 엑세스 토큰이 기존 리프레시 코드에 의해 생성된것이 맞는지, 새로운 엑세스 토큰이 생성된 다음 자동으로 기존 호출했던 API 사용이 진행되는지 체크 필요, 이외 조회관련 API작성
'TIL' 카테고리의 다른 글
내일배움캠프 6주차 수요일 TIL (0) | 2024.12.04 |
---|---|
내일배움캠프 6주차 화요일 TIL (0) | 2024.12.03 |
내일배움캠프 5주차 금요일 (1) | 2024.11.29 |
내일배움캠프 5주차 수요일 TIL (0) | 2024.11.27 |
내일배움캠프 5주차 화요일 TIL (0) | 2024.11.26 |