Some Serverless / Cloud Native APIs are recreated on every API request and cannot cache token signing keys.
This code example shows how to do token validation using public key details embedded in the JWT header.
The sample uses a trivial lambda function that returns a hard coded response.
Every call to the lambda validates a JWT, as part of a Zero Trust Architecture.
functions:
getDataFunction:
handler: dist/getDataFunction.handler
events:
- http:
path: /data
method: get- Run the
createCerts.shscript, which uses OpenSSL to create a local certificate trust chain for testing.
Run the lambda via the following commands, to execute the certificate chain handling code:
- npm install
- npm run build
- npm start
This will result in an error response because the access token in data/request.json is untrusted:
SERVER-ERROR-LOG: x5c certificate chain verification failed : forge.pki.UnknownCertificateAuthority : Certificate is not trusted.
{
"status": 401,
"body": "{\"code\":\"unauthorized\",\"message\":\"Missing, invalid or expired access token\"}"
}
Follow the Code Example Walkthrough to configure the Curity Identity Server.
Run the setup.sh script to renew the access token in data/request.json.
Then run the lambda again, which will output the token claims to the console, then return a success lambda response:
{
jti: 'b075a8ec-9555-480f-b0bf-aa5fc3dc4f88',
delegationId: '7b4f1bce-59da-47d1-98e2-660c9e5008a6',
exp: 1630088873,
nbf: 1630088573,
scope: 'read',
iss: 'https://login.curity.local/oauth/v2/oauth-anonymous',
sub: '607ad1f66f06563478c433dd15825eabb5ddfd8ad67cbbf60d5ec0c97164f173',
aud: 'api.example.com',
iat: 1630088573,
purpose: 'access_token'
}
{
"status": 200,
"body": "{\"message\":\"API successfully validated the JWT and verified x509 certificate trust\"}"
}
The code example provides the following main classes:
TrustChainValidatorshows how to verify trust of the token signing X509 details contained in the JWTTokenValidatorshows how to continue with standard JWT validation
Three scenarios are covered:
- Validating the full trust chain received in the
x5carray field of the JWT header - Validating the full trust chain received in the
jwkobject field of the JWT header - Identifying a certificate from the
x5tthumpbrint in the JWT header
- The Node Forge PKI library is used to verify X509 certificate details
- The Jose library is then used to validate the JWT
Please visit curity.io for more information about the Curity Identity Server.