Skip to content

Make requests from cloud code function as requesting user #1773

Closed
@JeremyPlease

Description

@JeremyPlease

Environment Setup

  • Server: v2.2.9, OSX, local
  • Database: mongodb 3, local

Steps to reproduce

  1. Create a class with CLP that only allows one role to create.
  2. Create a user and add to said role.
  3. Run cloud function that creates an object on the class.
  4. Get an error of {code: 119, message: "Permission denied for this action."}

If I use .save(null, { sessionToken: req.user.getSessionToken() }) then the save works, however I would like all saves and queries in cloud code functions to use the requesting users session.


A quick work around I've implemented is to override the Parse.Cloud.define function like so:
EDIT: Don't do this. It's bad. Technically this overrides the global Parse JS SDK REST request function on every cloud request. If multiple requests come in at the same time and then handle other requests in promises, the most recent session token will be used on all requests

var originalDefine = Parse.Cloud.define;

Parse.Cloud.define = function(name, originalFunction) {
  var newFunction = _generateFunction(name, originalFunction);
  originalDefine.apply(this, [name, newFunction]);
}

function _generateFunction(name, originalCloudFunction) {
  var newFunction = function(request, response) {
    // Override Parse RESTController request to set token
    var token = request.user.getSessionToken();
    var RESTController = Parse.CoreManager.getRESTController();
    var originalRequest = RESTController.request;
    RESTController.request = function() {
      var options = arguments[3] || {};
      options.sessionToken = token;
      return originalRequest.apply(this, arguments);
    }
    return originalCloudFunction.apply(this, arguments);
  };
  return newFunction;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions