Skip to content

Commit c0d68d9

Browse files
authored
Merge pull request #122 from KidkArolis/fix-session-race-condition
Fix a race condition in Express where browsers redirect before session is persisted
2 parents 59f974e + 2eb66f4 commit c0d68d9

1 file changed

Lines changed: 12 additions & 7 deletions

File tree

lib/consumer/express.js

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,30 +41,35 @@ module.exports = function (_config) {
4141
connect(req, res)
4242
})
4343

44-
var transport = (provider, res, session) => (data) => {
44+
var transport = (provider, req, res, session) => (data) => {
4545
if (!provider.callback) {
4646
res.end(qs.stringify(data))
4747
}
4848
else if (!provider.transport || provider.transport === 'querystring') {
49-
res.redirect(`${provider.callback}?${qs.stringify(data)}`)
49+
redirect(req, res, `${provider.callback}?${qs.stringify(data)}`)
5050
}
5151
else if (provider.transport === 'session') {
5252
session.response = data
53-
res.redirect(provider.callback)
53+
redirect(req, res, provider.callback)
5454
}
5555
}
5656

57+
var redirect = (req, res, url) =>
58+
typeof req.session.save === 'function'
59+
? req.session.save(() => res.redirect(url))
60+
: res.redirect(url)
61+
5762
function connect (req, res) {
5863
var session = req.session.grant
5964
var provider = config.provider(app.config, session)
60-
var response = transport(provider, res, session)
65+
var response = transport(provider, req, res, session)
6166

6267
if (provider.oauth === 1) {
6368
oauth1.request(provider)
6469
.then(({body}) => {
6570
session.request = body
6671
oauth1.authorize(provider, body)
67-
.then((url) => res.redirect(url))
72+
.then((url) => redirect(req, res, url))
6873
.catch(response)
6974
})
7075
.catch(response)
@@ -74,7 +79,7 @@ module.exports = function (_config) {
7479
session.state = provider.state
7580
session.nonce = provider.nonce
7681
oauth2.authorize(provider)
77-
.then((url) => res.redirect(url))
82+
.then((url) => redirect(req, res, url))
7883
.catch(response)
7984
}
8085

@@ -86,7 +91,7 @@ module.exports = function (_config) {
8691
function callback (req, res) {
8792
var session = req.session.grant || {}
8893
var provider = config.provider(app.config, session)
89-
var response = transport(provider, res, session)
94+
var response = transport(provider, req, res, session)
9095

9196
if (provider.oauth === 1) {
9297
oauth1.access(provider, session.request, req.query)

0 commit comments

Comments
 (0)