Skip to content

Commit cc07715

Browse files
committed
Ensure current user's token is not lost on refetch
1 parent f17befd commit cc07715

File tree

3 files changed

+51
-0
lines changed

3 files changed

+51
-0
lines changed

src/ParseObject.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1361,7 +1361,14 @@ export default class ParseObject {
13611361
if (otherAttributes.objectId) {
13621362
o.id = otherAttributes.objectId;
13631363
}
1364+
let preserved = null;
1365+
if (typeof o._preserveFieldsOnFetch === 'function') {
1366+
preserved = o._preserveFieldsOnFetch();
1367+
}
13641368
o._clearServerData();
1369+
if (preserved) {
1370+
o._finishFetch(preserved);
1371+
}
13651372
}
13661373
o._finishFetch(otherAttributes);
13671374
if (json.objectId) {

src/ParseUser.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,16 @@ export default class ParseUser extends ParseObject {
249249
}
250250
}
251251

252+
/**
253+
* Class instance method used to maintain specific keys when a fetch occurs.
254+
* Used to ensure that the session token is not lost.
255+
*/
256+
_preserveFieldsOnFetch(): AttributeMap {
257+
return {
258+
sessionToken: this.get('sessionToken'),
259+
};
260+
}
261+
252262
/**
253263
* Returns true if <code>current</code> would return this user.
254264
* @method isCurrent

src/__tests__/ParseUser-test.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,4 +615,38 @@ describe('ParseUser', () => {
615615
expect(user.getUsername()).toBe('test');
616616
expect(user.get('authData').anonymous).toBe(null);
617617
});
618+
619+
it('maintains the session token when refetched', asyncHelper((done) => {
620+
ParseUser.enableUnsafeCurrentUser();
621+
ParseUser._clearCache();
622+
Storage._clear();
623+
CoreManager.setRESTController({
624+
request() {
625+
return ParsePromise.as({
626+
objectId: 'uidfetch',
627+
username: 'temporary',
628+
number: 123,
629+
sessionToken: 'abc141',
630+
}, 201);
631+
},
632+
ajax() {}
633+
});
634+
635+
ParseUser.signUp('temporary', 'password').then((u) => {
636+
expect(u.getSessionToken()).toBe('abc141');
637+
expect(u.get('number')).toBe(123);
638+
ParseUser._clearCache();
639+
640+
let u2 = ParseObject.fromJSON({
641+
objectId: 'uidfetch',
642+
className: '_User',
643+
username: 'temporary',
644+
}, true);
645+
expect(u.getSessionToken()).toBe('abc141');
646+
expect(u2.getSessionToken()).toBe('abc141');
647+
expect(u.get('number')).toBe(undefined);
648+
expect(u2.get('number')).toBe(undefined);
649+
done();
650+
});
651+
}));
618652
});

0 commit comments

Comments
 (0)