node.jssendgridsendgrid-api-v3

SendGrid API 400


I'm trying to follow SendGrid's integration here with no luck. Currently I'm trying to send an email on login (just so I have a quick way to test it), and I keep getting 400 Bad Request as a response. I've console logged out process.env.SENDGRID_API_KEY to make sure that the key is correct, and I know that's not the problem. It's also been set to full access.

The full error message:

ResponseError: Bad Request
    at C:\Code\Recipe Book\node_modules\@sendgrid\client\src\classes\client.js:146:29
    at processTicksAndRejections (internal/process/task_queues.js:93:5) {
  code: 400,
  response: {
    headers: {
      server: 'nginx',
      date: 'Wed, 28 Jul 2021 17:52:10 GMT',
      'content-type': 'application/json',
      'content-length': '185',
      connection: 'close',
      'access-control-allow-origin': 'https://sendgrid.api-docs.io',
      'access-control-allow-methods': 'POST',
      'access-control-allow-headers': 'Authorization, Content-Type, On-behalf-of, x-sg-elas-acl',
      'access-control-max-age': '600',
      'x-no-cors-reason': 'https://sendgrid.com/docs/Classroom/Basics/API/cors.html',
      'strict-transport-security': 'max-age=600; includeSubDomains'
    },
    body: { errors: [Array] }
  }
}

I don't think it's a classic CORS error, as in my server.js I have this: (unless I'm missing something here)

app.use((req, res, next) => {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept, Authorization"
  );
  res.setHeader(
    "Access-Control-Allow-Methods",
    "GET, POST, PATCH, PUT, DELETE, OPTIONS"
  );
  next();
});

I've tried adding in On-behalf-of, x-sg-elas-acl to the allowed headers, which didn't change the outcome. Should those be included?

It also seems to arbitrarily switch between 400 and 401 and I honestly don't know why. Here's the 401 message:

ResponseError: Unauthorized
    at C:\Code\Recipe Book\node_modules\@sendgrid\client\src\classes\client.js:146:29
    at processTicksAndRejections (internal/process/task_queues.js:93:5) {
  code: 401,
  response: {
    headers: {
      server: 'nginx',
      date: 'Wed, 28 Jul 2021 18:04:59 GMT',
      'content-type': 'application/json',
      'content-length': '97',
      connection: 'close',
      'access-control-allow-origin': 'https://sendgrid.api-docs.io',
      'access-control-allow-methods': 'POST',
      'access-control-allow-headers': 'Authorization, Content-Type, On-behalf-of, x-sg-elas-acl',
      'access-control-max-age': '600',
      'x-no-cors-reason': 'https://sendgrid.com/docs/Classroom/Basics/API/cors.html',
      'strict-transport-security': 'max-age=600; includeSubDomains'
    },
    body: { errors: [Array] }
  }
}

When I set up sender authentication, I authenticated a domain instead of a single sender, although I'm still testing this in the dev environment and am not on my domain when attempting to send an email. Could that be causing an issue as well?

Could the issue also be that I'm testing on localhost and the sendgrid IP access management is allowing my current IP but not localhost access? Though I'm not so sure adding localhost as an allowed IP is such a good idea.


Solution

  • Turns out the issue was I was setting the email's from field to something that didn't match my domain authenticated sender. Changing that to the right @ fixed the issue, and the email sent without a problem.