🔐 ทำระบบ 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

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *