Skip to content

Authentication v1.0.0

Source: src/services/authentication.service.ts

Dịch vụ identity kế thừa từ IssuerApplication — nó ký JWT bằng ES256 (ECDSA P-256) thông qua JWKSIssuerTokenService và công bố bộ khóa công khai tại /jw-certs. Tất cả các dịch vụ khác kế thừa từ VerifierApplication và xác minh token bằng cách lấy public key này.

Phụ thuộc

Sign-In

Luồng

Các Bước Validation

BướcKiểm traLỗi
1UserIdentifier tồn tại theo (scheme, identifier)404 — identifier không tìm thấy
2userIdentifier.verified === true403 — chưa được xác minh
3User tồn tại với status: ACTIVATED404 — user không tìm thấy
4User có credential cho scheme403 — không có credentials
5Bun.password.verify() khớp401 — credential không hợp lệ

Chỉ scheme credential BASIC (password) được triển khai. Các scheme khác (2fa, oauth, oauth2) sẽ throw 400 Unsupported credential scheme.

JWT Token Payload

FieldTypeNguồn
userIdstringSnowflake ID của User
rolesArray<{id, identifier, priority}>PolicyDefinition GROUP (USER→ROLE)
clientIdstringTừ request sign-in (tùy chọn)
organizerIdsstringCách nhau bởi dấu phẩy, từ PolicyDefinition GROUP (USER→ORGANIZER)
merchantIdsstringCách nhau bởi dấu phẩy, từ PolicyDefinition GROUP (USER→MERCHANT)
iat / expnumberĐược IGNIS tự thêm

Response

typescript
{
  userId: string,
  roles: Array<{ id: string, identifier: string, priority: number }>,
  token: { value: string, type: 'Bearer' }
}

Sign-Up

Luồng

Hành vi Chính

  • Tất cả người dùng sign-up → status: ACTIVATED + role OWNER (priority 500, identifier 500_organizer-owner). (Đánh dấu là TODO — mặc định tạm thời)
  • Xác minh email khi sign-up đã được comment — hiện không gửi.
  • Luồng sign-up không phát sự kiện nào (không broadcast WebSocket, không enqueue queue). Client phải gọi rõ ràng endpoint Commerce onboarding (POST /organizers/on-boarding) sau khi sign-up để tạo cây phân cấp merchant.

Request Schema

typescript
SignUpRequest {
  username:   string    // 4–80 chars, required
  credential: string    // 4–80 chars, must match PASSWORD_PATTERN, required
  emails:     string[]  // min 1, valid email format
  phones:     string[]  // min 1, E.164 format
  firstName:  string    // 1–255 chars
  lastName:   string    // 1–255 chars
  birthday?:  string    // ISO date
  locale?:    string
}

Đổi Mật khẩu

Quy tắcChi tiết
Chỉ tự đổicurrentUser.userId phải khớp với userId trong request (admin bypass là TODO)
Kiểm tra mật khẩu cũBun.password.verify() so với hash đã lưu
Hash mật khẩu mớiBun.password.hash() (Argon2id)
Mã lỗi404 không tìm thấy credential, 401 mật khẩu cũ sai, 401 không có quyền

Request Schema

typescript
ChangePasswordRequest {
  scheme:        string  // e.g., 'basic'
  oldCredential: string  // 4–80 chars, PASSWORD_PATTERN
  newCredential: string  // 4–80 chars, PASSWORD_PATTERN
  userId:        string
}

Identifier Schemes

Source: src/common/constants.tsUserIdentifierSchemes

SchemeValueTự VerifyCó thể Sign-In
USERNAMEusername
EMAILemailKhôngSau khi xác minh
PHONE_NUMBERphone_numberKhôngSau khi xác minh
NX_AUTHnx_authSử dụng nội bộ
USER_NUMBERuser_numberSử dụng nội bộ

Credential Schemes

SchemeValueTrạng thái
BASICbasicĐã triển khaiBun.password (Argon2id)
TWO_FA2faChỉ định nghĩa
OAUTHoauthChỉ định nghĩa
OAUTH2oauth2Chỉ định nghĩa

Quy tắc Validation

Source: src/common/validations.ts

Quy tắcGiá trị
Độ dài Username4–80 ký tự
Độ dài Password4–80 ký tự
Pattern Password^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+$ (1 chữ hoa + 1 chữ thường + 1 chữ số)
Định dạng SĐT^\+?[1-9]\d{1,14}$ (E.164)
Độ dài chuỗi1–255 ký tự

Auth Endpoints

MethodPathAuthRequestResponse
POST/auth/sign-inSignInRequestSignInResponse
POST/auth/sign-upSignUpRequestSignUpResponse
POST/auth/change-passwordJWTChangePasswordRequest{ message }
GET/auth/user-informationJWT{} (placeholder)

Luồng JWKS (Cross-Service)

Trang Liên quan

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.