Featured image of post Authentication vs. Authorization vs. OAuth: Mô hình tư duy 'Thẻ Căn cước'

Authentication vs. Authorization vs. OAuth: Mô hình tư duy 'Thẻ Căn cước'

Đừng nhầm lẫn 401 và 403 nữa. Hướng dẫn chuyên sâu về AuthN (Bạn là ai), AuthZ (Bạn được làm gì) và OAuth (Chìa khóa Valet).

Hai từ dễ gây nhầm lẫn nhất trong ngành phần mềm đều bắt đầu bằng chữ “Auth”.

Hỏi một bạn fresher, bạn ấy sẽ bảo: “Là cái màn hình đăng nhập chứ gì.” Hỏi một anh senior, anh ấy sẽ bảo: “Authentication là xác định danh tính; Authorization là cấp quyền.”

Nhưng ngay cả senior cũng vấp ngã khi OAuth 2.0 bước vào phòng.

Đây là Hướng dẫn chuyên sâu (Mastery Guide) về “Bộ ba bảo mật” này. Chúng ta sẽ bắt đầu bằng một mô hình tư duy gọn gàng, sau đó đi sâu vào debug JWT, sự khác biệt sống còn giữa 401 và 403, và tại sao OAuth giống như cái chìa khóa Valet.


Phần 1: Nền tảng (Mô hình tư duy)

Bộ ba quyền lực

Thuật ngữViết tắtCâu hỏi cốt lõiVật thể tương ứng
AuthenticationAuthN“Mày là thằng nào?”Căn cước công dân (ID)
AuthorizationAuthZ“Mày có được phép làm cái này không?”Thẻ từ thang máy
OAuthDelegation“Thằng kia có được làm việc này thay mày không?”Chìa khóa Valet

Mô hình “Chung cư cao cấp”

Tưởng tượng bạn sống ở một chung cư hạng sang (như Vinhomes chẳng hạn).

  • AuthN (Anh Bảo vệ): Bạn bước đến sảnh. Bảo vệ nhìn mặt (hoặc xem thẻ cư dân). “À, chào anh Hoàng.”

    • Kết quả: Bạn đã được Xác thực (Authenticated). Bạn được vào sảnh.
  • AuthZ (Cái thang máy): Bạn quẹt thẻ để lên Penthouse. Thang máy kêu: tít-tít. “Không được phép.” Bạn chỉ ở tầng 2, không phải Penthouse.

    • Kết quả: Bạn đã được Xác thực (biết là Hoàng rồi), nhưng Không được ủy quyền (Unauthorized) để lên tầng đó.
  • OAuth (Người dắt chó): Bạn đi làm vắng nhà. Bạn đưa cho người dắt chó (Dog Walker) một cái chìa khóa. Nhưng đây là chìa khóa đặc biệt — nó chỉ mở được Cổng phụ và Phòng khách để đón chó. Nó không mở được Phòng ngủ hay Két sắt.

    • Kết quả: Bạn đã Ủy quyền (Delegate) truy cập cho người khác, với phạm vi (scope) giới hạn.

Phần 2: Điều tra (Debug như chuyên gia)

Trong thế giới API, cái “Căn cước” của bạn thường là một chuỗi JWT (JSON Web Token). Nếu Login bị lỗi, đừng đoán mò — hãy soi cái token đó.

1. “Mắt thần” (JWT.io)

JWT không hề được mã hóa (encrypted); nó chỉ được mã hóa Base64 thôi. Ai nhặt được cũng đọc được.

Copy chuỗi ey... đó và ném vào jwt.io.

Cần soi gì trong Payload:

  • sub (Subject): ID người dùng. (Đây có đúng là user bạn đang nghĩ không?)
  • exp (Expiration): Unix timestamp. (Nó hết hạn chưa?)
  • scope hoặc roles: Quyền hạn. (Nó có quyền admin hay chỉ viewer?)

2. Kiểm tra Chữ ký (Signature)

