Skip to content

Commit 3bc92d7

Browse files
authored
Merge pull request #224 from coder13/fix/mongoose-session-deserialization
Fix Mongoose session authentication
2 parents 520951b + 0c8045d commit 3bc92d7

2 files changed

Lines changed: 41 additions & 8 deletions

File tree

server/auth/index.js

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@ const checkStatus = async (res) => {
1313
throw await res.json();
1414
};
1515

16+
const deserializeUser = async (userModel, id, done) => {
17+
try {
18+
done(null, await userModel.findOne({ id }));
19+
} catch (error) {
20+
done(error);
21+
}
22+
};
23+
1624
module.exports = (app, passport) => {
1725
const router = express.Router();
1826
const config = app.get('config');
@@ -80,15 +88,15 @@ module.exports = (app, passport) => {
8088

8189
const profile = meRes.me;
8290

83-
User.findOneAndUpdate({
91+
const user = await User.findOneAndUpdate({
8492
id: +profile.id,
8593
}, buildWcaUserUpdate(profile, tokenRes.access_token), {
8694
upsert: true,
8795
useFindAndModify: false,
8896
new: true,
89-
}, (err, user) => {
90-
done(err, user.toObject());
9197
});
98+
99+
done(null, user.toObject());
92100
} catch (e) {
93101
done(e);
94102
}
@@ -98,11 +106,7 @@ module.exports = (app, passport) => {
98106
done(null, user.id);
99107
});
100108

101-
passport.deserializeUser((id, done) => {
102-
User.findOne({ id }, (err, user) => {
103-
done(err, user);
104-
});
105-
});
109+
passport.deserializeUser((id, done) => deserializeUser(User, id, done));
106110

107111
router.post('/code',
108112
(req, res, next) => {
@@ -144,3 +148,5 @@ module.exports = (app, passport) => {
144148

145149
return router;
146150
};
151+
152+
module.exports.deserializeUser = deserializeUser;

server/auth/index.test.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/** @jest-environment node */
2+
/* eslint-env jest */
3+
4+
const { deserializeUser } = require('./index');
5+
6+
describe('session user deserialization', () => {
7+
it('uses the Mongoose promise API and returns the loaded user', async () => {
8+
const user = { id: 990001 };
9+
const User = { findOne: jest.fn().mockResolvedValue(user) };
10+
const done = jest.fn();
11+
12+
await deserializeUser(User, 990001, done);
13+
14+
expect(User.findOne).toHaveBeenCalledWith({ id: 990001 });
15+
expect(done).toHaveBeenCalledWith(null, user);
16+
});
17+
18+
it('passes persistence errors to Passport', async () => {
19+
const error = new Error('database unavailable');
20+
const User = { findOne: jest.fn().mockRejectedValue(error) };
21+
const done = jest.fn();
22+
23+
await deserializeUser(User, 990001, done);
24+
25+
expect(done).toHaveBeenCalledWith(error);
26+
});
27+
});

0 commit comments

Comments
 (0)