मुझे एक स्वचालित पासवर्ड रीसेट स्क्रिप्ट बनाने की आवश्यकता है। मैंने इसे आजमाने और ट्रैक करने के लिए एक कस्टम फ़ील्ड बनाया है और यह भी आशा करता हूं कि मैं कुछ मानक फ़ील्ड तक पहुंच सकता हूं। इस स्क्रिप्ट को निम्नलिखित मानदंड वाले उपयोगकर्ता ढूंढ़ने चाहिए:

निम्नलिखित 3 में से कोई भी नवीनतम तिथि जो >= ९० दिन पहले की है: साइन_अप, फॉरगॉट_पासवर्ड, या कस्टम: pwdCreateDate

मुझे इस पर जानकारी प्राप्त करने के लिए कोई भी boto3 कॉग्निटो क्लाइंट तरीके नहीं मिल रहे हैं, सिवाय पासवर्ड भूल गए जो admin_list_user_auth_events में दिखाई देता है और उस प्रतिक्रिया में प्रतिक्रिया में उपयोगकर्ता नाम शामिल नहीं है। मुझे लगता है कि चूंकि आप घटनाओं को प्राप्त करने के लिए उपयोगकर्ता नाम प्रदान करते हैं, इसलिए आप घटनाओं से नवीनतम भूल गए पासवर्ड को खोजने और इसे उपयोगकर्ता नाम से जोड़ने का तरीका समझ सकते हैं।

क्या इन क्षेत्रों में से किसी के आधार पर पासवर्ड रीसेट करने के लिए बाध्य करने के लिए खाते को सेट करने के लिए किसी और ने कोई boto3 स्वचालन लागू किया है?

1
Shenanigator 10 जिंदा 2020, 20:11

1 उत्तर

सबसे बढ़िया उत्तर

यह वह जगह है जहां मैं उतरा, इसे इस समझ के साथ लें कि कोगिनिटो की कुछ सीमाएं हैं जो सही निर्दोष पासवर्ड रोटेशन को कठिन बनाती हैं। यह भी जानें कि क्या आप स्क्रिप्ट को और अधिक कुशल बना सकते हैं क्योंकि लैम्ब्डा में आप शायद व्यवस्थापक एपीआई पर 5RPS के कारण लगभग 350 से अधिक उपयोगकर्ताओं के साथ समय निकाल सकते हैं।

पूर्वापेक्षाएँ: लैम्ब्डा फ़ंक्शन को 5 समवर्ती पर सेट करें या आप 5RPS की सीमा से अधिक हो जाएंगे। आपके कॉग्निटो यूजरपूल में 1 परिवर्तनशील फ़ील्ड एक तिथि डालने के लिए विशेषता है। एक कस्टम लैम्ब्डा ज़िप फ़ाइल जिसमें पांडा को s3 में सहेजा गया है।

import os
import sys

# this adds the parent directory of bin so we can find the  module
parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
sys.path.append(parent_dir)
#This addes venv lib/python2.7/site-packages/ to the search path
mod_path = os.path.abspath(parent_dir+"/lib/python"+str(sys.version_info[0])+"."+str(sys.version_info[1])+"/site-packages/")
sys.path.append(mod_path)

import boto3
import datetime
import pandas as pd
import time

current_path = os.path.dirname(os.path.realpath(__file__))
# Use this one for the parent directory
ENV_ROOT =  os.path.abspath(os.path.join(current_path, os.path.pardir))
# Use this one for the current directory
#ENV_ROOT =  os.path.abspath(os.path.join(current_path))
sys.path.append(ENV_ROOT)

#if __name__ == "__main__":
def lambda_handler(event, context):
    user_pool_id = os.environ['USER_POOL_ID']
    idp_client = boto3.client('cognito-idp')
    users_list = []
    page_token = None    
    dateToday = datetime.datetime.today().date()

    def update_user(user) :
        idp_client.admin_update_user_attributes(
            UserPoolId = user_pool_id,
            Username = user,
            UserStatus = 'RESET_REQUIRED',
            UserAttributes = [
                    {
                        'Name': 'custom:pwdCreateDate',
                        'Value': str(dateToday)
                    }            
                ]
            )   


    users = idp_client.list_users(
        UserPoolId = user_pool_id
        )
    for user in users['Users']: users_list.append(user['Username'])
    page_token = users['PaginationToken']

    while 'PaginationToken' in users :
        users = idp_client.list_users(
            UserPoolId = user_pool_id,
            PaginationToken = page_token
            )
        for user in users["Users"]: users_list.append(user["Username"])

        if 'PaginationToken' in users :
            page_token = users['PaginationToken']

    attrPwdDates = []
    for i in range(len(users_list)) :
        userAttributes = idp_client.admin_get_user(
                UserPoolId = user_pool_id,
                Username = users_list[i]
                )
        for a in userAttributes['UserAttributes'] :
            if a['Name'] == 'custom:pwdCreateDate' :
                attrPwdDates.append(datetime.datetime.strptime(a['Value'], '%Y-%m-%d %H:%M:%S.%f').date())
        time.sleep(1.0)

    list_of_userattr_tuples = list(zip(users_list, attrPwdDates))                            
    df1 = pd.DataFrame(list_of_userattr_tuples,columns = ['Username','Password_Last_Set'])

    authPwdDates = []
    for i in range(len(users_list)) :
        authEvents = idp_client.admin_list_user_auth_events(
        UserPoolId = user_pool_id,
        Username = users_list[i]
        )

        for event in authEvents['AuthEvents'] :
            if event['EventType'] == 'ForgotPassword' and event['EventResponse'] == 'Pass' :
                authPwdDates.append(event['CreationDate'].date())
                break
        time.sleep(1.0)

    list_of_userauth_tuples = list(zip(users_list, authPwdDates))        
    df2 = pd.DataFrame(list_of_userauth_tuples,columns = ['Username','Password_Last_Forgot'])

    df3 = df1.merge(df2,how='left', on = 'Username')

    df3[['Password_Last_Set','Password_Last_Forgot']] = df3[['Password_Last_Set','Password_Last_Forgot']].apply(pd.to_datetime)

    cols = ['Password_Last_Set','Password_Last_Forgot']
    df4 = df3.loc[df3[cols].max(axis=1)<=pd.Timestamp.now() - pd.Timedelta(90, unit='d'), 'Username']

    for i,r in df4.iterrows() :
        update_user(r['Username'])
2
Shenanigator 17 जिंदा 2020, 14:59