Sắp xếp: một lần đăng nhập OAuth Authorization Code + PKCE đúng chuẩn Trung cấp
Thời gian đọc ước tính: 1 phút
Mỗi bước của một lần đăng nhập Authorization Code + PKCE tồn tại để chặn một kiểu tấn công cụ thể. Làm sớm một bước hoặc bỏ nó đi, và một code bị lấy cắp, một callback bị cài sẵn hay một token sai audience sẽ lọt qua.
Sắp xếp các bước dưới đây, từ cú bấm Đăng nhập tới lúc orders API trả 200. Bấm Kiểm tra để biết bước nào sai chỗ và sai thì hỏng gì.
Đăng nhập qua IdP rồi gọi orders API, theo đúng thứ tự
SPA của shop có một backend-for-frontend (BFF) đăng ký ở id.shop.example với client_id = shop-web và redirect URI https://shop.example/auth/callback. Người dùng bấm Đăng nhập, rồi mở "Đơn hàng của tôi", trang này gọi orders API viết bằng NestJS ở api.shop.example.
Sắp xếp các bước của một lần đăng nhập Authorization Code + PKCE đúng chuẩn, từ cú bấm tới lúc API trả 200.
Dùng ▲▼ để đổi chỗ từng bước, hoặc chạm ⠿ của một bước rồi chạm vào vị trí mới. Trên máy tính có thể kéo thả.
- Orders API chọn key theo
kidtừ JWKS của IdP, kiểm chữ ký,typ = at+jwt,iss,aud,exp, rồi kiểmsubcó sở hữu đơn hàng không - BFF sinh ngẫu nhiên
code_verifier(32 byte),statevànonce, lưu vào session tạm trước login - Ở
/auth/callback, sostate(vàiss) với giá trị đã lưu rồi huỷ chúng; không khớp thì dừng - Kiểm ID token (chữ ký,
iss,aud = shop-web,exp,nonce), rồi tạo session mới và set cookie__Host-HttpOnly - SPA gọi BFF bằng cookie; BFF chuyển request kèm
Authorization: Bearer <access_token> - Người dùng đăng nhập ở IdP (system browser, không phải WebView nhúng); IdP cấp code ngắn hạn, dùng một lần, gắn với challenge
- BFF POST tới
/tokenqua back channel:code,code_verifier, cùngredirect_uri, và client credentials của nó - Redirect browser tới
/authorizekèmcode_challenge = S256(verifier),code_challenge_method=S256,state,noncevà đúngredirect_uriđã đăng ký
Chi tiết về luồng, nơi lưu token và cách API kiểm token: OAuth 2.0, OIDC và PKCE.