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:
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