Tự động set password cho user cognito

Khi sử dụng Cognito, sẽ có gặp case user status là FORCE_CHANGE_PASSWORD, nhưng nghiệp vụ là user không tự thay đổi password được. Ta có thể sử dụng API admin set userpassword của Cognito để thay đổi điều này:

https://bobbyhadz.com/blog/aws-cognito-change-force-change-password

Tuy nhiên, nếu chúng ta muốn tự động thay đổi, không muốn phải làm manually ngay khi user được tạo ra thì sẽ làm như thế nào?

Ta có thể triển khai 1 mô hình như sau:

Cognito userpool cho phép sử dụng Lambda function để custom workflow:

https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html

Do đó, chúng ta sẽ sử dụng 1 Presign up Lambda function, và Lambda này sẽ publish message sang SNS khi user tạo xong. SNS này sẽ có subscription là lambda admin set password.

Hàm set password sẽ có logic dạng sau:

  • Generate ra chuỗi string random để làm mật khẩu cho người dùng

  • Call API AdminSetUserPassword (docs.aws.amazon.com/cognito-user-identity-p..) để set password cho người dùng

  • Do chuỗi string là random, nên chúng ta sẽ ghi vào trong Secret Manager để tránh thất thoát mật khẩu, và có thể lấy gửi cho người dùng.

Lưu ý:

  • Để tránh bị ghi đè giá trị của user trước trong Secret manager, ta sẽ cần phải retrive giá trị hiện tại trong secret manager, append giá trị mới vào rồi put secret value lại

  • Chuỗi random dẫu đã được set độ dài, vẫn có thể không đáp ứng tiêu chuẩn bảo mật của Cognito. Do đó, nên generate random password meeting constraints, dạng như sau:

while True:
    pwd = ''
    for i in range(pwd_length):
      pwd += ''.join(secrets.choice(alphabet))

    if (any(char in special_chars for char in pwd) and 
        sum(char in digits for char in pwd)>=2) and any(char in uppercase for char in pwd):
          break