Skip to content

Commit 11c40dc

Browse files
authored
Adds session creation code in Auth.js (#4574)
1 parent b754d51 commit 11c40dc

File tree

5 files changed

+81
-80
lines changed

5 files changed

+81
-80
lines changed

src/Auth.js

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
var Parse = require('parse/node').Parse;
2-
var RestQuery = require('./RestQuery');
1+
const cryptoUtils = require('./cryptoUtils');
2+
const RestQuery = require('./RestQuery');
3+
const Parse = require('parse/node');
34

45
// An Auth object tells you who is requesting something and whether
56
// the master key was used.
@@ -212,11 +213,46 @@ Auth.prototype._getAllRolesNamesForRoleIds = function(roleIDs, names = [], queri
212213
})
213214
}
214215

216+
const createSession = function(config, {
217+
userId,
218+
createdWith,
219+
installationId,
220+
additionalSessionData,
221+
}) {
222+
const token = 'r:' + cryptoUtils.newToken();
223+
const expiresAt = config.generateSessionExpiresAt();
224+
const sessionData = {
225+
sessionToken: token,
226+
user: {
227+
__type: 'Pointer',
228+
className: '_User',
229+
objectId: userId
230+
},
231+
createdWith,
232+
restricted: false,
233+
expiresAt: Parse._encode(expiresAt)
234+
};
235+
236+
if (installationId) {
237+
sessionData.installationId = installationId
238+
}
239+
240+
Object.assign(sessionData, additionalSessionData);
241+
// We need to import RestWrite at this point for the cyclic dependency it has to it
242+
const RestWrite = require('./RestWrite');
243+
244+
return {
245+
sessionData,
246+
createSession: () => new RestWrite(config, master(config), '_Session', null, sessionData).execute()
247+
}
248+
}
249+
215250
module.exports = {
216251
Auth,
217252
master,
218253
nobody,
219254
readOnly,
220255
getAuthForSessionToken,
221-
getAuthForLegacySessionToken
256+
getAuthForLegacySessionToken,
257+
createSession,
222258
};

