12/08/2018, 15:37

AWS Cognito

Mình muốn xây dựng một hệ thống để sử dụng các dịch vụ của Amazone như IoT, DynamoDB, API Getway,... và mình đã gặp phải rất nhiều vấn đề như: Xây dựng cơ chế authenticate bảo mật Cơ chế confirm authenticate phải chính xác (sms, email,...) Có thể authenticate với các Identity Provider khác ...

Mình muốn xây dựng một hệ thống để sử dụng các dịch vụ của Amazone như IoT, DynamoDB, API Getway,... và mình đã gặp phải rất nhiều vấn đề như:

  • Xây dựng cơ chế authenticate bảo mật
  • Cơ chế confirm authenticate phải chính xác (sms, email,...)
  • Có thể authenticate với các Identity Provider khác như facebook, google...
  • Có thể phân quyền được cho các user, tổi thiểu là quyền mặc định sau khi authenticate
  • Các thiết bị của người dùng phải được đồng bộ dữ liệu sau khi login
  • ...

Cognito-Syn

AWS cung cấp dịch vụ Cognito để giải quyết các vấn đề trên với 3 dịch vụ cơ bản

  • Amazon Cognito Federated Identities
  • Amazon Cognito Sync
  • Amazon Cognito User Pools

Amazon Cognito Federated Identities

Để đăng nhập vào hệ thống của mình, người dùng chỉ việc đăng nhập vào những trang khác (Identities Provider) như Facebook, Googlde, Twtitter... Hoặc chính Identity Provider của bạn (Bạn có thể tự tạo ra mà)

Cognito-Federated

  • Các bạn có thể tạo nhiều cấu hình (Identity Pool) với các mục đích sử dụng khác nhau. Ví dụ:

    • 1 Identity Pool cho admin/manager side
    • 1 Identity Pool cho client side
    • 1 Identity Pool cho API-Getway-Lambda để xử lý các thao tác tự động
    • ...
  • Ta có thể tùy chỉnh rất nhiều thứ từ Cognito Ferderate, ví dụ như

    • Unauthenticate - người dùng không cần đăng nhập mà chỉ cần sử dụng các API SDK để thao tác với hệ thống với Role được set
    • Authenticate - người dùng đăng nhập thông qua các Identity Provider với Role mặc định cho người dùng sau khi họ authenticate vào hệ thống của ta
    • ...
  • Lưu ý: Các Role, Policy, User, Group... sẽ được cấu hình bên dịch vụ AWS Identity Access Management - AWS IAM

Cognito-Role

Mỗi một Identity Pool như trên sẽ có 1 Identity Pool ID định danh, và chúng ta sẽ dùng ID này để thao tác trên hệ thống của chúng ta thông qua các SDK API mà aws cung cấp, bên dưới là 1 đoạn code mẫu từ javascript

// Initialize the Amazon Cognito credentials provider
AWS.config.region = 'us-east-1'; // Region
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'us-east-1:709c8ba2-62ec-440a-84f7-2c21a4b20628',
});

Vậy sau khi đăng nhập xong, làm sao tôi có thể biết hiện tại đã có bao nhiêu user đăng nhập vào hệ thống của tôi ? Và những user đó là gì? Rồi các thiết bị đăng nhập cùng user có được đồng bộ dữ liệu không ? Dữ liệu lưu trữ sẽ ra sao...v.v...

Tất nhiên sẽ có bạn đưa ra kịch bản như sau để quản lý công việc khó khăn này.

  1. User đăng nhập hệ thống
  2. User cập nhật thông tin cá nhân (họ tên, ...) hoặc lấy thông tin từ các Identity Provider như Facebook, Google mà mình đã đăng nhập
  3. Lưu trữ những thông tin trên vào 1 database (DynamoDB chẳng hạn) đã được định sẵn

Hoàn toàn khả thi. Nhưng sẽ gặp một số vấn đề đấy - không nhỏ đâu (mình không tranh luận ở đây). Đây là lúc ta phải cần đến Cognito Synchronize

Amazon Cognito Syn

Sau khi đăng nhập vào hệ thống, Cognito sẽ tạo cho mỗi user 1 Identity ID. Và 1 store nho nhỏ (Các Datasets) để lưu trữ các thông tin cần thiết

Chú ý: Idendity ID này chỉ được tạo khi và chỉ khi người dùng Authenticate thành công. Nếu quản trị viên vào cố tình xóa ID này thì sau khi user đăng nhập lại, Cognito sẽ tự tạo 1 Identity ID mới (khác với ID ban đầu). Vì sao mình phải nhấn mạnh điều này, vì có một số dịch vụ phải cần ID này để thao tác trực tiếp             </div>
            
            <div class=

0