Skip to content

Commit 9e3676e

Browse files
parsnipsbmoffatt
authored andcommitted
Cognito PreTokenGen Event (#95)
* Adds support for pretokengen event. * link to the cognito events README files. * Iam -> IAM * Updated sample data with dummy values copied from * fix json synx error
1 parent 4e03420 commit 9e3676e

5 files changed

+127
-0
lines changed

events/README.md

+6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ This package provides input types for Lambda functions that process AWS events.
1818

1919
[Cognito Events](README_Cognito.md)
2020

21+
[Cognito PostConfirmation](README_Cognito_UserPools_PostConfirmation.md)
22+
23+
[Cognito PreSignup](README_Cognito_UserPools_PreSignup.md)
24+
25+
[Cognito PreTokenGen](README_Cognito_UserPools_PreTokenGen.md)
26+
2127
[Config Events](README_Config.md)
2228

2329
[DynamoDB Events](README_DynamoDB.md)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Sample Function
2+
3+
The following is a sample Lambda function that receives Amazon Cognito User Pools pre-token-gen event as an input and writes some of the record data to CloudWatch Logs. (Note that by default anything written to Console will be logged as CloudWatch Logs events.)
4+
5+
Please see instructions for setting up the Cognito triggers at https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html .
6+
7+
```go
8+
package main
9+
10+
import (
11+
"fmt"
12+
13+
"github.com/aws/aws-lambda-go/lambda"
14+
"github.com/aws/aws-lambda-go/events"
15+
)
16+
17+
func handler(event events.CognitoEventUserPoolsPreTokenGen) (events.CognitoEventUserPoolsPreTokenGen, error) {
18+
fmt.Printf("PreTokenGen of user: %s\n", event.UserName)
19+
event.Response.ClaimOverrideDetails.ClaimsToSupress = []string{"family_name"}
20+
return event, nil
21+
}
22+
23+
func main() {
24+
lambda.Start(handler)
25+
}
26+
```

events/cognito.go

+33
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,14 @@ type CognitoEventUserPoolsPostConfirmation struct {
3636
Response CognitoEventUserPoolsPostConfirmationResponse `json:"response"`
3737
}
3838

39+
// CognitoEventUserPoolsPreTokenGen is sent by AWS Cognito User Pools when a user attempts to retrieve
40+
// credentials, allowing a Lambda to perform insert, supress or override claims
41+
type CognitoEventUserPoolsPreTokenGen struct {
42+
CognitoEventUserPoolsHeader
43+
Request CognitoEventUserPoolsPreTokenGenRequest `json:"request"`
44+
Response CognitoEventUserPoolsPreTokenGenResponse `json:"response"`
45+
}
46+
3947
// CognitoEventUserPoolsCallerContext contains information about the caller
4048
type CognitoEventUserPoolsCallerContext struct {
4149
AWSSDKVersion string `json:"awsSdkVersion"`
@@ -73,3 +81,28 @@ type CognitoEventUserPoolsPostConfirmationRequest struct {
7381
// CognitoEventUserPoolsPostConfirmationResponse contains the response portion of a PostConfirmation event
7482
type CognitoEventUserPoolsPostConfirmationResponse struct {
7583
}
84+
85+
// CognitoEventUserPoolsPreTokenGenRequest contains request portion of PreTokenGen event
86+
type CognitoEventUserPoolsPreTokenGenRequest struct {
87+
UserAttributes map[string]string `json:"userAttributes"`
88+
GroupConfiguration GroupConfiguration `json:"groupConfiguration"`
89+
}
90+
91+
// CognitoEventUserPoolsPreTokenGenResponse containst the response portion of a PreTokenGen event
92+
type CognitoEventUserPoolsPreTokenGenResponse struct {
93+
ClaimsOverrideDetails ClaimsOverrideDetails `json:"claimsOverrideDetails"`
94+
}
95+
96+
// ClaimsOverrideDetails allows lambda to add, supress or override claims in the token
97+
type ClaimsOverrideDetails struct {
98+
GroupOverrideDetails GroupConfiguration `json:"groupOverrideDetails"`
99+
ClaimsToAddOrOverride map[string]string `json:"claimsToAddOrOverride"`
100+
ClaimsToSuppress []string `json:"claimsToSuppress"`
101+
}
102+
103+
// GroupConfiguration allows lambda to override groups, roles and set a perferred role
104+
type GroupConfiguration struct {
105+
GroupsToOverride []string `json:"groupsToOverride"`
106+
IAMRolesToOverride []string `json:"iamRolesToOverride"`
107+
PreferredRole *string `json:"preferredRole"`
108+
}

events/cognito_test.go

+26
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,29 @@ func TestCognitoEventUserPoolsPostConfirmationMarshaling(t *testing.T) {
8585

8686
test.AssertJsonsEqual(t, inputJSON, outputJSON)
8787
}
88+
89+
func TestCognitoEventUserPoolsPreTokenGenMarshalingMalformedJson(t *testing.T) {
90+
test.TestMalformedJson(t, CognitoEventUserPoolsPreTokenGen{})
91+
}
92+
93+
func TestCognitoEventUserPoolsPreTokenGenMarshaling(t *testing.T) {
94+
// read json from file
95+
inputJSON, err := ioutil.ReadFile("./testdata/cognito-event-userpools-pretokengen.json")
96+
if err != nil {
97+
t.Errorf("could not open test file. details: %v", err)
98+
}
99+
100+
// de-serialize into CognitoEvent
101+
var inputEvent CognitoEventUserPoolsPreTokenGen
102+
if err := json.Unmarshal(inputJSON, &inputEvent); err != nil {
103+
t.Errorf("could not unmarshal event. details: %v", err)
104+
}
105+
106+
// serialize to json
107+
outputJSON, err := json.Marshal(inputEvent)
108+
if err != nil {
109+
t.Errorf("could not marshal event. details: %v", err)
110+
}
111+
112+
test.AssertJsonsEqual(t, inputJSON, outputJSON)
113+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{
2+
"version": "1",
3+
"triggerSource": "PreTokenGen",
4+
"region": "region",
5+
"userPoolId": "userPoolId",
6+
"userName": "userName",
7+
"callerContext": {
8+
"awsSdkVersion": "calling aws sdk with version",
9+
"clientId": "apps client id"
10+
},
11+
"request": {
12+
"userAttributes": {
13+
"email": "email",
14+
"phone_number": "phone_number"
15+
},
16+
"groupConfiguration": {
17+
"groupsToOverride": ["group-A", "group-B", "group-C"],
18+
"iamRolesToOverride": ["arn:aws:iam::XXXXXXXXXXXX:role/sns_callerA", "arn:aws:iam::XXXXXXXXX:role/sns_callerB", "arn:aws:iam::XXXXXXXXXX:role/sns_callerC"],
19+
"preferredRole": "arn:aws:iam::XXXXXXXXXXX:role/sns_caller"
20+
}
21+
},
22+
"response": {
23+
"claimsOverrideDetails": {
24+
"claimsToAddOrOverride": {
25+
"attribute_key2": "attribute_value2",
26+
"attribute_key": "attribute_value"
27+
},
28+
"claimsToSuppress": ["email"],
29+
"groupOverrideDetails": {
30+
"groupsToOverride": ["group-A", "group-B", "group-C"],
31+
"iamRolesToOverride": ["arn:aws:iam::XXXXXXXXXXXX:role/sns_callerA", "arn:aws:iam::XXXXXXXXX:role/sns_callerB", "arn:aws:iam::XXXXXXXXXX:role/sns_callerC"],
32+
"preferredRole": "arn:aws:iam::XXXXXXXXXXX:role/sns_caller"
33+
}
34+
}
35+
}
36+
}

0 commit comments

Comments
 (0)