src/Controllers/DatabaseController.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ class DatabaseController {
511511
addRelation(key: string, fromClassName: string, fromId: string, toId: string) {
512512
const doc = {
513513
relatedId: toId,
514-
owningId : fromId
514+
owningId: fromId
515515
};
516516
return this.adapter.upsertOneObject(`_Join:${key}:${fromClassName}`, relationSchema, doc, doc);
517517
}
@@ -658,7 +658,7 @@ class DatabaseController {
658658

659659
// Returns a promise for a list of owning ids given some related ids.
660660
// className here is the owning className.
661-
owningIds(className: string, key: string, relatedIds: string): Promise<string[]> {
661+
owningIds(className: string, key: string, relatedIds: string[]): Promise<string[]> {
662662
return this.adapter.find(joinTableName(className, key), relationSchema, { relatedId: { '$in': relatedIds } }, {})
663663
.then(results => results.map(result => result.owningId));
664664
}

src/RestWrite.js

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
var SchemaController = require('./Controllers/SchemaController');
66
var deepcopy = require('deepcopy');
77

8-
var Auth = require('./Auth');
8+
const Auth = require('./Auth');
99
var cryptoUtils = require('./cryptoUtils');
1010
var passwordCrypto = require('./password');
1111
var Parse = require('parse/node');
@@ -568,29 +568,24 @@ RestWrite.prototype.createSessionToken = function() {
568568
if (this.auth.installationId && this.auth.installationId === 'cloud') {
569569
return;
570570
}
571-
var token = 'r:' + cryptoUtils.newToken();
572571

573-
var expiresAt = this.config.generateSessionExpiresAt();
574-
var sessionData = {
575-
sessionToken: token,
576-
user: {
577-
__type: 'Pointer',
578-
className: '_User',
579-
objectId: this.objectId()
580-
},
572+
const {
573+
sessionData,
574+
createSession,
575+
} = Auth.createSession(this.config, {
576+
userId: this.objectId(),
581577
createdWith: {
582578
'action': this.storage['authProvider'] ? 'login' : 'signup',
583579
'authProvider': this.storage['authProvider'] || 'password'
584580
},
585-
restricted: false,
586581
installationId: this.auth.installationId,
587-
expiresAt: Parse._encode(expiresAt)
588-
};
582+
});
583+
589584
if (this.response && this.response.response) {
590-
this.response.response.sessionToken = token;
585+
this.response.response.sessionToken = sessionData.sessionToken;
591586
}
592587

593-
return new RestWrite(this.config, Auth.master(this.config), '_Session', null, sessionData).execute();
588+
return createSession();
594589
}
595590

596591
RestWrite.prototype.destroyDuplicatedSessions = function() {
@@ -675,29 +670,23 @@ RestWrite.prototype.handleSession = function() {
675670
}
676671

677672
if (!this.query && !this.auth.isMaster) {
678-
var token = 'r:' + cryptoUtils.newToken();
679-
var expiresAt = this.config.generateSessionExpiresAt();
680-
var sessionData = {
681-
sessionToken: token,
682-
user: {
683-
__type: 'Pointer',
684-
className: '_User',
685-
objectId: this.auth.user.id
686-
},
687-
createdWith: {
688-
'action': 'create'
689-
},
690-
restricted: true,
691-
expiresAt: Parse._encode(expiresAt)
692-
};
673+
const additionalSessionData = {};
693674
for (var key in this.data) {
694675
if (key === 'objectId' || key === 'user') {
695676
continue;
696677
}
697-
sessionData[key] = this.data[key];
678+
additionalSessionData[key] = this.data[key];
698679
}
699-
var create = new RestWrite(this.config, Auth.master(this.config), '_Session', null, sessionData);
700-
return create.execute().then((results) => {
680+
681+
const { sessionData, createSession } = Auth.createSession(this.config, {
682+
userId: this.auth.user.id,
683+
createdWith: {
684+
action: 'create',
685+
},
686+
additionalSessionData
687+
});
688+
689+
return createSession().then((results) => {
701690
if (!results.response) {
702691
throw new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR,
703692
'Error creating session.');

src/Routers/SessionsRouter.js

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import ClassesRouter from './ClassesRouter';
33
import Parse from 'parse/node';
44
import rest from '../rest';
55
import Auth from '../Auth';
6-
import RestWrite from '../RestWrite';
7-
import { newToken } from '../cryptoUtils';
86

97
export class SessionsRouter extends ClassesRouter {
108

@@ -32,30 +30,24 @@ export class SessionsRouter extends ClassesRouter {
3230

3331
handleUpdateToRevocableSession(req) {
3432
const config = req.config;
35-
const masterAuth = Auth.master(config)
3633
const user = req.auth.user;
3734
// Issue #2720
3835
// Calling without a session token would result in a not found user
3936
if (!user) {
4037
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'invalid session');
4138
}
42-
const expiresAt = config.generateSessionExpiresAt();
43-
const sessionData = {
44-
sessionToken: 'r:' + newToken(),
45-
user: {
46-
__type: 'Pointer',
47-
className: '_User',
48-
objectId: user.id
49-
},
39+
const {
40+
sessionData,
41+
createSession
42+
} = Auth.createSession(config, {
43+
userId: user.id,
5044
createdWith: {
5145
'action': 'upgrade',
5246
},
53-
restricted: false,
5447
installationId: req.auth.installationId,
55-
expiresAt: Parse._encode(expiresAt)
56-
};
57-
const create = new RestWrite(config, masterAuth, '_Session', null, sessionData);
58-
return create.execute().then(() => {
48+
});
49+
50+
return createSession().then(() => {
5951
// delete the session token, use the db to skip beforeSave
6052
return config.database.update('_User', {
6153
objectId: user.id

src/Routers/UsersRouter.js

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import ClassesRouter from './ClassesRouter';
77
import rest from '../rest';
88
import Auth from '../Auth';
99
import passwordCrypto from '../password';
10-
import RestWrite from '../RestWrite';
11-
const cryptoUtils = require('../cryptoUtils');
1210

1311
export class UsersRouter extends ClassesRouter {
1412

@@ -142,8 +140,6 @@ export class UsersRouter extends ClassesRouter {
142140
}
143141
}
144142

145-
const token = 'r:' + cryptoUtils.newToken();
146-
user.sessionToken = token;
147143
delete user.password;
148144

149145
// Remove hidden properties.
@@ -161,31 +157,19 @@ export class UsersRouter extends ClassesRouter {
161157
delete user.authData;
162158
}
163159
}
160+
const {
161+
sessionData,
162+
createSession
163+
} = Auth.createSession(req.config, { userId: user.objectId, createdWith: {
164+
'action': 'login',
165+
'authProvider': 'password'
166+
}, installationId: req.info.installationId });
164167

165-
req.config.filesController.expandFilesInObject(req.config, user);
168+
user.sessionToken = sessionData.sessionToken;
166169

167-
const expiresAt = req.config.generateSessionExpiresAt();
168-
const sessionData = {
169-
sessionToken: token,
170-
user: {
171-
__type: 'Pointer',
172-
className: '_User',
173-
objectId: user.objectId
174-
},
175-
createdWith: {
176-
'action': 'login',
177-
'authProvider': 'password'
178-
},
179-
restricted: false,
180-
expiresAt: Parse._encode(expiresAt)
181-
};
182-
183-
if (req.info.installationId) {
184-
sessionData.installationId = req.info.installationId
185-
}
170+
req.config.filesController.expandFilesInObject(req.config, user);
186171

187-
const create = new RestWrite(req.config, Auth.master(req.config), '_Session', null, sessionData);
188-
return create.execute();
172+
return createSession();
189173
}).then(() => {
190174
return { response: user };
191175
});

0 commit comments

Comments
 (0)