인증(Authentication) 기능 만들기
페이지 이동 때마다 로그인 여부와 관리자, 유저 체크, 권한의 여부를 체크하는 것이 필요하다.
이를 auth route를 만듦으로써 구현해본다.
구현 방법
저번에 서버 부분에서 데이터베이스에 토큰 정보를 저장하고, 클라이언트 부분에서는 쿠키에 토큰을 저장하였다.
- 클라이언트에서 서버에 쿠키에 담겨져 있는 토큰을 전달
- 서버 부분에서는 토큰의 Decoding 과정으로 통해 User ID를 얻어냄
- 해당 ID를 가진 유저가 데이터베이스에 있는지에 대한 여부를 확인하여 권한 부여의 여부를 결정
- 인증을 성공했다면 클라이언트에 유저 정보 중에 선별하여 보내주고,
- 인증이 실패 했다면, 인증 실패 메세지 Json 형식으로 전달
구현
우선, 루트 디렉터리에 middleware
폴더 생성 후, middleware
폴더 안에 auth.js
파일 생성
index.js
const {auth}=require('./middleware/auth');
//생략
//auth: 요청을 받고 콜백함수로 넘어가기 전 auth라는 미들웨어를 통해 인증 절차 수행
app.get('/api/users/auth',auth,(req,res)=>{
//미들웨어를 통과해 여기까지 왔으면 인증이 성공했다는 것
res.status(200).json({
_id: req.user._id,
isAdmin: req.user.role===0? false : true,
isAuth: true,
email: req.user.email,
lastname: req.user.lastname,
role: req.user.role,
image: req.user.image
});
});
//생략
auth.js
const { User } = require("../models/User");
//인증 처리 수행
let auth=(req,res)=>{
//클라이언트의 쿠키에서 토큰을 가져옴
let token=req.cookies.x_auth;
//토큰을 복호화 한 후 유저 탐색
User.findByToken(token,(err,user)=>{
if(err) throw err;
//없으면 인증 실패
if(!user) return res.json({isAuth:false,error:true})
//유저가 있으면 인증 성공
req.token=token;
req.user=user;
next();
})
}
module.exports={auth};
User.js
//생략
userSchema.statics.findByToken=function(token,cb){
var user=this;
//토큰 복호화
jwt.verify(token,'secretToken',function(err,decoded){
if(err) return cb(err);
//유저 아이디를 이용해 유저를 찾은 후 클라이언트에서 가져온 토큰과 데이터베이스에 보관된 토큰이 일치하는지 확인
user.findOne({"_id":decoded,"token":token},function(err,user){
if(err) return cb(err);
cb(null,user);
});
});
}
//생략
참고
www.inflearn.com/course/따라하며-배우는-노드-리액트-기본
Author And Source
이 문제에 관하여(인증(Authentication) 기능 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@alwayslee_12/인증Authentication-기능-만들기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)