Skip to content

Commit d0d73dc

Browse files
feat: added contracts for cognito pre token generation v2_0 (#1656)
1 parent d77b8b3 commit d0d73dc

10 files changed

+353
-3
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
using System.Collections.Generic;
2+
using System.Runtime.Serialization;
3+
4+
namespace Amazon.Lambda.CognitoEvents
5+
{
6+
/// <summary>
7+
/// https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html
8+
/// </summary>
9+
[DataContract]
10+
public class AccessTokenGeneration
11+
{
12+
/// <summary>
13+
/// A map of one or more key-value pairs of claims to add or override. For group related claims, use
14+
/// groupOverrideDetails instead.
15+
/// </summary>
16+
[DataMember(Name = "claimsToAddOrOverride")]
17+
#if NETCOREAPP3_1_OR_GREATER
18+
[System.Text.Json.Serialization.JsonPropertyName("claimsToAddOrOverride")]
19+
# endif
20+
public Dictionary<string, string> ClaimsToAddOrOverride { get; set; } = new Dictionary<string, string>();
21+
22+
/// <summary>
23+
/// A list that contains claims to be suppressed from the identity token.
24+
/// </summary>
25+
[DataMember(Name = "claimsToSuppress")]
26+
#if NETCOREAPP3_1_OR_GREATER
27+
[System.Text.Json.Serialization.JsonPropertyName("claimsToSuppress")]
28+
# endif
29+
public List<string> ClaimsToSuppress { get; set; } = new List<string>();
30+
31+
/// <summary>
32+
/// A list of OAuth 2.0 scopes that you want to add to the scope claim in your user's access token. You can't
33+
/// add scope values that contain one or more blank-space characters.
34+
/// </summary>
35+
[DataMember(Name = "scopesToAdd")]
36+
#if NETCOREAPP3_1_OR_GREATER
37+
[System.Text.Json.Serialization.JsonPropertyName("scopesToAdd")]
38+
# endif
39+
public List<string> ScopesToAdd { get; set; } = new List<string>();
40+
41+
/// <summary>
42+
/// A list of OAuth 2.0 scopes that you want to remove from the scope claim in your user's access token.
43+
/// </summary>
44+
[DataMember(Name = "scopesToSuppress")]
45+
#if NETCOREAPP3_1_OR_GREATER
46+
[System.Text.Json.Serialization.JsonPropertyName("scopesToSuppress")]
47+
# endif
48+
public List<string> ScopesToSuppress { get; set; } = new List<string>();
49+
}
50+
}

Libraries/src/Amazon.Lambda.CognitoEvents/Amazon.Lambda.CognitoEvents.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<Description>Amazon Lambda .NET Core support - CognitoEvents package.</Description>
77
<TargetFrameworks>netstandard2.0;netcoreapp3.1;net8.0</TargetFrameworks>
88
<AssemblyTitle>Amazon.Lambda.CognitoEvents</AssemblyTitle>
9-
<VersionPrefix>2.2.0</VersionPrefix>
9+
<VersionPrefix>2.3.0</VersionPrefix>
1010
<AssemblyName>Amazon.Lambda.CognitoEvents</AssemblyName>
1111
<PackageId>Amazon.Lambda.CognitoEvents</PackageId>
1212
<PackageTags>AWS;Amazon;Lambda</PackageTags>
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System.Runtime.Serialization;
2+
3+
namespace Amazon.Lambda.CognitoEvents
4+
{
5+
/// <summary>
6+
/// https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html
7+
/// </summary>
8+
[DataContract]
9+
public class ClaimsAndScopeOverrideDetails
10+
{
11+
/// <summary>
12+
/// The claims that you want to override, add, or suppress in your user’s ID token.
13+
/// </summary>
14+
[DataMember(Name = "idTokenGeneration")]
15+
#if NETCOREAPP3_1_OR_GREATER
16+
[System.Text.Json.Serialization.JsonPropertyName("idTokenGeneration")]
17+
# endif
18+
public IdTokenGeneration IdTokenGeneration { get; set; } = new IdTokenGeneration();
19+
20+
/// <summary>
21+
/// The claims and scopes that you want to override, add, or suppress in your user’s access token.
22+
/// </summary>
23+
[DataMember(Name = "accessTokenGeneration")]
24+
#if NETCOREAPP3_1_OR_GREATER
25+
[System.Text.Json.Serialization.JsonPropertyName("accessTokenGeneration")]
26+
# endif
27+
public AccessTokenGeneration AccessTokenGeneration { get; set; } = new AccessTokenGeneration();
28+
29+
/// <summary>
30+
/// The output object containing the current group configuration. It includes groupsToOverride, iamRolesToOverride, and preferredRole.
31+
/// </summary>
32+
[DataMember(Name = "groupOverrideDetails")]
33+
#if NETCOREAPP3_1_OR_GREATER
34+
[System.Text.Json.Serialization.JsonPropertyName("groupOverrideDetails")]
35+
# endif
36+
public GroupConfiguration GroupOverrideDetails { get; set; } = new GroupConfiguration();
37+
}
38+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace Amazon.Lambda.CognitoEvents
2+
{
3+
/// <summary>
4+
/// https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html
5+
/// </summary>
6+
public class CognitoPreTokenGenerationV2Event : CognitoTriggerEvent<CognitoPreTokenGenerationV2Request, CognitoPreTokenGenerationV2Response>
7+
{
8+
}
9+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System.Collections.Generic;
2+
using System.Runtime.Serialization;
3+
4+
namespace Amazon.Lambda.CognitoEvents
5+
{
6+
/// <summary>
7+
/// https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html
8+
/// </summary>
9+
public class CognitoPreTokenGenerationV2Request : CognitoTriggerRequest
10+
{
11+
/// <summary>
12+
/// The input object containing the current group configuration. It includes groupsToOverride, iamRolesToOverride, and preferredRole.
13+
/// </summary>
14+
[DataMember(Name = "groupConfiguration")]
15+
#if NETCOREAPP3_1_OR_GREATER
16+
[System.Text.Json.Serialization.JsonPropertyName("groupConfiguration")]
17+
# endif
18+
public GroupConfiguration GroupConfiguration { get; set; } = new GroupConfiguration();
19+
20+
/// <summary>
21+
/// One or more key-value pairs that you can provide as custom input to the Lambda function that you specify for the pre sign-up trigger. You can pass this data to your Lambda function by using the ClientMetadata parameter in the following API actions: AdminVerifyUser, AdminRespondToAuthChallenge, ForgotPassword, and SignUp.
22+
/// </summary>
23+
[DataMember(Name = "clientMetadata")]
24+
#if NETCOREAPP3_1_OR_GREATER
25+
[System.Text.Json.Serialization.JsonPropertyName("clientMetadata")]
26+
# endif
27+
public Dictionary<string, string> ClientMetadata { get; set; } = new Dictionary<string, string>();
28+
29+
/// <summary>
30+
/// A list that contains the OAuth 2.0 user scopes.
31+
/// </summary>
32+
[DataMember(Name = "scopes")]
33+
#if NETCOREAPP3_1_OR_GREATER
34+
[System.Text.Json.Serialization.JsonPropertyName("scopes")]
35+
# endif
36+
public List<string> Scopes { get; set; } = new List<string>();
37+
}
38+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System.Runtime.Serialization;
2+
3+
namespace Amazon.Lambda.CognitoEvents
4+
{
5+
/// <summary>
6+
/// https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html
7+
/// </summary>
8+
public class CognitoPreTokenGenerationV2Response : CognitoTriggerResponse
9+
{
10+
/// <summary>
11+
/// A container for all elements in a V2_0 trigger event.
12+
/// </summary>
13+
[DataMember(Name = "claimsAndScopeOverrideDetails")]
14+
#if NETCOREAPP3_1_OR_GREATER
15+
[System.Text.Json.Serialization.JsonPropertyName("claimsAndScopeOverrideDetails")]
16+
# endif
17+
public ClaimsAndScopeOverrideDetails ClaimsAndScopeOverrideDetails { get; set; } = new ClaimsAndScopeOverrideDetails();
18+
}
19+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System.Collections.Generic;
2+
using System.Runtime.Serialization;
3+
4+
namespace Amazon.Lambda.CognitoEvents
5+
{
6+
/// <summary>
7+
/// https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html
8+
/// </summary>
9+
[DataContract]
10+
public class IdTokenGeneration
11+
{
12+
/// <summary>
13+
/// A map of one or more key-value pairs of claims to add or override. For group related claims, use groupOverrideDetails instead.
14+
/// </summary>
15+
[DataMember(Name = "claimsToAddOrOverride")]
16+
#if NETCOREAPP3_1_OR_GREATER
17+
[System.Text.Json.Serialization.JsonPropertyName("claimsToAddOrOverride")]
18+
# endif
19+
public Dictionary<string, string> ClaimsToAddOrOverride { get; set; } = new Dictionary<string, string>();
20+
21+
/// <summary>
22+
/// A list that contains claims to be suppressed from the identity token.
23+
/// </summary>
24+
[DataMember(Name = "claimsToSuppress")]
25+
#if NETCOREAPP3_1_OR_GREATER
26+
[System.Text.Json.Serialization.JsonPropertyName("claimsToSuppress")]
27+
# endif
28+
public List<string> ClaimsToSuppress { get; set; } = new List<string>();
29+
}
30+
}

Libraries/test/EventsTests.Shared/EventTests.cs

Lines changed: 88 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,6 +1069,92 @@ public void CognitoPreTokenGenerationEventTest(Type serializerType)
10691069
}
10701070
}
10711071

1072+
[Theory]
1073+
[InlineData(typeof(JsonSerializer))]
1074+
#if NETCOREAPP3_1_OR_GREATER
1075+
[InlineData(typeof(Amazon.Lambda.Serialization.SystemTextJson.LambdaJsonSerializer))]
1076+
[InlineData(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
1077+
#endif
1078+
public void CognitoPreTokenGenerationV2EventTest(Type serializerType)
1079+
{
1080+
var serializer = Activator.CreateInstance(serializerType) as ILambdaSerializer;
1081+
using (var fileStream = LoadJsonTestFile("cognito-pretokengenerationv2-event.json"))
1082+
{
1083+
var cognitoPreTokenGenerationV2Event = serializer.Deserialize<CognitoPreTokenGenerationV2Event>(fileStream);
1084+
1085+
AssertBaseClass(cognitoPreTokenGenerationV2Event, eventVersion: "2");
1086+
1087+
Assert.Equal(2, cognitoPreTokenGenerationV2Event.Request.GroupConfiguration.GroupsToOverride.Count);
1088+
Assert.Equal("group1", cognitoPreTokenGenerationV2Event.Request.GroupConfiguration.GroupsToOverride[0]);
1089+
Assert.Equal("group2", cognitoPreTokenGenerationV2Event.Request.GroupConfiguration.GroupsToOverride[1]);
1090+
1091+
Assert.Equal(2, cognitoPreTokenGenerationV2Event.Request.GroupConfiguration.IamRolesToOverride.Count);
1092+
Assert.Equal("role1", cognitoPreTokenGenerationV2Event.Request.GroupConfiguration.IamRolesToOverride[0]);
1093+
Assert.Equal("role2", cognitoPreTokenGenerationV2Event.Request.GroupConfiguration.IamRolesToOverride[1]);
1094+
1095+
Assert.Equal("role", cognitoPreTokenGenerationV2Event.Request.GroupConfiguration.PreferredRole);
1096+
1097+
Assert.Equal(2, cognitoPreTokenGenerationV2Event.Request.ClientMetadata.Count);
1098+
Assert.Equal("metadata_1", cognitoPreTokenGenerationV2Event.Request.ClientMetadata.ToArray()[0].Key);
1099+
Assert.Equal("metadata_value_1", cognitoPreTokenGenerationV2Event.Request.ClientMetadata.ToArray()[0].Value);
1100+
Assert.Equal("metadata_2", cognitoPreTokenGenerationV2Event.Request.ClientMetadata.ToArray()[1].Key);
1101+
Assert.Equal("metadata_value_2", cognitoPreTokenGenerationV2Event.Request.ClientMetadata.ToArray()[1].Value);
1102+
1103+
Assert.Equal(2, cognitoPreTokenGenerationV2Event.Request.UserAttributes.Count);
1104+
Assert.Equal("attribute_1", cognitoPreTokenGenerationV2Event.Request.UserAttributes.ToArray()[0].Key);
1105+
Assert.Equal("attribute_value_1", cognitoPreTokenGenerationV2Event.Request.UserAttributes.ToArray()[0].Value);
1106+
Assert.Equal("attribute_2", cognitoPreTokenGenerationV2Event.Request.UserAttributes.ToArray()[1].Key);
1107+
Assert.Equal("attribute_value_2", cognitoPreTokenGenerationV2Event.Request.UserAttributes.ToArray()[1].Value);
1108+
1109+
Assert.Equal(2, cognitoPreTokenGenerationV2Event.Request.Scopes.Count);
1110+
Assert.Equal("scope_1", cognitoPreTokenGenerationV2Event.Request.Scopes.ToArray()[0]);
1111+
Assert.Equal("scope_2", cognitoPreTokenGenerationV2Event.Request.Scopes.ToArray()[1]);
1112+
1113+
Assert.Equal(2, cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.IdTokenGeneration.ClaimsToAddOrOverride.Count);
1114+
Assert.Equal("claim_1", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.IdTokenGeneration.ClaimsToAddOrOverride.ToArray()[0].Key);
1115+
Assert.Equal("claim_1_value_1", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.IdTokenGeneration.ClaimsToAddOrOverride.ToArray()[0].Value);
1116+
Assert.Equal("claim_2", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.IdTokenGeneration.ClaimsToAddOrOverride.ToArray()[1].Key);
1117+
Assert.Equal("claim_1_value_2", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.IdTokenGeneration.ClaimsToAddOrOverride.ToArray()[1].Value);
1118+
Assert.Equal(2, cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.IdTokenGeneration.ClaimsToSuppress.Count);
1119+
Assert.Equal("suppress1", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.IdTokenGeneration.ClaimsToSuppress[0]);
1120+
Assert.Equal("suppress2", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.IdTokenGeneration.ClaimsToSuppress[1]);
1121+
1122+
Assert.Equal(2, cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.AccessTokenGeneration.ClaimsToAddOrOverride.Count);
1123+
Assert.Equal("claim_1", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.AccessTokenGeneration.ClaimsToAddOrOverride.ToArray()[0].Key);
1124+
Assert.Equal("claim_1_value_1", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.AccessTokenGeneration.ClaimsToAddOrOverride.ToArray()[0].Value);
1125+
Assert.Equal("claim_2", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.AccessTokenGeneration.ClaimsToAddOrOverride.ToArray()[1].Key);
1126+
Assert.Equal("claim_1_value_2", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.AccessTokenGeneration.ClaimsToAddOrOverride.ToArray()[1].Value);
1127+
Assert.Equal(2, cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.AccessTokenGeneration.ClaimsToSuppress.Count);
1128+
Assert.Equal("suppress1", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.AccessTokenGeneration.ClaimsToSuppress[0]);
1129+
Assert.Equal("suppress2", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.AccessTokenGeneration.ClaimsToSuppress[1]);
1130+
Assert.Equal(2, cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.AccessTokenGeneration.ScopesToAdd.Count);
1131+
Assert.Equal("add1", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.AccessTokenGeneration.ScopesToAdd[0]);
1132+
Assert.Equal("add2", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.AccessTokenGeneration.ScopesToAdd[1]);
1133+
Assert.Equal(2, cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.AccessTokenGeneration.ScopesToSuppress.Count);
1134+
Assert.Equal("suppress1", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.AccessTokenGeneration.ScopesToSuppress[0]);
1135+
Assert.Equal("suppress2", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.AccessTokenGeneration.ScopesToSuppress[1]);
1136+
1137+
Assert.Equal(2, cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.GroupOverrideDetails.GroupsToOverride.Count);
1138+
Assert.Equal("group1", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.GroupOverrideDetails.GroupsToOverride[0]);
1139+
Assert.Equal("group2", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.GroupOverrideDetails.GroupsToOverride[1]);
1140+
1141+
Assert.Equal(2, cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.GroupOverrideDetails.IamRolesToOverride.Count);
1142+
Assert.Equal("role1", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.GroupOverrideDetails.IamRolesToOverride[0]);
1143+
Assert.Equal("role2", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.GroupOverrideDetails.IamRolesToOverride[1]);
1144+
1145+
Assert.Equal("role", cognitoPreTokenGenerationV2Event.Response.ClaimsAndScopeOverrideDetails.GroupOverrideDetails.PreferredRole);
1146+
1147+
MemoryStream ms = new MemoryStream();
1148+
serializer.Serialize<CognitoPreTokenGenerationV2Event>(cognitoPreTokenGenerationV2Event, ms);
1149+
ms.Position = 0;
1150+
var json = new StreamReader(ms).ReadToEnd();
1151+
1152+
var original = JObject.Parse(File.ReadAllText("cognito-pretokengenerationv2-event.json"));
1153+
var serialized = JObject.Parse(json);
1154+
Assert.True(JToken.DeepEquals(serialized, original), "Serialized object is not the same as the original JSON");
1155+
}
1156+
}
1157+
10721158
[Theory]
10731159
[InlineData(typeof(JsonSerializer))]
10741160
#if NETCOREAPP3_1_OR_GREATER
@@ -1223,11 +1309,11 @@ public void CognitoCustomSmsSenderEventTest(Type serializerType)
12231309
}
12241310
}
12251311

1226-
private static void AssertBaseClass<TRequest, TResponse>(CognitoTriggerEvent<TRequest, TResponse> cognitoTriggerEvent)
1312+
private static void AssertBaseClass<TRequest, TResponse>(CognitoTriggerEvent<TRequest, TResponse> cognitoTriggerEvent, string eventVersion = "1")
12271313
where TRequest : CognitoTriggerRequest, new()
12281314
where TResponse : CognitoTriggerResponse, new()
12291315
{
1230-
Assert.Equal("1", cognitoTriggerEvent.Version);
1316+
Assert.Equal(eventVersion, cognitoTriggerEvent.Version);
12311317
Assert.Equal("us-east-1", cognitoTriggerEvent.Region);
12321318
Assert.Equal("us-east-1_id", cognitoTriggerEvent.UserPoolId);
12331319
Assert.Equal("username_uuid", cognitoTriggerEvent.UserName);

Libraries/test/EventsTests.Shared/EventsTests.Shared.projitems

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<Content Include="$(MSBuildThisFileDirectory)cognito-custommessage-event.json" />
2020
<Content Include="$(MSBuildThisFileDirectory)cognito-migrateuser-event.json" />
2121
<Content Include="$(MSBuildThisFileDirectory)cognito-pretokengeneration-event.json" />
22+
<Content Include="$(MSBuildThisFileDirectory)cognito-pretokengenerationv2-event.json" />
2223
<Content Include="$(MSBuildThisFileDirectory)cognito-verifyauthchallenge-event.json" />
2324
<Content Include="$(MSBuildThisFileDirectory)cognito-postconfirmation-event.json" />
2425
<Content Include="$(MSBuildThisFileDirectory)cognito-postauthentication-event.json" />

0 commit comments

Comments
 (0)