-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathauth.js
130 lines (122 loc) Β· 3.54 KB
/
auth.js
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
const bcrypt = require('bcrypt');
const passport = require('koa-passport');
const FacebookStrategy = require('passport-facebook').Strategy;
const LocalStrategy = require('passport-local').Strategy;
const config = require('../serverConfig');
const { db } = require('../server');
const { promisify } = require('util');
const getAsync = promisify(db.get).bind(db);
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser(async (id, done) => {
try {
let user = null;
await getAsync('usersMockDatabase').then((users) => {
user = JSON.parse(users).find(currUser => currUser.id === id);
});
if (user) {
done(null, user);
} else {
done(null, false);
}
} catch (err) {
done(err);
}
});
passport.use(
new LocalStrategy(
{
usernameField: 'email',
passwordField: 'password',
},
async (email, password, done) => {
let user = null;
await getAsync('usersMockDatabase').then((users) => {
const currUsers = JSON.parse(users);
// if redis session expired, create database with one user
if (!currUsers || currUsers.length < 1) {
db.set('usersMockDatabase', [
{
id: 1,
email: 'chouomam@chouman.com',
// "test" -- generated by bcrypt calculator
password: '$2a$04$4yQfCo8kMpH24T2iQkw9p.hPjcz10m.FcWmgkOhkXNPSpbwHZ877S',
userName: 'Chouomam',
},
]);
}
user = currUsers.find(currUser => currUser.email === email);
});
if (!user) {
done({ type: 'email', message: 'No such user found' }, false);
return;
}
if (bcrypt.compareSync(password, user.password)) {
done(null, { id: user.id, email: user.email, userName: user.userName });
} else {
done({ type: 'password', message: 'Passwords did not match' }, false);
}
},
),
);
passport.use(
new FacebookStrategy(
{
clientID: config.facebookAuth.clientID,
clientSecret: config.facebookAuth.clientSecret,
callbackURL: config.facebookAuth.callbackURL,
profileFields: [
'id',
'displayName',
'picture.width(200).height(200)',
'first_name',
'middle_name',
'last_name',
'gender',
'link',
'email',
'location',
'friends',
],
},
(accessToken, refreshToken, profile, done) => {
process.nextTick(async () => {
const facebookUser = {
id: Math.random(),
userName: profile.displayName,
email: profile.emails[0].value,
imgUrl: profile.photos[0].value,
imgHeight: 200,
imgWidth: 200,
userProfileId: profile.id,
};
await getAsync('usersMockDatabase').then((users) => {
// save new user into database
const currUsers = JSON.parse(users);
currUsers.push(facebookUser);
db.set('usersMockDatabase', JSON.stringify(currUsers));
});
return done(null, facebookUser);
});
},
),
);
exports.getLoggedUser = async (ctx) => {
if (ctx.isAuthenticated()) {
const reqUserId = ctx.req.user.id;
let user = null;
await getAsync('usersMockDatabase').then((users) => {
user = JSON.parse(users).find(currUser => currUser.id === reqUserId);
});
if (user) {
delete user.password;
ctx.response.body = user;
} else {
const statusCode = 500;
ctx.throw(statusCode, "User doesn't exist");
}
} else {
ctx.redirect('/');
}
};