Tôi đã có cùng một vấn đề bạn mô tả. Trang web tôi đang xây dựng có thể được truy cập từ điện thoại di động và từ trình duyệt vì vậy tôi cần một api để cho phép người dùng đăng ký, đăng nhập và thực hiện một số tác vụ cụ thể. Hơn nữa, tôi cần hỗ trợ khả năng mở rộng, cùng một mã chạy trên các quy trình / máy khác nhau.
Bởi vì người dùng có thể TẠO tài nguyên (còn gọi là hành động POST / PUT), bạn cần bảo mật api của mình. Bạn có thể sử dụng oauth hoặc bạn có thể xây dựng giải pháp của riêng mình nhưng hãy nhớ rằng tất cả các giải pháp đều có thể bị phá vỡ nếu mật khẩu thực sự dễ dàng khám phá. Ý tưởng cơ bản là xác thực người dùng bằng tên người dùng, mật khẩu và mã thông báo, còn gọi là apitoken. Apitoken này có thể được tạo bằng nút-uuid và mật khẩu có thể được băm bằng pbkdf2
Sau đó, bạn cần lưu phiên ở đâu đó. Nếu bạn lưu nó vào bộ nhớ trong một đối tượng đơn giản, nếu bạn giết máy chủ và khởi động lại thì phiên sẽ bị hủy. Ngoài ra, điều này là không thể mở rộng. Nếu bạn sử dụng haproxy để tải cân bằng giữa các máy hoặc nếu bạn chỉ sử dụng công nhân, trạng thái phiên này sẽ được lưu trữ trong một quy trình duy nhất, vì vậy nếu cùng một người dùng được chuyển hướng đến quy trình / máy khác, nó sẽ cần xác thực lại. Do đó, bạn cần lưu trữ phiên ở một nơi chung. Điều này thường được thực hiện bằng cách sử dụng redis.
Khi người dùng được xác thực (tên người dùng + mật khẩu + apitoken) sẽ tạo một mã thông báo khác cho phiên, còn gọi là accesstoken. Một lần nữa, với nút-uuid. Gửi cho người dùng accesstoken và userid. Userid (khóa) và accesstoken (giá trị) được lưu trữ trong redis với và hết thời gian, ví dụ 1h.
Bây giờ, mỗi khi người dùng thực hiện bất kỳ thao tác nào bằng cách sử dụng api còn lại, nó sẽ cần gửi userid và accesstoken.
Nếu bạn cho phép người dùng đăng ký bằng api còn lại, bạn sẽ cần tạo tài khoản quản trị viên với lời xin lỗi quản trị viên và lưu trữ chúng trong ứng dụng di động (mã hóa tên người dùng + mật khẩu + apitoken) vì người dùng mới sẽ không có lời xin lỗi khi họ đăng ký.
Web cũng sử dụng api này nhưng bạn không cần sử dụng apitokens. Bạn có thể sử dụng express với cửa hàng redis hoặc sử dụng kỹ thuật tương tự được mô tả ở trên nhưng bỏ qua kiểm tra apitoken và trả lại cho người dùng userid + accesstoken trong cookie.
Nếu bạn có khu vực riêng, hãy so sánh tên người dùng với người dùng được phép khi họ xác thực. Bạn cũng có thể áp dụng vai trò cho người dùng.
Tóm lược:
Một cách khác mà không có apitoken sẽ là sử dụng HTTPS và gửi tên người dùng và mật khẩu trong tiêu đề Ủy quyền và lưu trữ tên người dùng trong redis.