【问题标题】:UserCannotBeAlteredWithoutSessionError when updating PFUser on Parse from Heroku node.js app从 Heroku node.js 应用程序在 Parse 上更新 PFUser 时出现 UserCannotBeAlteredWithoutSessionError
【发布时间】:2016-01-22 13:48:36
【问题描述】:

我正在尝试从 Heroku 上运行的 node.js 应用程序更新我的 Parse 数据库中的 PFUser。我正在从 iOS 应用程序调用 Parse 云函数。

这是我用来在解析时更新用户以及在 Stripe 上创建用户的代码部分(Stripe 部分工作正常):

Parse.Cloud.define("createCustomerWithCreditCardToken", function(request, response) {
  var userId = request.user.id;
  var sourceId = request.params.creditCardToken;
  var customerId;
  var userSessionToken = request.user.getSessionToken();
  console.log('userId: ' + userId + ' source: ' + sourceId + ' userSessionToken: ' + userSessionToken);
  stripe.customers.create({
    source: sourceId,
    description: userId
  }, function(error, customer) {
    if (error !== null) {
      response.error('error creating customer: ' + error);
    }else {
      var userQuery = new Parse.Query('User');
      userQuery.equalTo('objectId', userId);
      userQuery.first({sessionToken: userSessionToken}).then(function(user) {
        console.log('user from parse query: ' + user.get("username"));
        user.set("stripeCustomerId", customer.id);
        user.save(null, {
          success: function(parseCustomer) {
            console.log('customer saved to parse: ' + parseCustomer);
          },
          error: function(error, parseCustomer) {
            console.log('customer save failed: ' + JSON.stringify(error, null, 2) + ' with error: ' + JSON.stringify(parseCustomer,null, 2));
          }
        });
      });
      customerId = customer.id;
      console.log('customerId: '+ customerId);
      // response.success(customer);
      response.success('Customer: ' + JSON.stringify(customer, null, 2) + 'error: ' + error);
    }
  });
});

运行此程序时,我得到以下错误日志输出: error log output

error: { "code": 206, "message": "Parse::UserCannotBeAlteredWithoutSessionError" } 

在这个post 中,Parse 工程师讨论了 node.js 应用程序上下文中的当前用户概念。

同样在 Cloud Code 中,返回当前的方法的概念 用户是有意义的,就像它在网页上的 JavaScript 中所做的那样,因为 只有一个活动请求,只有一个用户。然而在一个 像 node.js 这样的上下文,不能有一个全局当前用户,这 需要显式传递会话令牌。

基本上他建议这样做:

Parse.Cloud.define('findBacon', function(req, res) {
var token = req.user.getSessionToken();
var query = new Parse.Query('Bacon');
// Pass the session token to the query
query.find({ sessionToken: token }).then( ... );
});

我也尝试过使用{useMasterKey:true} 而不是{sessionToken:userSessionToken},这会产生同样的错误。

我可能只是遗漏了一些明显的细节,但我似乎无法找到它。非常感谢任何有关如何解决此问题的想法。

【问题讨论】:

    标签: javascript node.js parsing heroku pfuser


    【解决方案1】:

    原来还有第三种处理凭据的方法:

    Parse.Cloud.useMasterKey();
    

    我将这一行放在整个方法的开头,这对我来说是这样做的。不过,我不确定为整个功能提供这些凭据的含义。

    我也不确定您何时会使用其他选项。

    如果有人遇到此问题并想详细说明,我很乐意为何时授予哪些凭据提供正确的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 2015-11-17
      • 2017-02-04
      • 2013-09-23
      • 2014-09-16
      • 1970-01-01
      • 2020-10-30
      相关资源
      最近更新 更多