Skip to content

Commit 2981082

Browse files
committed
add validate, token, and cookie
1 parent 32b6cbe commit 2981082

File tree

8 files changed

+286
-78
lines changed

8 files changed

+286
-78
lines changed

config/validation.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import Joi from "@hapi/joi"
2+
3+
export const registerValidation = (data) => {
4+
const schema = Joi.object({
5+
name: Joi.string().required(),
6+
email: Joi.string().email().required(),
7+
password: Joi.string().min(6).required(),
8+
rePassword: Joi.string().min(6).required()
9+
})
10+
11+
return schema.validate(data)
12+
}
13+
14+
export const loginValidation = (data) => {
15+
const schema = Joi.object({
16+
email: Joi.string().email().required(),
17+
password: Joi.string().min(6).required(),
18+
})
19+
20+
return schema.validate(data)
21+
}

controller/refreshToken.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
1-
import Users from "../models/user";
1+
import Users from "../models/user.js";
22
import jwt from "jsonwebtoken";
33

44
export const refreshToken = async(req, res) =>{
55
try {
66
const refreshToken = req.cookies.refreshToken;
7-
if(!refreshToken) return res.sendStatus(401);
7+
if(!refreshToken) return res.status(401).json({
8+
status: res.statusCode,
9+
message: "Unauthorized"
10+
});
811
const user = await Users.findAll({
912
where:{
1013
refresh_token: refreshToken
1114
}
1215
});
13-
if(!user[0]) return res.sendStatus(403);
16+
if(!user[0]) return res.status(403).json({
17+
status: res.statusCode,
18+
message: "Forbidden"
19+
});
1420
jwt.verify(refreshToken, process.env.REFRESH_TOKEN_SECRET, (err, decode) =>{
15-
if(err) return res.sendStatus(403);
21+
if(err) return res.status(403).json({
22+
status: res.statusCode,
23+
message: "Forbidden"
24+
});
1625
const idUser =user[0].id;
1726
const nama =user[0].nama;
1827
const email =user[0].email;

controller/users.js

Lines changed: 140 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,75 @@
11
import Users from "../models/user.js";
22
import bcrypt from "bcrypt";
33
import jwt from "jsonwebtoken";
4+
import {
5+
registerValidation,
6+
loginValidation
7+
} from "../config/validation.js"
8+
import crypto from "crypto"
49

5-
export const getUsers = async(req, res)=> {
10+
export const getToken = async (req, res, next) => {
11+
const {
12+
token
13+
} = req.body
14+
const tokenExist = await Users.findOne({
15+
where: {
16+
refresh_token: token
17+
}
18+
})
19+
if (!tokenExist) return res.status(403).json({
20+
status: res.statusCode,
21+
message: "Unauthorized",
22+
});
23+
next();
24+
}
25+
26+
export const getUsers = async (req, res) => {
627
try {
728
const users = await Users.findAll({
829
attributes: ['id', 'name', 'email']
930
});
1031
return res.status(200).json({
1132
status: res.statusCode,
1233
message: "Sukses",
13-
data: users});
34+
data: users
35+
});
1436
} catch (error) {
15-
console.log(error);
37+
console.log(error);
1638
}
1739
}
1840

19-
export const Register = async(req, res)=> {
20-
const {name, email, password, rePassword} = req.body;
21-
if(password !== rePassword)
22-
return res.status(400).json({
23-
status: res.statusCode,
24-
message: 'Password dan rePassword tidak cocok !'});
41+
export const Register = async (req, res) => {
42+
const {
43+
name,
44+
email,
45+
password,
46+
rePassword
47+
} = req.body;
48+
49+
const { error } = await registerValidation(req.body)
50+
if (error) {
51+
return res.status(400).json({
52+
status: res.statusCode,
53+
message: error.details[0].message
54+
});
55+
}
2556

26-
// const emailExist = await Users.findOne({email: req.body.email})
27-
// if(emailExist) return res.status(400).json({
28-
// status: res.statusCode,
29-
// message: 'Email Sudah digunakan !'
30-
// })
57+
58+
if (password !== rePassword)
59+
return res.status(400).json({
60+
status: res.statusCode,
61+
message: 'Password dan rePassword tidak cocok !'
62+
});
63+
64+
const emailExist = await Users.findOne({
65+
where: {
66+
email: req.body.email
67+
}
68+
})
69+
if (emailExist) return res.status(400).json({
70+
status: res.statusCode,
71+
message: 'Email Sudah digunakan !'
72+
})
3173

3274
const salt = await bcrypt.genSalt(10);
3375
const hashPassword = await bcrypt.hash(req.body.password, salt);
@@ -43,56 +85,99 @@ export const Register = async(req, res)=> {
4385
res.status(200).json({
4486
status: res.statusCode,
4587
message: 'Berhasil membuat user baru',
46-
data: saveUser})
47-
}catch(err){
88+
data: saveUser
89+
})
90+
} catch (err) {
4891
res.status(400).json({
4992
status: res.statusCode,
5093
message: 'Gagal membuat user baru'
5194
})
5295
}
5396
}
5497

55-
export const Login = async(req, res)=>{
56-
// try {
57-
const user = await Users.findAll({
58-
where: {
59-
email: req.body.email
60-
}
61-
});
62-
63-
if (user == '') {
64-
return res.status(400).json({
65-
status:res.statusCode,
66-
message: 'Email tidak ditemukan'
67-
});
98+
export const Login = async (req, res) => {
99+
const user = await Users.findAll({
100+
where: {
101+
email: req.body.email
68102
}
69-
const match = await bcrypt.compare(req.body.password, user[0].password);
70-
if(!match) { return res.status(404).json({message: "wrong password"});}
71-
const idUser = user[0].id;
72-
const name = user[0].name;
73-
const email = user[0].email;
74-
const accessToken = jwt.sign({idUser, name, email}, process.env.ACCESS_TOKEN_SECRET,{
75-
expiresIn: '20s'
76-
});
77-
const refreshToken = jwt.sign({idUser, name, email}, process.env.REFRESH_TOKEN_SECRET,{
78-
expiresIn: '7d'
79-
});
80-
await Users.update({refresh_token:refreshToken},{
81-
where: {
82-
id: idUser
83-
}
84-
});
85-
res.cookie('refreshToken', refreshToken, {
86-
httpOnly: true,
87-
maxAge: 24 * 60 * 60 * 1000
103+
});
104+
105+
if (user == '') {
106+
return res.status(400).json({
107+
status: res.statusCode,
108+
message: 'Email tidak ditemukan'
88109
});
89-
res.status(200).json({
90-
status:res.statusCode,
91-
message: 'Berhasil Login',
92-
token: accessToken
110+
}
111+
const match = await bcrypt.compare(req.body.password, user[0].password);
112+
if (!match) {
113+
return res.status(403).json({
114+
message: "wrong password"
93115
});
116+
}
117+
118+
const idUser = user[0].id;
119+
const name = user[0].name;
120+
const email = user[0].email;
121+
const accessToken = jwt.sign({
122+
idUser,
123+
name,
124+
email
125+
},
126+
process.env.ACCESS_TOKEN_SECRET, {
127+
expiresIn: '60s'
128+
}
129+
);
130+
const refreshToken = jwt.sign({
131+
idUser,
132+
name,
133+
email
134+
},
135+
process.env.REFRESH_TOKEN_SECRET, {
136+
expiresIn: '1d'
137+
}
138+
);
139+
await Users.update({
140+
refresh_token: refreshToken
141+
}, {
142+
where: {
143+
id: idUser
144+
}
145+
});
146+
res.cookie('refreshToken', refreshToken, {
147+
httpOnly: true,
148+
maxAge: 24 * 60 * 60 * 1000
149+
});
150+
res.status(200).json({
151+
status: res.statusCode,
152+
message: 'Berhasil Login',
153+
token: accessToken
154+
});
155+
}
94156

95-
// } catch (error) {
96-
// res.status(404).json({message: "Email tidak ditemukan"});
97-
// }
157+
export const Logout = async (req, res) => {
158+
const refreshToken = req.cookies.refreshToken;
159+
if (!refreshToken) return res.status(401).json({
160+
status: res.statusCode,
161+
message: "No Token Found"
162+
});
163+
const user = await Users.findAll({
164+
where: {
165+
refresh_token: refreshToken
166+
}
167+
});
168+
if (!user[0]) return res.status(401).json({
169+
status: res.statusCode,
170+
message: "No User Found"
171+
});
172+
const idUser = user[0].id
173+
await Users.update({refresh_token: null}, {
174+
where: {
175+
id: idUser
176+
}
177+
});
178+
res.clearCookie('refreshToken')
179+
return res.status(200).json({
180+
status: res.statusCode,
181+
message: "Logged out successfully"
182+
});
98183
}

middleware/verifyToken.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,15 @@ import Jwt from "jsonwebtoken";
33
export const verifyToken = (req, res, next) => {
44
const authHeader = req.headers['authorization'];
55
const token = authHeader && authHeader.split(' ')[1];
6-
if(token == null) return res.sendStatus(401);
6+
if(token == null) return res.status(401).json({
7+
status: res.statusCode,
8+
message: "unauthorized"
9+
});
710
Jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, decode) => {
8-
if(err) return res.sendStatus(403);
11+
if(err) return res.status(403).json({
12+
status: res.statusCode,
13+
message: "token invalid"
14+
});
915
req.email = decode.email;
1016
next();
1117
})

0 commit comments

Comments
 (0)