node.jsmailchimp

Execute OAuth2 with the Mailchimp API in NodeJS


I've been following MailChimp's OAuth2 tutorial (https://developer.mailchimp.com/documentation/mailchimp/guides/how-to-use-oauth2/) but got stuck when making a post request with the code and secret/key params. The closest I've gotten is a 400 Bad Request response. My code:

var args = {
headers: { "Content-Type": "application/json" },
body: "grant_type=authorization_code&client_id=" + client_id + "&client_secret=" + client_secret + "&redirect_uri=" + encoded_url + "&code=" + req.query.code,
url: "https://login.mailchimp.com/oauth2/token"
};
var r = request.post(args, function(err, req, body){
  console.log(err)
  console.log(req)
})

Solution

  • Okay, I was running in to the same thing, and finally found it. My code was very similar to yours:

    this.globals.request({
            method: "POST",
            uri: "https://login.mailchimp.com/oauth2/token",
            form:  {
                grant_type: "authorization_code",
                client_id: this.globals.mailchimp_client_id,
                client_secret: this.globals.mailchimp_client_secret,
                redirect_uri: encodeURIComponent(fullUrl),
                code: req.query.code
            }
        },
        function (error, response, body) {
            if (error || response.statusCode !== 200) {
                self.globals.logger.debug(self.moduleName, "getMailchimpToken", "Error " + response.statusCode + "(" + response.statusMessage + ") from mailchimp: " + error, true);
                body = {};
            }
            self.globals.logger.debug(self.moduleName, "getMailchimpToken", "got body: " + JSON.stringify(body), false);
            deferred.resolve(body);
    });
    

    The problem here, and I suspect with yours, is that you are using an encoded URL in the form data, but request will encode it again. When I looked at the querystring, I saw things like

    &redirect_uri=http%253A%252F%252F
    

    where the %s were being re-encoded. Changed encodeURIComponent(fullUrl), to just fullUrl, and it worked.

    One important note that was not clear to me - the redirect_uri should be the same one used in the OAuth call, including the path. Note that per the Mailchimp docs, you can vary the path in the actual call from the redirect_url used when registering the app, which is where this can be important.