Token có chữ ký giữa hai PWA: HMAC-SHA256 không cần Backend
Bạn cần truyền danh tính người dùng từ PWA này sang PWA khác. Cả hai ứng dụng đều chạy trên các dự án Firebase riêng biệt. Chúng không dùng chung cơ sở dữ liệu. Chúng cũng không dùng chung hệ thống xác thực.
Bạn có thể giải quyết vấn đề này mà không cần viết mã backend. Bạn chỉ cần Web Crypto API của trình duyệt và một URL có chữ ký.
Vấn đề: Một công cụ nội bộ có tên PanelControl cần mở một trang web khác tên là Orders. Khi người dùng nhấp vào một nút, trang Orders phải biết người dùng đó là ai. Người dùng không nên phải đăng nhập lần thứ hai.
Ba cách để thực hiện việc này:
- Shared Firebase: Yêu cầu một cơ sở dữ liệu dùng chung. Không khả thi trong trường hợp này.
- postMessage: Yêu cầu cùng domain hoặc một cửa sổ popup. Khó quản lý hơn.
- HMAC signed URL: Sử dụng một liên kết kèm theo token. Cách này hoạt động hoàn hảo.
Cách thức hoạt động: HMAC tạo ra một chữ ký bằng cách sử dụng một khóa bí mật (secret key). Bên nhận sẽ sử dụng cùng một khóa đó để kiểm tra chữ ký. Nếu chúng khớp nhau, bên gửi sẽ được tin cậy.
Quy trình làm việc:
- Phía bên gửi:
- Tạo một payload chứa tên người dùng và dấu thời gian (timestamp).
- Ký payload bằng HMAC-SHA256.
- Thêm chữ ký và payload vào một URL.
- Phía bên nhận:
- Đọc token từ URL.
- Tách chữ ký ra khỏi payload.
- Tính toán lại chữ ký bằng cách sử dụng khóa bí mật dùng chung.
- Kiểm tra xem token đã hết hạn chưa (ví dụ: sau 5 phút).
- Nếu hợp lệ, thiết lập danh tính người dùng trong ứng dụng.
Chi tiết triển khai: Web Crypto API là API có sẵn trên tất cả các trình duyệt hiện đại. Nó hoạt động với ArrayBuffer và không yêu cầu thêm thư viện bổ sung nào.
Để giữ mọi thứ gọn gàng, script ở phía bên nhận sẽ chạy trong phần <head> của tài liệu. Nó xác minh token, kiểm tra thời gian và ngay lập tức làm sạch URL bằng history.replaceState. Việc này giúp loại bỏ token khỏi thanh địa chỉ trình duyệt để nó được ẩn đi.
Lưu ý về bảo mật: Khóa bí mật nằm trong mã nguồn phía client. Bất kỳ ai sử dụng DevTools đều có thể nhìn thấy nó. Điều này hoàn toàn ổn đối với các công cụ kinh doanh nội bộ, nơi bạn chỉ truyền các dữ liệu không nhạy cảm như tên người dùng.
Nếu bạn xây dựng một ứng dụng công khai với dữ liệu nhạy cảm, hãy sử dụng token phía server thay thế. Đối với các công cụ nội bộ, phương pháp chỉ dùng client này rất nhanh chóng và hiệu quả.
Không cần thêm hạ tầng. Không cần thêm cơ sở dữ liệu. Chỉ sử dụng các công cụ có sẵn của trình duyệt.
Nguồn: https://dev.to/androve2k/signed-token-between-two-pwas-hmac-sha256-with-no-backend-3jod
