WhyPik DocsVề trang chính

Lập trình viên / Tra cứu

Auth SDK: đăng ký, phiên và khôi phục

Danh tính nằm riêng trong từng Project; tài khoản WhyPik dashboard không phải tài khoản của ứng dụng.

Khóa dùng cho website và Static Hosting

Mở Authentication → API & SDK, chọn Public · Website / Static Hosting để tạo khóa wpk_public_. Khóa này được phép đặt trong JavaScript hoặc environment.ts của ứng dụng. Nó chỉ nhận diện dự án, không cấp quyền quản trị; quyền dữ liệu vẫn theo phiên người dùng và policy. Khi chưa đăng nhập, chỉ truy cập được dữ liệu có policy anonymous phù hợp. Public key tạo riêng ở Database không thay cho Public key của Authentication khi đăng nhập.

Trên WhyPik Static Hosting hoặc tên miền riêng đã xác minh và kích hoạt, SDK mặc định dùng /.whypik/auth và /.whypik/data cùng tên miền. WhyPik cung cấp backend Auth; ứng dụng tĩnh không cần tự chạy backend hoặc tạo khóa BFF. Bật Authentication, cho phép tên miền trong Cấu hình đăng nhập và triển khai trang callback của ứng dụng theo hướng dẫn Angular.

BFF · Backend riêng tạo khóa wpk_bff_ dành cho backend của website được host bên ngoài WhyPik khi cần phiên cookie bền. Không đặt khóa BFF, Data server secret wpk_secret_ hoặc khóa quản lý tài khoản wpc_ trong JavaScript, environment.ts hay ZIP website. Các khóa này khác Public key.

Quản trị viên ứng dụng đầu tiên

Đăng ký trên website của bạn và xác minh email. Chủ Project mở Authentication → Người dùng, tìm email rồi bật Quản trị viên ứng dụng. Không cấp quyền chỉ từ một email chưa đăng ký hoặc metadata do client gửi.

is_admin là cờ đặc quyền dữ liệu duy nhất; không có phân cấp manager/staff. Tài khoản có role cũ tên admin không tự được nâng quyền. Chủ Project có thể thu hồi bằng cùng nút; API đọc trạng thái hiện hành, kể cả khi client giữ access token cũ.

client.auth.is_admin là giá trị chỉ đọc để hiện/ẩn giao diện. Cập nhật bằng getUser(), đăng nhập hoặc làm mới phiên; không có thông báo đẩy tự động. Ẩn nút không thay thế kiểm quyền phía server.

typescript
await client.auth.signInWithPassword({ email, password });
await client.auth.getUser();
if (client.auth.is_admin) {
  // Hiện điều hướng quản trị ứng dụng. API vẫn tự kiểm quyền.
}

Lấy UUID và tải cấu hình client

PROJECT_ID là Mã dự án dễ đọc, ví dụ hue-spa. PROJECT_UUID là UUID của dự án, dùng cho trường project của SDK và các đường dẫn API. Cả hai nằm ở Tổng quan dự án và Authentication → API & SDK; bấm biểu tượng sao chép cạnh PROJECT_UUID để lấy đúng giá trị; thông báo Đã sao chép. xác nhận thành công.

Tạo Public key rồi bấm Cấu hình client tại dòng khóa tương ứng. Chọn WhyPik Static Hosting hoặc Hosting bên ngoài WhyPik, sau đó Sao chép JSON, Tải JSON hoặc Tải .env. JSON có project, key, auth, data và dùng được với new WhyPik(config). Không chứa BFF key, server secret, khóa quản lý tài khoản, phiên đăng nhập hoặc thông tin bucket R2.

Public Auth key mới có thể tải lại khi còn hiệu lực. Khóa cũ chỉ lưu dạng băm nên không khôi phục được; giữ bản sao cũ hoặc tạo Public key mới để xuất cấu hình. Không tự thu hồi khóa cũ. Khóa đã hết hạn hoặc thu hồi không có nút xuất cấu hình.

WhyPik Hosting dùng endpoint tương đối /.whypik/auth và /.whypik/data, giữ phiên cookie cùng origin. Website bên ngoài dùng endpoint HTTPS của nền tảng và memory session; reload cần đăng nhập lại. Vẫn phải bật dịch vụ, khai báo origin và callback và cấu hình quyền dữ liệu; file tải xuống không tự cấp quyền.

.env chỉ chứa cấu hình public cho công cụ build. Ánh xạ WHYPIK_PROJECT_UUID → project, WHYPIK_PUBLIC_KEY → key, WHYPIK_AUTH_ENDPOINT → auth.endpoint, WHYPIK_AUTH_SESSION_MODE → auth.sessionMode, WHYPIK_AUTH_AUTO_RESTORE → auth.autoRestore (chuyển chuỗi sang boolean), WHYPIK_DATA_ENDPOINT → data.endpoint. WHYPIK_PROJECT_ID chỉ để nhận diện tên ngắn; không dùng thay UUID. Angular không tự nạp .env.

Tên miền và callback trong cấu hình

Mở Authentication của đúng dự án. Tên miền ứng dụng được phép là các origin HTTPS chính xác, không gồm đường dẫn hay query. Nhấn Enter hoặc dấu phẩy để thêm từng thẻ, dán nhiều dòng để thêm nhiều địa chỉ, bấm nút xóa ở thẻ để bỏ địa chỉ. Có thể bỏ tiền tố https:// khi nhập; hệ thống thêm HTTPS. Không nhận HTTP, wildcard, thông tin đăng nhập hoặc fragment. Tối đa 20 địa chỉ cho mỗi danh sách.

Lần cấu hình đầu, bỏ trống danh sách tên miền dùng địa chỉ mặc định của dự án. Địa chỉ này được cấp trước khi bật Hosting; nó không chứng minh website đã được triển khai. Nếu môi trường không có địa chỉ mặc định, bạn cần nhập origin HTTPS của ứng dụng.

Ví dụ Project ID spa có hostname spa.whypik.app: allowed_origins mặc định là ["https://spa.whypik.app"], redirect_urls mặc định là ["https://spa.whypik.app/auth/callback"]. Dùng hostname thực được cấp trong Tổng quan, gồm cả hậu tố tránh trùng nếu có; không dùng PROJECT_UUID làm subdomain.

Bật Tự tạo đường dẫn /auth/callback theo tên miền để danh sách callback đi theo các origin đã chọn. Tắt tùy chọn này khi cần route riêng và nhập URL callback chính xác; mọi callback phải thuộc origin được phép. URL tùy chỉnh đã lưu được giữ nguyên, không tự ghi đè thành /auth/callback. Bỏ trống danh sách callback đưa cấu hình về chế độ tự động.

Thêm tên miền Hosting hoặc DNS không tự cho phép origin trong Auth. Hãy thêm origin đó vào cấu hình Auth khi ứng dụng dùng nó. Xóa một origin sẽ thu hồi các phiên thuộc origin đã bỏ. Callback tự động chỉ cập nhật theo danh sách Auth, không tự tạo route hay triển khai trang.

Trường cấu hìnhMặc địnhVí dụ dự án spa
Tên miền ứng dụng được phép (allowed_origins)https://<hostname mặc định của dự án>https://spa.whypik.app
Đường dẫn xác nhận email được phép (redirect_urls)Origin + /auth/callbackhttps://spa.whypik.app/auth/callback
json
{
  "allowed_origins": ["https://spa.whypik.app"],
  "redirect_urls": ["https://spa.whypik.app/auth/callback"],
  "redirects_automatic": true
}

Khởi tạo và phiên

APIDùng khi nào
auth.readyawait để chờ khôi phục ban đầu theo cấu hình
auth.getSession()Đọc Session hiện có ở client hoặc null; không chứng minh quyền trên server
auth.getUser()Đọc ProjectUser từ server; lỗi xác thực không trả user giả
auth.getAccessToken({allowAnonymous:false})Lấy access token đã kiểm tra hạn; không lưu token vào localStorage
auth.restoreSession()Khôi phục/refresh phiên; cookie mode cần HTTPS và điều phối tab
auth.onAuthStateChange(listener)Nhận event/session; trả hàm hủy đăng ký
auth.destroy() / client.destroy()Hủy request, timer, listener khi không còn dùng

Đăng ký và đăng nhập

