def validate_params(self): params = self.event['request']['userAttributes'] if UserUtil.check_try_to_register_as_line_user(self.event['userName']) or \ UserUtil.check_try_to_register_as_twitter_user(self.event['userName']) or \ UserUtil.check_try_to_register_as_yahoo_user(self.event['userName']) or \ UserUtil.check_try_to_register_as_facebook_user(self.event['userName']): raise ValidationError("external provider's user can not execute") if params.get('phone_number', '') != '' and \ params.get('phone_number_verified', '') != 'true' and \ self.event['triggerSource'] != 'CustomMessage_ForgotPassword': validate(params, self.get_schema()) client = boto3.client('cognito-idp') response = client.list_users( UserPoolId=self.event['userPoolId'], Filter='phone_number = "%s"' % params['phone_number'], ) for user in response['Users']: for attribute in user['Attributes']: if attribute[ 'Name'] == 'phone_number_verified' and attribute[ 'Value'] == 'true': raise ValidationError( 'This phone_number is already exists') # セキュリティ観点より、電話番号変更を実行させない。 # これにより XSS が発生したとしても、電話番号認証が必要な処理は回避が可能 if self.event['triggerSource'] == 'CustomMessage_VerifyUserAttribute': # phone_number_verified が true の場合は電話番号変更を行っていないため当チェックは不要 if params.get('phone_number_verified', '') != 'true': self.__validate_has_not_token(params) # サードパーティを利用したユーザの場合、パスワード変更を実行させない if self.event['triggerSource'] == 'CustomMessage_ForgotPassword': # サードパーティを利用したユーザかを確認 if UserUtil.is_external_provider_user(self.dynamodb, self.event['userName']): raise ValidationError( "external provider's user can not execute")
def test_is_external_provider_user_ng(self): self.assertFalse( UserUtil.is_external_provider_user(self.dynamodb, 'test-user'))
def test_is_external_provider_user_ok(self): self.assertTrue( UserUtil.is_external_provider_user(self.dynamodb, 'user_id'))