🔐 āļ—āļģāļĢāļ°āļšāļš Authentication/Authorization āļ”āđ‰āļ§āļĒ Cognito + API Gateway + Lambda

Sharing is caring!

āļšāļ—āļ™āļģ

āļŦāļēāļāļ„āļļāļ“āļāļģāļĨāļąāļ‡āļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļš Backend āļ—āļĩāđˆāđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļĨāđ‡āļ­āļāļ­āļīāļ™āđ€āļ‚āđ‰āļēāļĄāļēāđƒāļŠāđ‰āļ‡āļēāļ™ āļāļēāļĢāļ­āļ­āļāđāļšāļšāļĢāļ°āļšāļš Authentication āđāļĨāļ° Authorization āļ­āļĒāđˆāļēāļ‡āļ›āļĨāļ­āļ”āļ āļąāļĒāļ–āļ·āļ­āđ€āļ›āđ‡āļ™āļŦāļąāļ§āđƒāļˆāļŦāļĨāļąāļ AWS āļĄāļĩāļšāļĢāļīāļāļēāļĢāļ—āļĩāđˆāļŠāđˆāļ§āļĒāļ„āļļāļ“āļˆāļąāļ”āļāļēāļĢāđ€āļĢāļ·āđˆāļ­āļ‡āļ™āļĩāđ‰āđ„āļ”āđ‰āļ‡āđˆāļēāļĒāļ‚āļķāđ‰āļ™ āļ„āļ·āļ­ Amazon Cognito āđ€āļĄāļ·āđˆāļ­āļœāļŠāļēāļ™āđ€āļ‚āđ‰āļēāļāļąāļš API Gateway āđāļĨāļ° Lambda āļ„āļļāļ“āļāđ‡āļˆāļ°āđ„āļ”āđ‰āļĢāļ°āļšāļšāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™āđāļšāļš Serverless āļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒāđāļĨāļ°āļ‚āļĒāļēāļĒāļĢāļ°āļšāļšāđ„āļ”āđ‰āđ„āļĄāđˆāļˆāļģāļāļąāļ”

1. āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļĢāļ°āļšāļš Authentication āļ”āđ‰āļ§āļĒ Cognito

āļĢāļ°āļšāļšāļ™āļĩāđ‰āļ›āļĢāļ°āļāļ­āļšāļ”āđ‰āļ§āļĒ 3 āļŠāđˆāļ§āļ™āļŦāļĨāļąāļ:

  1. Amazon Cognito User Pool — āđƒāļŠāđ‰āļˆāļąāļ”āļāļēāļĢāļœāļđāđ‰āđƒāļŠāđ‰āđāļĨāļ°āļĢāļŦāļąāļŠāļœāđˆāļēāļ™
  2. API Gateway — āđ€āļ›āđ‡āļ™āļˆāļļāļ”āļĢāļąāļš API āđāļĨāļ°āđ€āļŠāļ·āđˆāļ­āļĄāļāļąāļš Authorizer
  3. Lambda Function — āđƒāļŠāđ‰āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ Logic āļŦāļĨāļąāļ‡āļœāđˆāļēāļ™āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™āđāļĨāđ‰āļ§

2. āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Cognito User Pool

āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđāļĢāļāļ„āļ·āļ­āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ User Pool āļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļœāļđāđ‰āđƒāļŠāđ‰:

aws cognito-idp create-user-pool --pool-name MyUserPool
    

āļˆāļēāļāļ™āļąāđ‰āļ™ āļŠāļĢāđ‰āļēāļ‡ App Client āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰ Frontend āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰:

aws cognito-idp create-user-pool-client \
  --user-pool-id  \
  --client-name MyWebClient \
  --generate-secret
    

3. āļāļēāļĢāļŠāļĄāļąāļ„āļĢāđāļĨāļ°āļĨāđ‡āļ­āļāļ­āļīāļ™āļœāļđāđ‰āđƒāļŠāđ‰ (SignUp / SignIn)

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĄāļąāļ„āļĢāļœāļđāđ‰āđƒāļŠāđ‰āđƒāļŦāļĄāđˆ:

aws cognito-idp sign-up \
  --client-id  \
  --username [email protected] \
  --password "MyStrongPassword123!"
    

āļŦāļĨāļąāļ‡āļˆāļēāļāļœāļđāđ‰āđƒāļŠāđ‰āļĒāļ·āļ™āļĒāļąāļ™āļ­āļĩāđ€āļĄāļĨāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒ āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļĨāđ‡āļ­āļāļ­āļīāļ™āđ€āļžāļ·āđˆāļ­āļĢāļąāļš Token:

aws cognito-idp initiate-auth \
  --auth-flow USER_PASSWORD_AUTH \
  --client-id  \
  --auth-parameters [email protected],PASSWORD=MyStrongPassword123!
    

āļĢāļ°āļšāļšāļˆāļ°āļ„āļ·āļ™āļ„āđˆāļē Token 3 āļŠāđˆāļ§āļ™āļ„āļ·āļ­ ID Token, Access Token, Refresh Token

4. āļāļēāļĢāļœāļŠāļēāļ™ Cognito āļāļąāļš API Gateway

āļŠāļĢāđ‰āļēāļ‡ Cognito Authorizer āđƒāļ™ API Gateway āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļ•āļĢāļ§āļˆāļŠāļ­āļš Token:

āđ€āļĄāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđāļĨāđ‰āļ§ āļ—āļļāļ Request āļ—āļĩāđˆāđ€āļ‚āđ‰āļēāļĄāļēāļ•āđ‰āļ­āļ‡āđāļ™āļš Token āļĄāļēāļ”āđ‰āļ§āļĒ āđ€āļŠāđˆāļ™:

curl -X GET https://api.example.com/dev/profile \
  -H "Authorization: "
    

5. āđ€āļ‚āļĩāļĒāļ™ Lambda āļŠāļģāļŦāļĢāļąāļš API āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ” Lambda āļ”āđ‰āļ§āļĒ Node.js āļ—āļĩāđˆāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļœāļđāđ‰āđƒāļŠāđ‰āļˆāļēāļ Token:

// handler.js
exports.handler = async (event) => {
  const claims = event.requestContext.authorizer.claims;
  const username = claims["cognito:username"];

  return {
    statusCode: 200,
    body: JSON.stringify({
      message: `āļŠāļ§āļąāļŠāļ”āļĩ ${username}, āļ„āļļāļ“āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļŠāļģāđ€āļĢāđ‡āļˆāđāļĨāđ‰āļ§!`
    })
  };
};
    

6. āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš Token āļ”āđ‰āļ§āļĒ JWT

āļ—āļļāļ Token āļ‚āļ­āļ‡ Cognito āđ€āļ›āđ‡āļ™ JWT (JSON Web Token) āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ„āļ”āđ‰āļˆāļēāļ public key āļ‚āļ­āļ‡ Cognito:

import jwt
import requests

POOL_ID = "ap-southeast-1_XXXXXXX"
REGION = "ap-southeast-1"
url = f"https://cognito-idp.{REGION}.amazonaws.com/{POOL_ID}/.well-known/jwks.json"

def verify_token(token):
    jwks = requests.get(url).json()
    header = jwt.get_unverified_header(token)
    key = next(k for k in jwks['keys'] if k['kid'] == header['kid'])
    return jwt.decode(token, key, algorithms=['RS256'], audience='your_client_id')
    

āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ™āļĩāđ‰āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļ„āļļāļ“āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ‚āļ­āļ‡ Token āļāđˆāļ­āļ™āļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ API

7. āđ€āļžāļīāđˆāļĄ Authorization āļĢāļ°āļ”āļąāļš Role

āđƒāļ™ Cognito āļŠāļēāļĄāļēāļĢāļ–āļāļģāļŦāļ™āļ” Role āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰āļœāđˆāļēāļ™āļāļĨāļļāđˆāļĄ (Groups) āđ€āļŠāđˆāļ™:

aws cognito-idp create-group \
  --user-pool-id  \
  --group-name admin \
  --description "Administrator group"
    

āđāļĨāđ‰āļ§āđ€āļžāļīāđˆāļĄāļœāļđāđ‰āđƒāļŠāđ‰āđ€āļ‚āđ‰āļēāđ„āļ›:

aws cognito-idp admin-add-user-to-group \
  --user-pool-id  \
  --username [email protected] \
  --group-name admin
    

8. āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļšāļš Secure End-to-End

āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļĨāđ‡āļ­āļāļ­āļīāļ™āļŠāļģāđ€āļĢāđ‡āļˆ â†’ āđ„āļ”āđ‰ Token → āļŠāđˆāļ‡ API āļœāđˆāļēāļ™ API Gateway → Authorizer āļ•āļĢāļ§āļˆāļŠāļ­āļš Token → Lambda āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ → āļŠāđˆāļ‡āļāļĨāļąāļšāļœāļĨāļĨāļąāļžāļ˜āđŒ āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ™āļĩāđ‰āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāļĢāļąāļ™āļ•āļĨāļ­āļ”āđ€āļ§āļĨāļē

9. āļŠāļĢāļļāļ›

āļāļēāļĢāđƒāļŠāđ‰ Cognito + API Gateway + Lambda āļ—āļģāđƒāļŦāđ‰āđ€āļĢāļēāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļš Authentication/Authorization āđ„āļ”āđ‰āļ‡āđˆāļēāļĒ āļ›āļĨāļ­āļ”āļ āļąāļĒ āđāļĨāļ°āļ‚āļĒāļēāļĒāļĢāļ°āļšāļšāđ„āļ”āđ‰āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļ”āļđāđāļĨ Infrastructure āđ€āļ­āļ‡ Developer āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđāļ™āļ§āļ—āļēāļ‡āļ™āļĩāđ‰āļāļąāļš React, Angular, āļŦāļĢāļ·āļ­ Mobile App āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ

  • ✅ āļĨāļ”āļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļ‚āļ­āļ‡āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļœāļđāđ‰āđƒāļŠāđ‰
  • ✅ āļ›āļĨāļ­āļ”āļ āļąāļĒāļ•āļēāļĄāļĄāļēāļ•āļĢāļāļēāļ™ AWS
  • ✅ āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļšāļĢāļīāļāļēāļĢāļ­āļ·āđˆāļ™āļ‚āļ­āļ‡ AWS āđ„āļ”āđ‰āļ‡āđˆāļēāļĒ

🧠 āđ€āļ‚āļĩāļĒāļ™āđ‚āļ”āļĒ King Pool

āļ āļēāļžāļ›āļĢāļ°āļāļ­āļš: Cognito, Lambda, API Gateway, JWT Token

āļ­āđˆāļēāļ™āļ•āđˆāļ­: āļāļēāļĢāļ—āļģ Observability āļ”āđ‰āļ§āļĒ CloudWatch, X-Ray āđāļĨāļ° Tracing

Leave a Reply

āļ­āļĩāđ€āļĄāļĨāļ‚āļ­āļ‡āļ„āļļāļ“āļˆāļ°āđ„āļĄāđˆāđāļŠāļ”āļ‡āđƒāļŦāđ‰āļ„āļ™āļ­āļ·āđˆāļ™āđ€āļŦāđ‡āļ™ āļŠāđˆāļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļģāđ€āļ›āđ‡āļ™āļ–āļđāļāļ—āļģāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒ *