user3215858
user3215858

Reputation: 29

AWS API Gatway (Proxy) with Lambda - Thworing internal server error

I am working on a custom auth solution, I backend is on NODE (lambda) and calling that lambda by API gateway (it's a post-call). For every thin is working fine if I use no-Proxy APIs, but in my case in need to pass custom additional headers. And when I tried with prox it is not responding. (it look like Cognito async call takes time or response is not resolving) I am not sure I am missing some configuration or something wrong with code (code is working fine individual lambda and with API without Proxy). here is my Lambda code.

// const AWS = require("aws-sdk");
// var crypto = require("crypto-js");
var CryptoJS = require("crypto-js");
var Crypto = require("crypto");

const { CognitoIdentityServiceProvider } = require("aws-sdk");

const hashSecret = (clientSecret, username, clientId) =>
  Crypto.createHmac("SHA256", clientSecret)
    .update(username + clientId)
    .digest("base64");

async function isUserValid() {
  const USER_POOL_ID = "poolid";
  const CLIENT_ID = "clidntID";
  const CLIENT_SECRET = "secreteCode";

  const Password = "userName";
  const Username = "password";

  const cognito = new CognitoIdentityServiceProvider({
    region: "ap-southeast-2",
  });

  try {
    const payload = {
      UserPoolId: USER_POOL_ID,
      AuthFlow: "ADMIN_NO_SRP_AUTH",
      ClientId: CLIENT_ID,
      AuthParameters: {
        USERNAME: "username",
        PASSWORD: "password",
        SECRET_HASH: hashSecret(CLIENT_SECRET, Username, CLIENT_ID),
      },
    };

    const response = await cognito.adminInitiateAuth(payload).promise();
    // // console.log("respone :", response)
    // console.log("before response node js lambda  ::: ")
    return response;
  } catch (e) {
    console.log("error : ", e.message);
  }
}

async function test() {
  return "test ";
}

exports.handler = async (event) => {
  // TODO implement

  console.log("event : ", event);
'

  const response = {
    statusCode: 200,
    headers: {
                    "Content-Type" : "application/json",
                    "Access-Control-Allow-Origin" : "*",
                    "X-Content-Type-Option" : "nosniff",
                    "Content-Security-Policy" :  "default-src self",
                    "X-frame-options" : "DENY",
                    "Cache-Control" : "max-age=86400",
                    "X-XSS-protection" : 0,
                    "X-rate-limit": 600,
                    "Strict-Transport-Security": "max-age=31536000; includeSubDomains",

                },
    // body: await test() // (this response is working fine
    body: await isUserValid(),
  };
  return response;
};

Errors when tested from API gateway with proxy setting on : { "message": "Internal server error" } Response Headers {"x-amzn-ErrorType":"InternalServerErrorException"}

I tried multiple options but nothing is working for me.

Upvotes: 1

Views: 653

Answers (1)

Alejandro Pinola
Alejandro Pinola

Reputation: 159

The 'body' property must be a JSON string.

await cognito.adminInitiateAuth(payload).promise() is returning an object. You need to JSON.stringify() that response. Be sure to take care of the error case , too.

Upvotes: 3

Related Questions