diff --git a/src/CoreManager.js b/src/CoreManager.js
index 9a5881dcc..75cad7c54 100644
--- a/src/CoreManager.js
+++ b/src/CoreManager.js
@@ -121,7 +121,8 @@ type UserController = {
logIn: (user: ParseUser, options: RequestOptions) => Promise;
become: (options: RequestOptions) => Promise;
hydrate: (userJSON: AttributeMap) => Promise;
- logOut: () => Promise;
+ logOut: (options: RequestOptions) => Promise;
+ me: (options: RequestOptions) => Promise;
requestPasswordReset: (email: string, options: RequestOptions) => Promise;
updateUserOnDisk: (user: ParseUser) => Promise;
upgradeToRevocableSession: (user: ParseUser, options: RequestOptions) => Promise;
@@ -378,6 +379,7 @@ module.exports = {
'logIn',
'become',
'logOut',
+ 'me',
'requestPasswordReset',
'upgradeToRevocableSession',
'linkWith',
diff --git a/src/ParseUser.js b/src/ParseUser.js
index 7cbefa948..7f1d03e9c 100644
--- a/src/ParseUser.js
+++ b/src/ParseUser.js
@@ -651,6 +651,25 @@ class ParseUser extends ParseObject {
return controller.become(becomeOptions);
}
+ /**
+ * Retrieves a user with a session token.
+ *
+ * @param {String} sessionToken The sessionToken to get user with.
+ * @param {Object} options
+ * @static
+ * @return {Promise} A promise that is fulfilled with the user is fetched.
+ */
+ static me(sessionToken: string, options?: RequestOptions = {}) {
+ const controller = CoreManager.getUserController();
+ const meOptions: RequestOptions = {
+ sessionToken: sessionToken
+ };
+ if (options.useMasterKey) {
+ meOptions.useMasterKey = options.useMasterKey;
+ }
+ return controller.me(meOptions);
+ }
+
/**
* Logs in a user with a session token. On success, this saves the session
* to disk, so you can retrieve the currently logged in user using
@@ -674,20 +693,15 @@ class ParseUser extends ParseObject {
* Logs out the currently logged in user session. This will remove the
* session from disk, log out of linked services, and future calls to
* current will return null.
-
+ *
+ * @param {Object} options
* @static
* @return {Promise} A promise that is resolved when the session is
* destroyed on the server.
*/
- static logOut() {
- if (!canUseCurrentUser) {
- throw new Error(
- 'There is no current user on a node.js server environment.'
- );
- }
-
+ static logOut(options: RequestOptions = {}) {
const controller = CoreManager.getUserController();
- return controller.logOut();
+ return controller.logOut(options);
}
/**
@@ -998,11 +1012,28 @@ const DefaultController = {
}
},
- logOut(): Promise {
+ me(options: RequestOptions): Promise {
+ const RESTController = CoreManager.getRESTController();
+ return RESTController.request(
+ 'GET', 'users/me', {}, options
+ ).then((response) => {
+ const user = new ParseUser();
+ user._finishFetch(response);
+ user._setExisted(true);
+ return user;
+ });
+ },
+
+ logOut(options: RequestOptions): Promise {
+ const RESTController = CoreManager.getRESTController();
+ if (options.sessionToken) {
+ return RESTController.request(
+ 'POST', 'logout', {}, options
+ );
+ }
return DefaultController.currentUserAsync().then((currentUser) => {
const path = Storage.generatePath(CURRENT_USER_KEY);
let promise = Storage.removeItemAsync(path);
- const RESTController = CoreManager.getRESTController();
if (currentUser !== null) {
const isAnonymous = AnonymousUtils.isLinked(currentUser);
const currentSession = currentUser.getSessionToken();
diff --git a/src/__tests__/ParseUser-test.js b/src/__tests__/ParseUser-test.js
index ef0fea9e9..7ff19034f 100644
--- a/src/__tests__/ParseUser-test.js
+++ b/src/__tests__/ParseUser-test.js
@@ -137,9 +137,6 @@ describe('ParseUser', () => {
expect(ParseUser.become.bind(null, 'token')).toThrow(
'It is not memory-safe to become a user in a server environment'
);
- expect(ParseUser.logOut).toThrow(
- 'There is no current user on a node.js server environment.'
- );
});
it('can sign up a new user', (done) => {
@@ -675,6 +672,71 @@ describe('ParseUser', () => {
});
});
+ it('can retreive a user with sessionToken (me)', async () => {
+ ParseUser.disableUnsafeCurrentUser();
+ ParseUser._clearCache();
+ CoreManager.setRESTController({
+ request(method, path, body, options) {
+ expect(method).toBe('GET');
+ expect(path).toBe('users/me');
+ expect(options.sessionToken).toBe('123abc');
+ return Promise.resolve({
+ objectId: 'uid3',
+ username: 'username',
+ sessionToken: '123abc'
+ }, 200);
+ },
+ ajax() {}
+ });
+
+ const user = await ParseUser.me('123abc');
+ expect(user.id).toBe('uid3');
+ expect(user.isCurrent()).toBe(false);
+ expect(user.existed()).toBe(true);
+ });
+
+ it('can retreive a user with sessionToken and masterKey(me)', async () => {
+ ParseUser.disableUnsafeCurrentUser();
+ ParseUser._clearCache();
+ CoreManager.setRESTController({
+ request(method, path, body, options) {
+ expect(method).toBe('GET');
+ expect(path).toBe('users/me');
+ expect(options.sessionToken).toBe('123abc');
+ expect(options.useMasterKey).toBe(true);
+ return Promise.resolve({
+ objectId: 'uid3',
+ username: 'username',
+ sessionToken: '123abc'
+ }, 200);
+ },
+ ajax() {}
+ });
+
+ const user = await ParseUser.me('123abc', { useMasterKey: true });
+ expect(user.id).toBe('uid3');
+ expect(user.isCurrent()).toBe(false);
+ expect(user.existed()).toBe(true);
+ });
+
+ it('can logout user with sessionToken', async () => {
+ ParseUser.disableUnsafeCurrentUser();
+ ParseUser._clearCache();
+ Storage._clear();
+ const RESTController = {
+ request() {
+ return Promise.resolve({}, 200);
+ },
+ ajax() {}
+ };
+ jest.spyOn(RESTController, 'request');
+ CoreManager.setRESTController(RESTController);
+
+ await ParseUser.logOut({ sessionToken: '1234' });
+
+ expect(RESTController.request).toHaveBeenCalledWith('POST', 'logout', {}, { sessionToken: '1234' });
+ });
+
it('can get error when recursive _linkWith call fails', (done) => {
CoreManager.setRESTController({
request(method, path, body) {
diff --git a/src/__tests__/RESTController-test.js b/src/__tests__/RESTController-test.js
index 4d6ce9b38..3d48b351a 100644
--- a/src/__tests__/RESTController-test.js
+++ b/src/__tests__/RESTController-test.js
@@ -263,6 +263,7 @@ describe('RESTController', () => {
logIn() {},
become() {},
logOut() {},
+ me() {},
requestPasswordReset() {},
upgradeToRevocableSession() {},
linkWith() {},
@@ -298,6 +299,7 @@ describe('RESTController', () => {
logIn() {},
become() {},
logOut() {},
+ me() {},
requestPasswordReset() {},
upgradeToRevocableSession() {},
linkWith() {},