Mikołaj Waśniewski
Mikołaj Waśniewski

Reputation: 1496

Cognito triggers in C#

I have not found any code examples how to write Cognito trigger in C#. I am particularly interested in pre authentication trigger.

Right now I have the following Lambda function which is set as a pre authentication trigger in Cognito:

    public APIGatewayProxyResponse ExampleTrigger(APIGatewayProxyRequest request, ILambdaContext context)
    {
        context.Logger.LogLine("trigger called");
        return new APIGatewayProxyResponse
        {
          StatusCode = (int)HttpStatusCode.OK
        };
    }

However, I receive this error:

{code: "InvalidLambdaResponseException", name: "InvalidLambdaResponseException", message: "Unrecognizable lambda output"}

I think this error is caused because the type APIGatewayProxyResponse is not correct. But what is the correct type?

Upvotes: 0

Views: 719

Answers (1)

Sampath Dilhan
Sampath Dilhan

Reputation: 825

According to the documentation, handler should expect an object, which represents the following JSON ( including common parameters) :

{
    "version": "string",
    "triggerSource": "string",
    "region": "string",
    "userPoolId": "string",
    "userName": "string",
    "callerContext": {
            "awsSdkVersion": "string",
            "clientId": "string"
        },
    "request": {
        "userAttributes": {
            "string": "string",
            . . .
        },
        "validationData": {
            "string": "string",
            . . .
        },
        "userNotFound": boolean
    },
    "response": {}
}

Also lambda handler should return the same type of object.

Since you are working with C#, probably you can use following classes to deserialize the object. So instead of both APIGatewayProxyRequest and APIGatewayProxyResponse, please use below mentioned Event Type.

    public class Event
    {
        [JsonPropertyName("version")]
        public string Version { get; set; }

        [JsonPropertyName("region")]
        public string Region { get; set; }

        [JsonPropertyName("userPoolId")]
        public string UserPoolId { get; set; }

        [JsonPropertyName("userName")]
        public string UserName { get; set; }

        [JsonPropertyName("callerContext")]
        public CallerContext CallerContext { get; set; }

        [JsonPropertyName("triggerSource")]
        public string TriggerSource { get; set; }

        [JsonPropertyName("request")]
        public Request Request { get; set; }

        [JsonPropertyName("response")]
        public Response Response { get; set; }
    }

    public class CallerContext
    {
        [JsonPropertyName("awsSdkVersion")]
        public string AwsSdkVersion { get; set; }

        [JsonPropertyName("clientId")]
        public string ClientId { get; set; }
    }

    public class Request
    {
        [JsonPropertyName("userAttributes")]
        public Dictionary<string, string> UserAttributes { get; set; }
        
        [JsonPropertyName("validationData")]
        public Dictionary<string, string> validationData { get; set; }
    }

    public class Response
    {
    }

Let me mention a tip for this kind of scenarios:

  1. Write the handler as:
    public dynamic ExampleTrigger(dynamic request, ILambdaContext context)
    {
        return request
    }
  1. Add the following environment variable for lambda. LAMBDA_NET_SERIALIZER_DEBUG = true

  2. Invoke the Auth flow and check the logs on CloudWatch. You can see the content of the incoming event object.

Upvotes: 1

Related Questions