Parse On Buddy Logout User

937 Views Asked by At

I am migrating an application from parse.com to buddy.com. One of the caveats of the migration was that Parse.User.current() is no longer available on buddy.com, instead you have to get the user and session token from the request itself: https://github.com/ParsePlatform/Parse-Server/wiki/Compatibility-with-Hosted-Parse#no-current-user

The application I am migrating has a logoutUser method that I am attempting to migrate:

 Parse.Cloud.define("logoutUser", function(request, response) {
     Parse.User.logOut().then(
         function onSuccess(result){
             response.success(result);
         },
         function onError(error) {
            response.error(error);
         }
     )
 });

now I am attempting to do this in the new style, but am receiving an error. (NOTE: This is cloud code not a nodejs environment)

{ 
  "code":"500",
  "error":"Error: There is no current user user on a node.js server environment."
}

New implementation:

function logoutUser(request, response) {
    var user = request.user; 
    var sessionToken = user.getSessionToken();

    Parse.User.logOut({ sessionToken }).then(
        function onSuccess(result){
            response.success(result);
        },
        function onError(error) {
        response.error(error);
        }
    )
}

Parse.Cloud.define("logoutUser", function(request, response) {
    logoutUser(request, response);
});

Suggestions on how to correctly log out users in the Parse on Buddy cloud code?

2

There are 2 best solutions below

0
FotisK On

You could fetch user's session or sessions and delete it / them:

   var query = new Parse.Query("_Session");
   query.descending('createdAt');
   query.equalTo('user', {__type:"Pointer", className:"_User", objectId:"idhere"});
     query.first({
     useMasterKey: true
   }).then(function(session) {
    var sessions = [];
    sessions.push(session);
    Parse.Object.destroyAll(sessions);
   }, function (err) {
      console.log("Internal error " + err);
   });

OR for more tokens you could use find instead of first like:

   var query = new Parse.Query("_Session");
   query.equalTo('user', {__type:"Pointer", className:"_User", objectId:"idhere"});
     query.find({
     useMasterKey: true
   }).then(function(sessions) {
    Parse.Object.destroyAll(sessions);
   }, function (err) {
      console.log("Internal error " + err);
   });

The above will mostly delete or tokens related to the given user. If you wish to delete only tokens used for login, and not for signup or upgrade, then you could put into your query:

query.equalTo('createdWith', { action: 'login', authProvider: 'password'});

As far as i know, deleting a user's last used for login token, then he is logged-out.

0
Brad Serbus On

To add to the above, if you pass up the user's session key to the Cloud Code function via the X-Parse-Session-Token header, you can use the populated request.user object in the session query directly, instead of the user's ID.