การจัดการ JWT Authentication ระหว่างหลายเฟรมเวิร์ก

เมื่อคุณพัฒนาแอปพลิเคชันโดยใช้หลายเฟรมเวิร์ก เช่น Flask สำหรับ frontend และ FastAPI สำหรับ backend API การจัดการระบบยืนยันตัวตนให้ปลอดภัยและราบรื่นอาจเป็นเรื่องท้าทาย JSON Web Token (JWT) เป็นทางเลือกที่ดีในการบริหารจัดการการยืนยันตัวตนให้สอดคล้องกันระหว่างเฟรมเวิร์กต่าง ๆ มาดูกันว่าควรใช้อย่างไรให้มีประสิทธิภาพ

🔑 JWT คืออะไร?

JWT (JSON Web Token) คือข้อมูลที่เข้ารหัสในรูปแบบที่ปลอดภัยและกระชับ ใช้สำหรับส่งข้อมูลระหว่างระบบ

  • Header: ระบุประเภทของ token และอัลกอริธึมที่ใช้เข้ารหัส
  • Payload: เก็บข้อมูลที่ต้องการ เช่น user id หรือวันหมดอายุ
  • Signature: ใช้ตรวจสอบความถูกต้องของข้อมูล

🚀 การตั้งค่า JWT Authentication บน FastAPI

ติดตั้ง dependencies

pip install fastapi python-jose passlib[bcrypt] uvicorn

การสร้าง JWT Token บน FastAPI

from jose import jwt
from datetime import datetime, timedelta

SECRET_KEY = "supersecret"
ALGORITHM = "HS256"

def create_access_token(data: dict, expires_delta=None):
    to_encode = data.copy()
    expire = datetime.utcnow() + (expires_delta or timedelta(minutes=30))
    to_encode.update({"exp": expire})
    return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)

🖥 การใช้ JWT กับ Flask

การตั้งค่า Flask

ติดตั้ง dependencies:

pip install flask PyJWT requests

การตรวจสอบ JWT Token ใน Flask

import jwt
from flask import Flask, session, redirect, url_for, flash, request

app = Flask(__name__)
app.secret_key = "your_flask_secret"
JWT_SECRET_KEY = "supersecret"
JWT_ALGORITHM = "HS256"

def is_token_valid(token):
    try:
        jwt.decode(token, JWT_SECRET_KEY, algorithms=[JWT_ALGORITHM])
        return True
    except jwt.ExpiredSignatureError:
        return False
    except jwt.InvalidTokenError:
        return False

@app.before_request
def validate_jwt():
    if request.endpoint == 'login':
        return
    token = session.get("jwt_token")
    if not token or not is_token_valid(token):
        flash("เซสชันหมดอายุหรือไม่ถูกต้อง กรุณาเข้าสู่ระบบใหม่")
        return redirect(url_for("login"))

🔄 โฟลว์ของ JWT ระหว่างเฟรมเวิร์ก

  1. ผู้ใช้ล็อกอินผ่าน Flask
  2. Flask ส่งคำขอ token ไปยัง FastAPI
  3. FastAPI ออก token
  4. Flask เก็บ token ใน session
  5. Flask ใช้ token นี้ตรวจสอบทุกคำขอ

🌐 แผนภาพการทำงาน

graph TD;
    Browser-->Flask(Flask Frontend);
    Flask-->FastAPI(FastAPI Backend);
    FastAPI-->MongoDB;
    FastAPI-->JWT("JWT Token");
    JWT-->Flask;
    Flask-->Browser;

📦 การตั้งค่าสภาพแวดล้อมด้วย Docker Compose

ตั้งค่า JWT secret ให้เหมือนกันทุกบริการ:

services:
  fastapi:
    environment:
      SECRET_KEY: ${SECRET_KEY}

  flask:
    environment:
      SECRET_KEY: ${SECRET_KEY}

ไฟล์ .env:

SECRET_KEY=supersecret

🚨 ปัญหาที่พบบ่อยและวิธีแก้ไข

  • Token หมดอายุ: ต้องมีการจัดการให้ผู้ใช้เข้าสู่ระบบใหม่
  • ค่า secret ไม่ตรงกัน: ต้องแชร์ค่าเดียวกันทุกบริการ
  • ปัญหา dependency: เช่น bcrypt และ passlib เวอร์ชันไม่ตรงกัน
pip install bcrypt==4.0.1 passlib>=1.7.5

🛡 ข้อควรระวังด้านความปลอดภัย

  • เก็บ secret key อย่างปลอดภัย
  • ใช้ HTTPS เสมอ
  • ตั้งเวลาให้ token หมดอายุ และมีระบบ refresh

💡 สรุปแนวทางที่แนะนำ

  • ใช้ secret key เดียวกันทุกบริการ
  • ตรวจสอบ token ทุกคำขอ
  • แจ้งผู้ใช้เมื่อเกิดข้อผิดพลาดหรือหมดอายุ

📚 แหล่งข้อมูลเพิ่มเติม

🧑‍💻 สรุป

การใช้ JWT ระหว่างหลายเฟรมเวิร์กอย่าง Flask และ FastAPI จะช่วยให้งานยืนยันตัวตนของคุณมีความยืดหยุ่น ปลอดภัย และดูแลรักษาง่ายขึ้น หากคุณวางแผนอย่างถูกต้องและปฏิบัติตามแนวทางข้างต้น คุณจะสามารถสร้างระบบที่สอดคล้องและขยายได้ในอนาคตอย่างมั่นใจ



Get in Touch with us

Chat with Us on LINE

iiitum1984

Speak to Us or Whatsapp

(+66) 83001 0222

Related Posts

Our Products