【问题标题】:Parse On Buddy Logout User解析好友注销用户
【发布时间】:2017-06-23 15:02:24
【问题描述】:

我正在将应用程序从 parse.com 迁移到 buddy.com。迁移的注意事项之一是 Parse.User.current() 在 buddy.com 上不再可用,而是您必须从请求本身获取用户和会话令牌:https://github.com/ParsePlatform/Parse-Server/wiki/Compatibility-with-Hosted-Parse#no-current-user

我正在迁移的应用程序有一个我正在尝试迁移的logoutUser 方法:

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

现在我正在尝试以新样式执行此操作,但收到错误消息。 (注意:这是云代码,不是 nodejs 环境)

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

新实现:

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);
});

关于如何在 Parse on Buddy 云代码中正确注销用户的建议?

【问题讨论】:

  • 不确定您要在这里做什么。因为在任何云代码环境中都没有当前用户,所以他们无法注销。建议获取请求用户和会话令牌的解决方案是在运行任何 Parse.Query 时传递令牌。您不必在云代码中注销用户,只需在本地设备/浏览器上。
  • @EReid 嗯好的,那我可能是误会了。我是 Cloud Code 的新手,特别是这个应用程序的新手。所以我猜这意味着注销在这个应用程序中永远不会起作用,因为注销功能是云代码功能。
  • @EReid 当您说在设备上本地注销时,这与解析有什么关系吗?还是只针对应用本身?
  • 我不太清楚 Parse.User 在原始 Parse.com 上的工作细节,因此无法评论它是否有效。通过在本地注销,这完全取决于您使用的 SDK。我知道 Javascript SDK 和 Android SDK 都具有分别注销用户的功能:Parse.User.logOut()ParseUser.logOut();。如果使用 Rest api,您只需停止发送 X-Parse-Session-Token 标头,并删除存储的令牌。
  • 是的,我们没有为 Web 客户端使用任何 SDK,只是 POST 和 GET 到 buddy.com 端点。非常感谢,这真的很有帮助。如果您愿意将其移至下方,我很乐意将您的最后一条评论标记为答案。

标签: parse-platform parse-cloud-code buddy.com


【解决方案1】:

您可以获取用户的一个或多个会话并将其删除:

   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);
   });

或者对于更多标记,您可以使用 find 而不是 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);
   });

以上将主要删除或与给定用户相关的令牌。如果您只想删除用于登录的令牌,而不是用于注册或升级的令牌,那么您可以输入您的查询:

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

据我所知,删除用户上次用于登录的令牌,然后他就退出了。

【讨论】:

    【解决方案2】:

    补充一下,如果您通过 X-Parse-Session-Token 标头将用户的会话密钥传递给 Cloud Code 函数,您可以直接在会话查询中使用填充的 request.user 对象,而不是用户 ID。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-29
      • 2011-08-30
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      相关资源
      最近更新 更多