Nếu token trông có vẻ đúng nhưng server vẫn từ chối, nghĩa là Chữ ký sai.

  • Symmetric (HS256): API cần cùng một “secret key” với bên cấp token.
  • Asymmetric (RS256): API cần Public Key để xác minh chữ ký được tạo bởi Private Key của Auth Server.

Mẹo: Nếu API báo “Invalid Signature”, 90% là do bạn vừa đổi key (rotate keys) trên Auth Server nhưng quên cập nhật Public Key cho API.


Phần 3: Chẩn đoán (Giải mã Error Codes)

HTTP Status Code nói cho bạn biết chính xác bạn tắc ở bước nào.

401 vs. 403 (Cuộc tranh cãi ngàn năm)

TênÝ nghĩaAnh Bảo vệ nói…Cách sửa
401UnauthorizedKhông biết là ai / ID rởm.“Tôi không quen anh. Xuất trình giấy tờ.”Đăng nhập lại. Gửi header Authorization: Bearer chuẩn.
403ForbiddenKhông đủ quyền.“Tôi biết anh là Hoàng, nhưng anh không có tuổi lên Penthouse.”Xin cấp thêm quyền (Nâng cấp tài khoản).

Đừng bao giờ nói “401 Unauthorized” là không đủ quyền. Nó có nghĩa là Xác thực thất bại (Authentication failed). 403 mới là Cấp quyền thất bại (Authorization failed). Lỗi tại ông viết ra chuẩn HTTP đặt tên gây lú.


Phần 4: Giải pháp (Code Pattern)

1. Vũ điệu OAuth (Chìa khóa Valet)

“Đăng nhập bằng Google” hoạt động thế nào? Chính là bạn đang đưa Chìa khóa Valet cho App.

  1. User bấm “Đăng nhập”.
  2. App đẩy User sang “Quầy làm khóa” của Google (Authorization Server).
  3. User bảo Google: “Cấp cho cái App này một cái chìa chỉ được đọc Email của tao thôi nhé.” (Scope).
  4. Google đưa cho App một cái mã.
  5. App đổi mã đó lấy Access Token (Chìa khóa Valet).

2. Sách nấu ăn Python: Verify một JWT

Đừng tự viết thuật toán crypto. Dùng PyJWT cho lành.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import jwt

token = "ey..."
public_key_pem = "-----BEGIN PUBLIC KEY..."

try:
    # 1. Decode & Verify Signature
    # 2. Tự động kiểm tra hết hạn (exp)
    payload = jwt.decode(token, public_key_pem, algorithms=["RS256"])
    
    print(f"Xin chào cư dân {payload['sub']}")

except jwt.ExpiredSignatureError:
    print("401: Token hết hạn rồi pa. Login lại đi.")
except jwt.InvalidTokenError:
    print("401: Token pha-ke. Biến đi hacker!")

3. Sách nấu ăn Python: Xử lý 403 (Role Check)

1
2
3
4
5
6
# Token hợp lệ (Authentication qua cửa), giờ check Quyền (Authorization)
user_roles = payload.get("roles", [])

if "admin" not in user_roles:
    # Biết mày là ai rồi, nhưng không được sờ vào cái này.
    raise PermissionDenied("403: Cần quyền Admin mới vào được đây.")

Mô hình tư duy chốt hạ

1
2
3
4
5
6
AuthN (401) -> "Mày là ai?" (Căn cước công dân)
AuthZ (403) -> "Mày được làm gì?" (Thẻ thang máy)
OAuth       -> "App này có được đại diện cho mày không?" (Chìa Valet)

JWT         -> Cái thẻ nhựa thực tế. 
               (Đừng nhận thẻ nếu ngày hết hạn bị cạo mất).

Chỉ cần nhớ “Căn cước vs. Thẻ thang máy”, bạn sẽ không bao giờ nhầm lẫn Authentication và Authorization nữa.

Được tạo với sự lười biếng tình yêu 🦥

Subscribe to My Newsletter