Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- jquery
- 프론트엔드
- 데스크탑애플리케이션
- Django
- 웹 프로그래밍
- rails
- django 공부하기
- css3
- 웹프로그래밍
- 웹 프로그래밍 입문
- nodejs api
- Python
- 꿀팁
- 장고
- 웹 프론트엔드
- 루비온레일즈
- 모듈화
- 루비 온 레일즈
- 루비
- 모닝버드
- rails review
- 예스인테리어
- express-mysql-session
- 파이썬 웹 프레임워크
- Ruby On Rails
- node.js
- 홈페이지 개발하기
- nodejs
- 장고 공부하기
- 레일즈
Archives
- Today
- Total
노래하듯 이야기하고, 춤추듯 정복하라.
[Node.js API 개발] 로그인 상태 유지 & 자동 로그인 본문
# 로그인 상태 유지 & 자동 로그인 구현
## 필요한 모듈
// npm install jsonwebtoken
const jwt = require('jsonwebtoken')
// npm install uuid
const uuidv4 = require('uuid/v4')
## Front(세션 정보)에서 받아와야 할 정보
* uuid => 사용자가 로그인 시 사용자 DB 업데이트와 함께 프런트에 전달한다.
const { user_id, uuid } = req.body
// uuid => 사용자가 로그인 시 사용자 DB 업데이트와 함께 프런트에 전달한다.
## router 구현
1. 로그인 - routes/auth.js
const uuidv4 = require('uuid/v4');
const jwt = require('jsonwebtoken');
router.post('/signIn', async (req, res, next) => {
try {
const { email, password } = req.body;
if (사용자가 유효할 시) {
const user = await User.findOne({ where: { id: user_id } });
// 사용자DB Update - uuid
const uuidNew = await uuidv4();
await User.update({ uuid: uuidNew }, { where: { id: user_id } });
// 토큰 발행
const token = await jwt.sign({
user_id,
email: user.email,
}, process.env.JWT_SECRET, {
expiresIn: 15m, // 15분
issuer: 'TL',
});
let payLoad = {
user_id,
uuid: uuidNew,
token
}
res.status(200).json({
resultCode: 200,
message: "로그인 성공",
payLoad,
});
} else {
// 사용자 없음
}
} catch (err) {
// 서버 에러
}
});
2. 토큰 재발행
- 5분마다 토큰이 만료되기 때문에
=> Front에서 419(토큰 만료) response를 받았을 때 자동으로 토큰 재발행 요청을 한다.
router.post('/token', async (req, res, next) => {
try {
const { user_id, uuid } = req.body;
// 데이터 유효성 체크
if (!user_id) { response(res, 400, "로그인 필요"); return; }
if (!uuid) { response(res, 400, "사용자의 세션정보 없음"); return; }
// 유저 확인
if (await exUser(user_id)) {
const user = await User.findOne({ where: { id: user_id } });
// uuid 정보가 일치하면, 토큰 업데이트
if (user.uuid == uuid) {
const uuidNew = await uuidv4();
// 사용자 uuid 값 업데이트
await User.update({ uuid: uuidNew }, { where: { id: user_id } })
// 새 토큰 발행
const token = await jwt.sign({
user_id: user.id,
email: user.email,
}, process.env.JWT_SECRET,{
expiresIn: '15m',
issuer: 'tlcompany',
});
let payLoad = {
user_id,
uuid: uuidNew,
token,
}
response(res, 200, "토큰 재발행 및 uuid 업데이트", payLoad);
} else {
response(res, 401, "권한 없음");
}
} else {
response(res, 404, "사용자 없음");
}
} catch (err) {
console.log(err);
response(res, 500, "서버 에러");
}
});
'프로그래밍 > node.js' 카테고리의 다른 글
[맥 mysql password 오류] Client does not support authentication protocol requested by server; consider upgrading MySQL client (0) | 2019.07.26 |
---|---|
[Node.js API 개발] AWS S3 이미지 업로드, multer-s3 사용 (1) | 2019.05.29 |
[Node.js API 개발] JWT 토큰을 활용한 데이터 변조 및 탈취 방지 (0) | 2019.05.27 |
[Node.js API 개발] Node.js 모듈 사용 시 주의 할 점 (0) | 2019.05.27 |
session정보 mysql에 저장하기 & passport 인증 구현 (1) | 2018.01.06 |
Comments