APIKết quả
auth.signUp({email,password,metadata?,redirect_url?})check_email; chưa cấp phiên đã xác minh
auth.signInWithPassword({email,password,device_label?})Session có user, accessExpiresAt, expiresAt, idleExpiresAt
auth.signInWithCustomToken(token)Session hoặc check_email; chỉ JWT từ issuer đã cấu hình
auth.signOut({scope:"current"})Đăng xuất phiên hiện tại; scope:"all" cho mọi phiên của user
auth.listSessions(){sessions:[...]} của người đang đăng nhập
auth.revokeSession(session_id)Thu hồi một phiên của chính user

Hành động email

APINội dung
auth.sendEmailVerification({email,redirect_url?})Gửi lại xác minh
auth.verifyEmail(token)Xác nhận purpose verify
auth.requestPasswordReset({email,redirect_url?})Yêu cầu đặt lại mật khẩu, không tiết lộ email có tồn tại
auth.resetPassword({token,password})Xác nhận purpose reset
auth.updatePassword({current_password,password})Đổi mật khẩu khi đăng nhập; cần đăng nhập lại sau thành công
auth.requestEmailChange({email,current_password,redirect_url?})Yêu cầu thay email
auth.confirmEmailChange(token)Xác nhận purpose email_change
auth.acceptInvitation({token,password})Nhận lời mời purpose invite

Callback và trạng thái

takeEmailAction() trả {token,purpose} hoặc null và xóa tham số hành động khỏi fragment. Gọi trước analytics; giữ token trong bộ nhớ rồi yêu cầu bấm xác nhận. Không tiêu thụ token bằng GET. ActionResult có status và sign_in_required; tuân theo kết quả, không giả định đã login.

Event: SIGNED_IN, REFRESHED, SIGNED_OUT, USER_UPDATED, SESSION_CHANGED. getSession không chứa refresh credential. Với signOut, serverConfirmed:false nghĩa là chỉ xóa phiên cục bộ khi mất mạng, chưa chứng minh đã thu hồi trên server.

Phiên bền và giới hạn

Default cùng origin: /.whypik/auth. Cookie Secure/HttpOnly, chỉ hostname hiện tại; không dùng cookie dashboard cho app. Memory mode mất phiên khi reload. Website ở nơi khác cần BFF cùng origin để dùng cookie bền.

Các hạn mức Auth thương mại chưa chốt. Giới hạn thử nghiệm là cấu hình vận hành hữu hạn, không phải cam kết số user theo Free/Starter/Pro hay unlimited. Xem số liệu/giới hạn thực tại Authentication.

Hợp đồng cấu hình callback qua API quản lý

Backend gọi GET/PATCH /api/v1/cloud/projects/PROJECT_UUID/auth bằng Cloud key: cần auth:read và thêm auth:settings:write khi PATCH. Dashboard dùng đường dẫn /api/v1/seller/cloud/projects/PROJECT_UUID/auth với session + CSRF. Không gọi API quản lý này bằng public Auth key của ứng dụng.

Các trường liên quan là allowed_origins (mảng origin), redirect_urls (mảng URL đầy đủ) và redirects_automatic (boolean). Khi tạo cấu hình lần đầu, bỏ qua hoặc gửi mảng origin rỗng dùng hostname mặc định; bỏ qua callback hoặc gửi mảng callback rỗng dùng origin + /auth/callback. Callback tự động dùng /auth/callback; callback tùy chỉnh đã lưu giữ nguyên.

Ở lần sửa sau, bỏ qua origin và callback giữ giá trị đã lưu; redirects_automatic:true tạo lại callback từ các origin hiệu lực. Với callback tùy chỉnh, gửi redirects_automatic:false và redirect_urls không rỗng. Gửi callback rỗng luôn trở về tự động. Việc cho phép callback không triển khai trang nhận token; ứng dụng vẫn phải thực hiện luồng takeEmailAction và xác nhận đúng purpose.

Khi SDK không truyền redirect_url, server chọn URL đầu tiên trong redirect_urls đã lưu. Khi truyền redirect_url, URL phải khớp chính xác một mục được cho phép. Khai báo allowlist không tự tạo route hoặc kích hoạt Hosting.

Trong bài này