Bỏ qua, đến nội dung

Chi tiết luồng xác thực OIDC

Mô tả chi tiết luồng Authorization Code của plugin OIDC, bao gồm CSRF protection, token exchange, user mapping và RP-initiated logout.

Tổng quan luồng

Plugin sử dụng Authorization Code Flow theo chuẩn OIDC. Luồng bao gồm: tạo auth URL → redirect đến IdP → callback với code → exchange token → lấy userinfo → tạo/liên kết user.

Sequence diagram chi tiết

Chi tiết state parameter

State chứa các thông tin cần thiết để xử lý callback:

FieldMô tả
tokenCSRF token ngẫu nhiên, so khớp với giá trị trong cookie
nameTên authenticator (phân biệt khi có nhiều OIDC authenticator)
appTên ứng dụng (__appName) — dùng trong kiến trúc multi-app
redirectURL redirect sau khi đăng nhập thành công

State được lưu trong cookie digiforce_oidc với thuộc tính httpOnly. Khi callback trả về, server so sánh token trong state URL với token trong cookie để chống CSRF.

Gateway middleware (multi-app)

Trong kiến trúc multi-app, gateway middleware đóng vai trò giải mã state từ callback URL và chuyển tiếp request đến đúng ứng dụng:

  1. IdP gọi callback URL chung
  2. Gateway đọc state parameter → giải mã ra app name
  3. Gateway forward request đến ứng dụng tương ứng
  4. Ứng dụng xử lý token exchange và user mapping

Field mapping

fieldMap cho phép map OIDC claims sang local user fields. Ví dụ:

json
[
  { "source": "email", "target": "email" },
  { "source": "name", "target": "nickname" },
  { "source": "picture", "target": "avatar" },
  { "source": "preferred_username", "target": "username" }
]

Plugin duyệt qua từng entry trong fieldMap, lấy giá trị từ userinfo response theo source và gán vào local user field theo target.

Luồng RP-initiated logout

Khi bật enableRPInitiatedLogout, plugin thực hiện logout đồng bộ với IdP:

Yêu cầu IdP hỗ trợ end_session_endpoint trong OIDC Discovery metadata.

Xử lý lỗi

Tình huốngHành vi
State mismatchTrả 401 — thường do cookie hết hạn hoặc CSRF attack
Token exchange thất bạiTrả lỗi từ IdP (invalid_grant, invalid_client...)
Userinfo thất bạiTrả lỗi tùy theo accessTokenVia và IdP response
User không tồn tại + autoSignup=falseTrả 401 — yêu cầu admin tạo user trước