Skip to content

Commit 0868993

Browse files
feat(parser): Added Cognito trigger schemas (#6737)
* feat(parser): Added Cognito trigger schemas * Updated docs * Fix Ruff problems * Fix implementation and tests * Fix implementation and tests * Fix implementation and tests * Fix docs --------- Co-authored-by: Leandro Damascena <[email protected]>
1 parent 98a5af7 commit 0868993

File tree

11 files changed

+329
-7
lines changed

11 files changed

+329
-7
lines changed

.github/workflows/quality_check.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,6 @@ jobs:
7979
uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # 5.4.3
8080
with:
8181
token: ${{ secrets.CODECOV_TOKEN }}
82-
file: ./coverage.xml
82+
files: ./coverage.xml
8383
env_vars: PYTHON
8484
name: aws-lambda-powertools-python-codecov

aws_lambda_powertools/utilities/parser/models/__init__.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,21 @@
5050
CloudWatchLogsLogEvent,
5151
CloudWatchLogsModel,
5252
)
53+
from .cognito import (
54+
CognitoCreateAuthChallengeTriggerModel,
55+
CognitoCustomEmailSenderTriggerModel,
56+
CognitoCustomMessageTriggerModel,
57+
CognitoCustomSMSSenderTriggerModel,
58+
CognitoDefineAuthChallengeTriggerModel,
59+
CognitoMigrateUserTriggerModel,
60+
CognitoPostAuthenticationTriggerModel,
61+
CognitoPostConfirmationTriggerModel,
62+
CognitoPreAuthenticationTriggerModel,
63+
CognitoPreSignupTriggerModel,
64+
CognitoPreTokenGenerationTriggerModelV1,
65+
CognitoPreTokenGenerationTriggerModelV2AndV3,
66+
CognitoVerifyAuthChallengeTriggerModel,
67+
)
5368
from .dynamodb import (
5469
DynamoDBStreamChangedRecordModel,
5570
DynamoDBStreamModel,
@@ -138,6 +153,19 @@
138153
"CloudWatchLogsDecode",
139154
"CloudWatchLogsLogEvent",
140155
"CloudWatchLogsModel",
156+
"CognitoPreSignupTriggerModel",
157+
"CognitoPostConfirmationTriggerModel",
158+
"CognitoPreAuthenticationTriggerModel",
159+
"CognitoPostAuthenticationTriggerModel",
160+
"CognitoMigrateUserTriggerModel",
161+
"CognitoCustomMessageTriggerModel",
162+
"CognitoCustomEmailSenderTriggerModel",
163+
"CognitoCustomSMSSenderTriggerModel",
164+
"CognitoDefineAuthChallengeTriggerModel",
165+
"CognitoCreateAuthChallengeTriggerModel",
166+
"CognitoVerifyAuthChallengeTriggerModel",
167+
"CognitoPreTokenGenerationTriggerModelV1",
168+
"CognitoPreTokenGenerationTriggerModelV2AndV3",
141169
"AlbModel",
142170
"AlbRequestContext",
143171
"AlbRequestContextData",
Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
from typing import Any, Dict, List, Literal, Optional
2+
3+
from pydantic import BaseModel
4+
5+
6+
# Common context model for Cognito triggers
7+
class CognitoCallerContextModel(BaseModel):
8+
awsSdkVersion: str
9+
clientId: str
10+
11+
12+
# Base model for all Cognito triggers
13+
class CognitoTriggerBaseSchema(BaseModel):
14+
version: str
15+
region: str
16+
userPoolId: str
17+
userName: Optional[str] = None
18+
callerContext: CognitoCallerContextModel
19+
20+
21+
# Models for Pre-Signup flow
22+
class CognitoPreSignupRequestModel(BaseModel):
23+
userAttributes: Dict[str, Any]
24+
validationData: Optional[Dict[str, Any]] = None
25+
clientMetadata: Optional[Dict[str, Any]] = None
26+
userNotFound: Optional[bool] = None
27+
28+
29+
class CognitoPreSignupResponseModel(BaseModel):
30+
autoConfirmUser: Optional[bool] = False
31+
autoVerifyPhone: Optional[bool] = False
32+
autoVerifyEmail: Optional[bool] = False
33+
34+
35+
class CognitoPreSignupTriggerModel(CognitoTriggerBaseSchema):
36+
triggerSource: Literal["PreSignUp_SignUp"]
37+
request: CognitoPreSignupRequestModel
38+
response: CognitoPreSignupResponseModel
39+
40+
41+
# Models for Post-Confirmation flow
42+
class CognitoPostConfirmationRequestModel(BaseModel):
43+
userAttributes: Dict[str, Any]
44+
clientMetadata: Optional[Dict[str, Any]] = None
45+
46+
47+
class CognitoPostConfirmationTriggerModel(CognitoTriggerBaseSchema):
48+
triggerSource: Literal["PostConfirmation_ConfirmSignUp"]
49+
request: CognitoPostConfirmationRequestModel
50+
response: Dict[str, Any] = {}
51+
52+
53+
# Models for Pre-Authentication flow
54+
class CognitoPreAuthenticationRequestModel(BaseModel):
55+
userAttributes: Dict[str, Any]
56+
validationData: Optional[Dict[str, Any]] = None
57+
userNotFound: Optional[bool] = None
58+
59+
60+
class CognitoPreAuthenticationTriggerModel(CognitoTriggerBaseSchema):
61+
triggerSource: Literal["PreAuthentication_Authentication"]
62+
request: CognitoPreAuthenticationRequestModel
63+
response: Dict[str, Any] = {}
64+
65+
66+
# Models for Post-Authentication flow
67+
class CognitoPostAuthenticationRequestModel(BaseModel):
68+
userAttributes: Dict[str, Any]
69+
newDeviceUsed: Optional[bool] = None
70+
clientMetadata: Optional[Dict[str, Any]] = None
71+
72+
73+
class CognitoPostAuthenticationTriggerModel(CognitoTriggerBaseSchema):
74+
triggerSource: Literal["PostAuthentication_Authentication"]
75+
request: CognitoPostAuthenticationRequestModel
76+
response: Dict[str, Any] = {}
77+
78+
79+
# Models for Pre-Token Generation flow
80+
class CognitoGroupConfigurationModel(BaseModel):
81+
groupsToOverride: List[str]
82+
iamRolesToOverride: List[str]
83+
preferredRole: Optional[str] = None
84+
85+
86+
class CognitoPreTokenGenerationRequestModel(BaseModel):
87+
userAttributes: Dict[str, Any]
88+
groupConfiguration: CognitoGroupConfigurationModel
89+
clientMetadata: Optional[Dict[str, Any]] = None
90+
91+
92+
class CognitoPreTokenGenerationTriggerModelV1(CognitoTriggerBaseSchema):
93+
triggerSource: str
94+
request: CognitoPreTokenGenerationRequestModel
95+
response: Dict[str, Any] = {}
96+
97+
98+
class CognitoPreTokenGenerationRequestModelV2AndV3(CognitoPreTokenGenerationRequestModel):
99+
scopes: Optional[Dict[str, Any]] = None
100+
101+
102+
class CognitoPreTokenGenerationTriggerModelV2AndV3(CognitoTriggerBaseSchema):
103+
request: CognitoPreTokenGenerationRequestModelV2AndV3
104+
response: Dict[str, Any] = {}
105+
106+
107+
# Models for User Migration flow
108+
class CognitoMigrateUserRequestModel(BaseModel):
109+
password: str
110+
validationData: Optional[Dict[str, Any]] = None
111+
clientMetadata: Optional[Dict[str, Any]] = None
112+
113+
114+
class CognitoMigrateUserResponseModel(BaseModel):
115+
userAttributes: Optional[Dict[str, Any]] = None
116+
finalUserStatus: Optional[str] = None
117+
messageAction: Optional[str] = None
118+
desiredDeliveryMediums: Optional[List[str]] = None
119+
forceAliasCreation: Optional[bool] = None
120+
enableSMSMFA: Optional[bool] = None
121+
122+
123+
class CognitoMigrateUserTriggerModel(CognitoTriggerBaseSchema):
124+
triggerSource: str
125+
userName: str
126+
request: CognitoMigrateUserRequestModel
127+
response: CognitoMigrateUserResponseModel
128+
129+
130+
# Models for Custom Message flow
131+
class CognitoCustomMessageRequestModel(BaseModel):
132+
userAttributes: Dict[str, Any]
133+
codeParameter: str
134+
linkParameter: Optional[str] = None
135+
usernameParameter: Optional[str] = None
136+
clientMetadata: Optional[Dict[str, Any]] = None
137+
138+
139+
class CognitoCustomMessageResponseModel(BaseModel):
140+
smsMessage: Optional[str] = None
141+
emailMessage: Optional[str] = None
142+
emailSubject: Optional[str] = None
143+
144+
145+
class CognitoCustomMessageTriggerModel(CognitoTriggerBaseSchema):
146+
triggerSource: str
147+
request: CognitoCustomMessageRequestModel
148+
response: CognitoCustomMessageResponseModel
149+
150+
151+
# Models for Custom Email/SMS Sender flow
152+
class CognitoCustomEmailSMSSenderRequestModel(BaseModel):
153+
type: str
154+
code: str
155+
clientMetadata: Optional[Dict[str, Any]] = None
156+
userAttributes: Dict[str, Any]
157+
158+
159+
class CognitoCustomEmailSenderTriggerModel(CognitoTriggerBaseSchema):
160+
triggerSource: Literal["CustomEmailSender_SignUp"]
161+
request: CognitoCustomEmailSMSSenderRequestModel
162+
163+
164+
class CognitoCustomSMSSenderTriggerModel(CognitoTriggerBaseSchema):
165+
triggerSource: Literal["CustomSMSSender_SignUp"]
166+
request: CognitoCustomEmailSMSSenderRequestModel
167+
168+
169+
# Models for Challenge Authentication flows
170+
class CognitoChallengeResultModel(BaseModel):
171+
challengeName: Literal[
172+
"SRP_A",
173+
"PASSWORD_VERIFIER",
174+
"SMS_MFA",
175+
"EMAIL_OTP",
176+
"SOFTWARE_TOKEN_MFA",
177+
"DEVICE_SRP_AUTH",
178+
"DEVICE_PASSWORD_VERIFIER",
179+
"ADMIN_NO_SRP_AUTH",
180+
]
181+
challengeResult: bool
182+
challengeMetadata: Optional[str] = None
183+
184+
185+
class CognitoAuthChallengeRequestModel(BaseModel):
186+
userAttributes: Dict[str, Any]
187+
session: List[CognitoChallengeResultModel]
188+
clientMetadata: Optional[Dict[str, Any]] = None
189+
userNotFound: Optional[bool] = None
190+
191+
192+
class CognitoDefineAuthChallengeResponseModel(BaseModel):
193+
challengeName: Optional[str] = None
194+
issueTokens: Optional[bool] = None
195+
failAuthentication: Optional[bool] = None
196+
197+
198+
class CognitoDefineAuthChallengeTriggerModel(CognitoTriggerBaseSchema):
199+
triggerSource: Literal["DefineAuthChallenge_Authentication"]
200+
request: CognitoAuthChallengeRequestModel
201+
response: CognitoDefineAuthChallengeResponseModel
202+
203+
204+
class CognitoCreateAuthChallengeResponseModel(BaseModel):
205+
publicChallengeParameters: Optional[Dict[str, Any]] = None
206+
privateChallengeParameters: Optional[Dict[str, Any]] = None
207+
challengeMetadata: Optional[str] = None
208+
209+
210+
class CognitoCreateAuthChallengeTriggerModel(CognitoTriggerBaseSchema):
211+
triggerSource: Literal["CreateAuthChallenge_Authentication"]
212+
request: CognitoAuthChallengeRequestModel
213+
response: CognitoCreateAuthChallengeResponseModel
214+
215+
216+
class CognitoVerifyAuthChallengeRequestModel(BaseModel):
217+
userAttributes: Dict[str, Any]
218+
privateChallengeParameters: Dict[str, Any]
219+
challengeAnswer: str
220+
clientMetadata: Optional[Dict[str, Any]] = None
221+
userNotFound: Optional[bool] = None
222+
223+
224+
class CognitoVerifyAuthChallengeResponseModel(BaseModel):
225+
answerCorrect: bool
226+
227+
228+
class CognitoVerifyAuthChallengeTriggerModel(CognitoTriggerBaseSchema):
229+
triggerSource: Literal["VerifyAuthChallengeResponse_Authentication"]
230+
request: CognitoVerifyAuthChallengeRequestModel
231+
response: CognitoVerifyAuthChallengeResponseModel

docs/utilities/parser.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,19 @@ The example above uses `SqsModel`. Other built-in models can be found below.
118118
| **CloudFormationCustomResourceUpdateModel** | Lambda Event Source payload for AWS CloudFormation `UPDATE` operation |
119119
| **CloudFormationCustomResourceDeleteModel** | Lambda Event Source payload for AWS CloudFormation `DELETE` operation |
120120
| **CloudwatchLogsModel** | Lambda Event Source payload for Amazon CloudWatch Logs |
121+
| **CognitoPreSignupTriggerModel** | Lambda User Pool Pre-Sign-Up trigger event |
122+
| **CognitoPostConfirmationTriggerModel** | Lambda User Pool Post Confirmation trigger event |
123+
| **CognitoPreAuthenticationTriggerModel** | Lambda User Pool Pre Authentication trigger event |
124+
| **CognitoPostAuthenticationTriggerModel** | Lambda User Pool Post Authentication trigger event |
125+
| **CognitoPreTokenGenerationTriggerModelV1** | Lambda User Pool Pre Token Generation V1 trigger event |
126+
| **CognitoPreTokenGenerationTriggerModelV2AndV3** | Lambda User Pool Pre Token Generation V2 and V3 trigger event |
127+
| **CognitoMigrateUserTriggerModel** | Lambda User Pool Migrate User trigger event |
128+
| **CognitoCustomMessageTriggerModel** | Lambda User Pool Custom Message trigger event |
129+
| **CognitoCustomEmailSenderTriggerModel** | Lambda User Pool Custom Email Sender trigger event |
130+
| **CognitoCustomSMSSenderTriggerModel** | Lambda User Pool Custom SMS Sender trigger event |
131+
| **CognitoDefineAuthChallengeTriggerModel** | Lambda User Pool Define Auth Challenge trigger event |
132+
| **CognitoCreateAuthChallengeTriggerModel** | Lambda User Pool Create Auth Challenge trigger event |
133+
| **CognitoVerifyAuthChallengeTriggerModel** | Lambda User Pool Verify Auth Challenge trigger event |
121134
| **DynamoDBStreamModel** | Lambda Event Source payload for Amazon DynamoDB Streams |
122135
| **EventBridgeModel** | Lambda Event Source payload for Amazon EventBridge |
123136
| **IoTCoreThingEvent** | Lambda Event Source payload for IoT Core Thing created, updated, or deleted. |

tests/events/cognitoCreateAuthChallengeEvent.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"challengeName": "PASSWORD_VERIFIER",
1919
"session" : [
2020
{
21-
"challengeName": "CUSTOM_CHALLENGE",
21+
"challengeName": "PASSWORD_VERIFIER",
2222
"challengeResult": true,
2323
"challengeMetadata": "CAPTCHA_CHALLENGE"
2424
}

tests/events/cognitoCustomEmailSenderEvent.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"userPoolId": "userPoolId",
66
"userName": "userName",
77
"callerContext": {
8-
"awsSdk": "awsSdkVersion",
8+
"awsSdkVersion": "awsSdkVersion",
99
"clientId": "clientId"
1010
},
1111
"request": {

tests/events/cognitoCustomMessageEvent.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"userPoolId": "userPoolId",
66
"userName": "userName",
77
"callerContext": {
8-
"awsSdk": "awsSdkVersion",
8+
"awsSdkVersion": "awsSdkVersion",
99
"clientId": "clientId"
1010
},
1111
"request": {

tests/events/cognitoCustomSMSSenderEvent.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"userPoolId": "userPoolId",
66
"userName": "userName",
77
"callerContext": {
8-
"awsSdk": "awsSdkVersion",
8+
"awsSdkVersion": "awsSdkVersion",
99
"clientId": "clientId"
1010
},
1111
"request": {

tests/events/cognitoDefineAuthChallengeEvent.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"challengeResult": true
2222
},
2323
{
24-
"challengeName": "CUSTOM_CHALLENGE",
24+
"challengeName": "PASSWORD_VERIFIER",
2525
"challengeResult": true,
2626
"challengeMetadata": "CAPTCHA_CHALLENGE"
2727
}

tests/events/cognitoVerifyAuthChallengeResponseEvent.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,7 @@
2424
"challengeAnswer": "challengeAnswer",
2525
"userNotFound": true
2626
},
27-
"response": {}
27+
"response": {
28+
"answerCorrect": true
29+
}
2830
}

0 commit comments

Comments
 (0)