✔️
auth root
만드는 이유?
- 페이지 이동할 때마다 로그인 되어있는 상태인지 아닌지 확인 필요
- 예를 들어, 글을 작성할 때나 삭제할 때 권한이 있는지
✔️그럼 이걸 대체 어떻게 할까?
cookie
에서 저장된token
을server
에서 가져와서 복호화함
- 복호화 하면
user Id
가 나오는데, 이를 이용하여DB
의user
값이 저장되어있는 곳에서 해당 유저를 찾음
- 이때 이
user Id
라는건 사용자가 입력한 아이디라는 개념이 아닌,mongoDB
에 값 저장될 때 생성되는 고유 아이디를 의미
- 이를 찾으면 쿠키를 받아온
token
이 유저도 갖고 있는지 확인
- 쿠키 일치X:authentication False
- 쿠키 일치O:authentication True
// User.js
userSchema.statics.findByToken = function (token) {
const user = this
return new Promise((resolve, reject) => {
// 토큰 decode
jwt.verify(token, 'secretToken', (err, decoded) => {
if (err) {
reject(err)
}
// id를 통해 유저 찾고
// 클라이언트에서 가져온 token과 DB에 보관된 토큰이 일치하는지 확인
user.findOne({ '_id': decoded.userId, 'token': token })
.then(user => {
resolve(user)
})
.catch(err => {
reject(err)
})
})
})
}
이제 auth
기능을 만들어줄건데, 그전에 middleware
라는 폴더를 생성하여 이 안에 auth.js
파일을 생성한다.
참고로 현재 내 파일 구조 일부분은 아래와 같다.
// middleware/auth.js
const { User } = require('../models/User')
let auth = async (req, res, next) => {
try {
// 클라이언트 쿠키에서 토큰 가져옴
let token = req.cookies.user_auth
// 토큰을 복호화 후 유저 찾음
const user = await User.findByToken(token);
if (!user) {
return res.json({ isAuth: false, error: true });
}
req.token = token;
req.user = user;
next()
} catch (err) {
throw err
}
};
module.exports = { auth }
위에서 만든 auth
를 사용하는 코드를 추가해주었고, get
방식으로 api를 구현하였다.
인증과정이 이뤄지면 해당 결과에 대한 값을 json
으로 반환하도록 하였다.
_id
: DB에 저장된 유저 데이터에 대한 고유 아이디isAdmin
: admin인지 아닌지isAuth
: 성공적으로 인증이 이루어졌는지name
: 유저의 이름 (없으면 반환X)lastname
: 유저의 lastname (없으면 반환X)role
: admin or 일반 유저image
: 유저의 이미지 (없으면 반환X)
//index.js
const { auth } = require('./middleware/auth')
// role 0: admin
// role 1: 일반 유저
app.get('/api/users/auth', auth, (req, res) => {
res.status(200).json({
_id: req.user._id,
isAdmin: req.user.role === 0 ? true : false,
isAuth: true,
email: req.user.email,
name: req.user.name,
lastname: req.user.lastname,
role: req.user.role,
image: req.user.image
})
})
우선 인증이 잘 되는지 테스트를 위해 login
을 해준다.
현재 test@gmail.com
계정이 로그인 되어있는지를 확인하기 위해
api/users/api
에 접근한다.
그럼 위의 사진과 같이 _id
, isAdmin
, isAuth
, email
, role
이 나타난다. 이때 _id
는 로그인 했을 때 반환되었던 _id
값과 동일하게 나오는것을 확인할 수 있으며, 이로써 해당 계정에 대한 인증이 성공적으로 이루어졌음을 알 수 있다.