-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrefresh.js
More file actions
87 lines (78 loc) · 3.06 KB
/
refresh.js
File metadata and controls
87 lines (78 loc) · 3.06 KB
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
const { sign, verify, refreshVerify } = require('./jwt-util');
const jwt = require('jsonwebtoken');
const mysql = require('mysql');
const refresh = async (req, res) => {
// access token과 refresh token의 존재 유무를 체크합니다.
if (req.headers.authorization && req.headers.refresh) {
const authToken = req.headers.authorization.split('Bearer ')[1];
const refreshToken = req.headers.refresh;
const auth = authToken.substr(0, authToken.length - 1);
const refresh = refreshToken.substr(1, refreshToken.length - 1);
// access token 검증 -> expired여야 함.
const authResult = verify(auth);
// bad access token
if(authResult.ok == false || authResult == null)
{
return res.status(401).send({
isSuccess: false,
code: 401,
message: 'No authorized',
});
}
console.log(authResult);
// access token 디코딩하여 user의 정보를 가져옵니다.
const decoded = jwt.decode(auth);
// 디코딩 결과가 없으면 권한이 없음을 응답.
if (decoded === null) {
res.status(401).send({
isSuccess: false,
code: 401,
message: 'No authorized!',
});
}
/* access token의 decoding 된 값에서
유저의 id를 가져와 refresh token을 검증합니다. */
const refreshResult = refreshVerify(refresh, decoded.hash);
// 재발급을 위해서는 access token이 만료되어 있어야합니다.
if (authResult.ok === false && authResult.message === 'jwt expired') {
// 1. access token이 만료되고, refresh token도 만료 된 경우 => 새로 로그인해야합니다.
if (refreshResult.ok === false) {
res.status(401).send({
isSuccess: false,
code: 401,
message: 'No authorized!',
});
} else {
// 2. access token이 만료되고, refresh token은 만료되지 않은 경우 => 새로운 access token을 발급
user = {
id: result.id, // token이 검증되었으면 req에 값을 세팅하고, 다음 콜백함수로 갑니다.
hash: result.hash,
ip: result.ip
}
const newAccessToken = sign(user);
res.status(200).send({ // 새로 발급한 access token과 원래 있던 refresh token 모두 클라이언트에게 반환합니다.
isSuccess: true,
code: 200,
data: {
accessToken: newAccessToken,
refreshToken,
},
});
}
} else {
// 3. access token이 만료되지 않은경우 => refresh 할 필요가 없습니다.
res.status(400).send({
isSuccess: false,
code: 400,
message: 'Acess token is not expired!',
});
}
} else { // access token 또는 refresh token이 헤더에 없는 경우
res.status(401).send({
isSuccess: false,
code: 401,
message: 'No authorized!',
});
}
};
module.exports = refresh;