3rd Party Webhook - POST returns error

I have webhook set up via Realm, utilizing a 3rd Party, http, post.

The url performs as expected.
When I pass a query parameter in the payload from my 3rd party app, it’s logging the following error inside Realm logs, and a 404 from the endpoint calling the webhook.

“Error:
incoming webhook evaluation blocked by CanEvaluate”

I can see the query parameter being passed over the wire in the logging output provided by Realm.

Here’s the code:

exports = function(payload, response) {
  const reqCollection = "COLLECTION_NAME_HERE"; 
  const query = ({query:payload.query});

  return new Promise((resolve, reject) => {
    const doc = context.services.get("mongodb-atlas").db("DBNAME").collection(reqCollection);
    
    const data = doc.find(query).toArray()
    .then ((response) => {
      resolve (response); 
    })
  })
   
};

Hi @Erin_O_Neill,

Welcome to MongoDB community!

It seems that on your http service or webhook you have placed some code or condition in the can evaluate section
https://docs.mongodb.com/realm/services/configure/service-webhooks/#specify-an-authorization-expression

This section cannot be resolved to true therefore you fail.

Best
Pavel

That’s what I thought as well - it’s empty.
I also attempted an empty object only.

Is the condition set that once you add a configuration, and then remove it, the system inherits the expression, and another function must be created?

Hi @Erin_O_Neill,

Can you share the application link with me?

Have you sure all of your changes are “Reviewed and Deployed”?

Thanks
Pavel

Sure thing - I actually figured it out. Want to share this out to everyone - because there’s no examples in the POST of the need for this translation. There’s ref docs for an insert, but use cases for a POST and .find().toArray()…it’s Narnia.

Finally figured it out due to logging.

  • I could see the query object being passed over correctly in the logs (make sure to enable logging on the settings tab)
  • I added the following to the function inside of realm itself, so when I invoked the hook I’d have more information available. Mainly, when passing the query object - why was it failing in the function.
exports = function (payload, response) {
try { console.log('line 1' + EJSON.parse(payload.body))} catch (er) {}
try { console.log('line 2' + JSON.stringify(EJSON.parse(payload.body.text))} catch (er) {}
}

-this returned line 2 in the Realm logs and upon inspection this is what the body showed (hint - this is not what I sent as the query…or so I thought…)

"base64": "eyJBZGRpdGlvbmFsQXR0cmlidXRlMSI6IkJvbmZpcmUgQ2FubmFiaXMifQ==",
  • Used a base64 from a quick google search and presto - guess what that is - the query
  • the query was failing because it requires a translation for Realm, as the query syntax is { ‘thing1’: ‘query1’} and cannot translate for B64.
    -modifying the ream function to
    const query = EJSON.parse(payload.body.text())

Because this is a .find().toArray() webhook there’s no reason to translate the object back to B64 on the return trip to the endpoint.

2 Likes

This topic was automatically closed 5 days after the last reply. New replies are no longer allowed.