Authencation trong Node JS (Phần 1)
1) Hiểu về xác thực.
- Server kiểm tra thông tin có hợp lệ hay không (nếu hợp lệ ) thì trả về (dữ liệu dùng để xác thực thường là một token ) cho người dùng.
- Server sẽ gửi dữ liệu để nhận dạng (token) một client đăng nhập thành công.
- Clien sẽ lưu(token) vào bộ nhớ trình duyệt , mỗi lần trình duyệt gửi yêu cầu lấy tài nguyên thì token này được đính kèm vào request để server xác minh.
- Token hợp lệ và Server trả về resource cho người dùng.
=> Vậy nếu trong trường hợp người dùng đăng nhập không thành công hay có ai đó copy token của người dùng và paste và bộ nhớ thì sao ?
- Nếu thông tin đăng nhập không hợp lệ thì server sẽ trả về lỗi cho người dùng.
- Tất nhiên trong trường hợp này khách hàng không nhận được dữ liệu nhận dạng.(token)
- Lúc này nếu người dùng yêu cầu resource (được bảo vệ) .
- Server kiểm tra request gửi lên và không tìm được token hợp lệ .
- Yêu cầu bị từ chối => Trả về lỗi cho khách hàng.
- Client không nhận được tài nguyên.
=> Ví dụ người dùng A đang trong phiên đăng nhập , 1 hacker nào đó họ copy (token) của người dùng A và lưu vào session storage của họ thì sao ?? để trả lời câu hỏi này cần hiểu cơ bản về cách thức hoạt động của JSON WEB TOKEN
=> Đơn giản nó chỉ là một chuỗi mã hóa gồm 3 phần Header , Payload và Signature
- Header quy định định dạng của token
- Payload (chứa thông tin của user gửi request lên (thường là email và id của user tuyệt đối không mã hóa password vì phần payload này có thể bị dịch ngược )
- Signature (chữ kí mà server tạo ra ở mỗi phiên đăng nhập của user nó được tạo thành là sự kết hợp của Payload và Header qua đó nó có thể kiểm tra tính toàn vẹn của dữ liệu gửi lên)
- Đối với mỗi phiên đăng nhập thì server sẽ tạo ra một chữ kí riêng cho user(tức là đối với mỗi phiên đăng nhập của người dùng A server sẽ render ra những chữ kí khác nhau) vậy nên không thể copy token và paste được nhé (:
- Nói thêm tý và các Signature khỉ gió này , Ví dụ A đăng nhập vào thời điểm B1 thì server tạo ra Signature là C1 , A đăng nhập vào thời điểm B2 thì server tạo ra Signature là C2 , lúc này C1 sẽ bị vô hiệu hóa , nó không còn khả năng xác minh nữa.
2. How to Xác thực ?
a) Dựa trên Cookie.
- Bắt đầu một phiên đăng nhập : Client gửi lên thông tin dùng để đăng nhập (email , password )
- Server tiến hành xác minh nếu hợp lệ thì nó sẽ tạo ra một field trong document chứa thông tin của user đó , field này chứa các thông tin user đã làm gì trong phiên đó (field này chính là session đấy.)
- Server lúc này sẽ tạo ra một cookie mới trên Browser (VD : ok=5345kjh) giá trị của cookie này thường sẽ trùng với ID của session
- Mỗi request gửi lên đều chứa cookie này nên server có thể xác minh người dùng dễ dàng.
- Chú ý là sau khi người dùng login thì field này sẽ bị xóa trong database để tránh việc ăn cắp thông tin.
=> Đây là cách xác thực truyền thống.
b) Dựa trên token
Xác thực dựa trên Token mình đã trình bày ở phần trên , đây là cách xác thực phổ biến và nó hiện đại hơn xác thực bằng cookie do khi xác thực bằng cách này không lưu thông tin người dùng.
- Bắt đầu một phiên đăng nhập (ý mình ở đây chỉ không phải là session đâu nhé vì khi dùng cách xác thực bằng token phải tuân thủ nguyên tắcstateless (phi trạng thái) , trạng thái của user không được lưu phía Server mà được mã hóa vào token rồi sẽ gửi cho client lưu (thường lưu vào localStorage hoặc Cookies) theo cách truyền thống là tạo nên một Session trên server và trả về cho cookie để cho client lưu (: , phiên mình nói ở đây chỉ toàn bộ quá trình hoạt động của user trên trang web từ lúc đăng nhập , mua hàng , thanh toán) Client gửi (thường là email và password) lên server để server xác minh.
- Server xác minh nếu hợp lệ thì nó gửi token về cho client.
-Client sẽ lưu token này lại trong localStorage , sessionStorage hoặc là cookie cũng được ((:
- Như vậy mỗi lần server gửi request những resource được bảo vệ lên server thì nó sẽ được đính kèm token.
- Server sẽ xác minh token (quá trình xác minh này mình sẽ nói sau).
- Nếu token hợp lệ thì resource sẽ được trả về không thì trả về lỗi thôi.
- Nếu người dùng A đăng nhập ở thời điểm T1 nhận được token T1 nếu người dùng A đăng nhập ở thời điểm T2 nhận được token T2 như vậy thì chữ kí S1 và S2 có giống nhau không ?
câu trả lời là : KHÔNG
Bởi vì : trong token có chứa 2 metadata là iat và exp , 2 metada này quy định thời gian tạo và thời gian hết hạn của mỗi token. => S1 và S2 được tạo ở các thời điểm khác nhau nên iat và exp cũng sẽ khác nhau
=>Mở rộng : Sau khi A đăng nhập thì server nó sẽ lưu T1 vào session nếu sau đó tài khoản của A đăng nhập ở đâu đó thì T1 sẽ bị xóa đi (việc xóa hay không sẽ do người lập trình phía server quyết định ) và lưu T2 vào ..lúc này T1 mất đi giá trị xác thực...tính năng này rất có giá trị trong nhiều trường hợp.
=> Do Signature là mã hóa bởi header, payload cùng với một chuỗi bí mật mà Payload lại do iat và exp góp phần tạo nên => mỗi lần đăng nhập thì sẽ tạo ra các Signature khác nhau.




Nhận xét
Đăng nhận xét