gpt4 book ai didi

c# - 在 DotNet 中创建 AWS Cognito PreSignup Lambda

转载 作者:太空狗 更新时间:2023-10-29 22:21:28 25 4
gpt4 key购买 nike

使用 .Net Core 1.0 Lambda,我希望能够创建一个 Lambda 函数来处理来自 AWS Cognito 用户池的 PreSignUp 触发器。

using Amazon.Lambda.Core;

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

public class PreSignUp_SignUp
{
public string userPoolId { get; set; }
public const string EmailKey = "email";
public const string PhoneNumber = "phone_number";
public Dictionary<string,string> userAttributes { get; set; }
public Dictionary<string, string> validationData { get; set; }
}

public class PreSignup_SignUpResponse
{
public bool autoConfirmUser { get; set; }
}

public class Function
{
public PreSignup_SignUpResponse FunctionHandler(PreSignUp_SignUp input, ILambdaContext context)
{
return new PreSignup_SignUpResponse { autoConfirmUser = true };
}
}

虽然请求成功并在使用示例请求调用 Lambda 时返回响应:

{
"datasetName": "datasetName",
"eventType": "SyncTrigger",
"region": "us-east-1",
"identityId": "identityId",
"datasetRecords": {
"SampleKey2": {
"newValue": "newValue2",
"oldValue": "oldValue2",
"op": "replace"
},
"SampleKey1": {
"newValue": "newValue1",
"oldValue": "oldValue1",
"op": "replace"
}
},
"identityPoolId": "identityPoolId",
"version": 2
}

当通过 .Net AmazonCognitoIdentityProviderClient 执行实际注册时,我返回错误:

Amazon.CognitoIdentityProvider.Model.InvalidLambdaResponseException : Unrecognizable lambda output

我猜这意味着我没有得到正确的响应(甚至可能是请求)的形状。

有人有适用于 AWS Cognito 中的 PreSignUp 触发器的 .Net Lambda 函数示例吗?

最佳答案

Cognito 触发器请求/响应必须包含 Cognito 触发器文档中指定的整个有效负载:

http://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html

我发现在诊断这个问题时最好的起点是创建一个函数处理程序,它接受一个 JObject 然后记录并返回相同的对象,例如

public JObject FunctionHandler(JObject input, ILambdaContext context)
{
context.Logger.LogLine("Input was: " + input);
return input;
}

这会捕获 cloudwatch 日志中的有效负载,然后帮助您转向所需的强类型结构。

在我的 PreSignUp 案例中,我最终创建了以下类型来实现一个简单的功能,该功能可以自动验证所有提供的凭据。

public abstract class AbstractTriggerRequest
{
[JsonProperty("userAttributes")]
public Dictionary<string, string> UserAttributes { get; set; }
}

public abstract class AbstractTriggerResponse
{
}

public class TriggerCallerContext
{
[JsonProperty("awsSdkVersion")]
public string AwsSdkVersion { get; set; }
[JsonProperty("clientId")]
public string ClientId { get; set; }
}

public abstract class AbstractTriggerBase<TRequest, TResponse>
where TRequest: AbstractTriggerRequest
where TResponse: AbstractTriggerResponse
{
[JsonProperty("version")]
public int Version { get; set; }
[JsonProperty("triggerSource")]
public string TriggerSource { get; set; }
[JsonProperty("region")]
public string Region { get; set; }
[JsonProperty("userPoolId")]
public string UserPoolId { get; set; }
[JsonProperty("callerContext")]
public TriggerCallerContext CallerContext { get; set; }
[JsonProperty("request")]
public TRequest Request { get; set; }
[JsonProperty("response")]
public TResponse Response { get; set; }
[JsonProperty("userName", NullValueHandling = NullValueHandling.Ignore)]
public string UserName { get; set; }
}

public class PreSignUpSignUpRequest : AbstractTriggerRequest
{
[JsonProperty("validationData")]
public Dictionary<string,string> ValidationData { get; set; }
}

Lambda 函数然后以以下签名结束:

public class Function
{
public PreSignUp_SignUp FunctionHandler(PreSignUp_SignUp input, ILambdaContext context)
{
context.Logger.LogLine("Auto-confirming everything!");

input.Response = new PreSignUpSignUpResponse {
AutoConfirmUser = true,
// you can only auto-verify email or phone if it's present in the user attributes
AutoVerifyEmail = input.Request.UserAttributes.ContainsKey("email"),
AutoVerifyPhone = input.Request.UserAttributes.ContainsKey("phone_number")
};

return input;
}
}

希望这可以帮助其他任何在为 Cognito 编写 Lambda 触发器时遇到问题的人。

关于c# - 在 DotNet 中创建 AWS Cognito PreSignup Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44147079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com