나의 개발일지(김지헌)
항해 99 60일차 11/17일 본문
오늘은 로그인 회원가입 그리고 마이 페이지 조회를 코드를 작성했다. 타입스크립트라서 타입을 맞게 적어주는거 어려웠다.
타입스크립트를 쓰면서 내가 몰랐던 타입들을 많이 알아가고 있는거 갔다.
import {Request, Response, NextFunction} from 'express'
import dotenv from 'dotenv'
import bcrypt from 'bcrypt'
import User from '../database/models/user'
import jwt from '../utils/jwt'
dotenv.config()
export default async (req:Request, res:Response, next:NextFunction) => {
try{
//헤더
const accesstoken= String(req.headers.accesstoken)
const refreshtoken = String(req.headers.refreshtoken)
//쿠키
// const accessToken = req.cookies.accessToken;
// const refreshToken = req.cookies.refreshToken;
//토큰이 없다면~
if(!accesstoken)return res.status(401).json({ message: 'AccessToken이 존재하지 않습니다.' });
//에쎄스 토큰 검증하기
const decodeAccessToken = await jwt.validateAccessToken(accesstoken)
//인증된 에쎄스 토큰이 없을시
if (decodeAccessToken === null) {
//리프레쉬 토큰 없을시
if(!refreshtoken) return res.status(401).json({ message: 'RefreshToken이 존재하지 않습니다..' });
//리프레쉬 토큰 검증
const decodeRefreshToken = await jwt.validateRefreshToken(refreshtoken);
//리프레쉬 토큰 만료시
if(decodeRefreshToken == false) return res.status(401).json({ message: 'RefreshToken이 일치하지 않거나 만료 되었습니다.' })
let userId = decodeRefreshToken.userId
//리프레쉬 토큰이 있을때 유저정보로 찾아오기
const findUser = await User.findByPk(userId);
const findRefreshToken = findUser!.refreshToken
//암호화해서 저장된 리프레쉬 토큰이랑 같은지 검증
const campareRefreshToken = bcrypt.compareSync(refreshtoken, findRefreshToken);
if (campareRefreshToken == false) return res.status(401).json({ message: 'RefreshToken이 일치하지 않거나 만료 되었습니다.' });
// 리프레쉬 정상에 AccessToken 만료시 재발급
const AccessToken = await jwt.createAccessTokenRe(userId);
//쿠키로 보내줌
res.cookie('accessToken', AccessToken);
//프론트에서 로컬 스토리지에 저장하기 위해 res에 보내줌
User.findByPk(userId).then((user) => {
console.log("재발급하고 지나갔네요")
res.locals.user = user; //res.locals.user데이터를 담는다 가상공간에
next();
});
}else {
let userId = decodeAccessToken.userId
User.findByPk(userId).then((user) => {
console.log("정상일때 지나갔네요 ")
res.locals.user = user; //res.locals.user데이터를 담는다 가상공간에
next();
})
}
}catch(err){
next(err)
}
}
// const { token } = req.cookies //쿠키에 있는 토큰을 받아옴
// console.log(!token)
// if (!token){ //토큰이 없을시 예외처리
// res.status(401).send({
// errorMessage : '로그인이 필요한 기능입니다.'
// })
// return;
// }
// try { //검증
// const { userId } = jwt.verify(token, process.env.SECRET_KEY); //시크릿 키값으로 토큰을 검증함
// User.findByPk(userId).then((user) => {
// res.locals.user = user; //res.locals.user데이터를 담는다 가상공간에
// next();
// });
// } catch (error) {
// res.status(401).send({
// errorMessage: "로그인 후 이용 가능한 기능입니다.",
// });
// }
//리프레쉬 토큰 검증 api , 생성하고 디비에 저장, 암호화 해야함(해싱), 로그인할떄 디비 ㅡ 해싱한거 확인.
// z클라이언트에서 보내줄때 사용
// const { authorization } = req.headers;
// // console.log(req.headers,"미들")
// const [authType, authToken] = (authorization || '').split(' ');
// if (!authToken || authType !== 'Bearer') {
// return res.status(401).send({
// errorMessage: '로그인 후 이용 가능한 기능입니다.',
// });
// }
// try {
// const { userId } = jwt.verify(authToken, SECRET_KEY);
// User.findByPk(userId).then((user) => {
// res.locals.user = user;
// next();
// });
// } catch (err) {
// res.status(401).send({
// errorMessage: '로그인 후 이용 가능한 기능입니다.',
// });
// }
// };
'항해 99' 카테고리의 다른 글
항해 99 62일차 11/19일 (0) | 2022.11.20 |
---|---|
항해 99 61일차 11/18일 (0) | 2022.11.19 |
항해 99 59일차 11/16일 (0) | 2022.11.17 |
항해 99 58일차 11/15일 (0) | 2022.11.16 |
항해 99 57일차 11/14일 (0) | 2022.11.15 |