
I tried to setup an AWS Cognito user pool supporting OAuth 2.0 client credential flow using AWS CDK.
As of version 1.66.0. CDK allows you to create a Cognito User Pool very straight forward:
mkdir idp-stack && cd idp-stack
cdk init idp-stack --language typescript
npm install @aws-cdk/aws-cognitoimport { OAuthScope, UserPool } from "@aws-cdk/aws-cognito";
const pool = new UserPool(this, "dev-userpool", {
userPoolName: "dev-userpool",
});Next you would assume, you can add a client with client credential flow enabled (as explained in the links above). So here it is:
pool.addClient("console-client", {
generateSecret: true,
oAuth: {
flows: {
clientCredentials: true,
},
scopes: [OAuthScope.custom("https://resource-server//get-todos")],
},
});In order to be able to add a custom scope like https://resource-server//get-todos, first you need to create a resource server. But it is not connected to the user pool in terms of a function to call on the pool instance (which makes sense if you think about it for a while).
So here we go:
new CfnUserPoolResourceServer(this, "dev-userpool-resource-server", {
identifier: "https://resource-server/",
name: "dev-userpool-resource-server",
userPoolId: pool.userPoolId,
scopes: [
{
scopeDescription: "Get todo items",
scopeName: "get-todos",
},
],
});Now we can use the get-todos scope in our client (take care of the correct convention to specify the scope here):
pool.addClient("console-client", {
generateSecret: true,
oAuth: {
flows: {
clientCredentials: true,
},
scopes: [OAuthScope.custom("https://resource-server//get-todos")],
},
});Make sure to take care of the convention for scopes: <resourceserver-identifier>//<scope-name> (notice the double slash).
Additionally we'll specify a domain for our user pool:
pool.addDomain("CognitoDomain", {
cognitoDomain: {
domainPrefix: "dev-userpool",
},
});Lets try cdk deploy and everything should be fine:
npm run build && npm run cdk deployThis is the result - and we're done ✅
The stack IdpStack already includes a CDKMetadata resource
IdpStack: deploying...
IdpStack: creating CloudFormation changeset...
[██████████████████████████████████████████████████████████] (6/6)
✅ IdpStackThe user pool:
The client: 
The resource server: 
The full code example can be found here.