it-swarm.com.de

AWS Cognito Authentication USER_PASSWORD_AUTH-Ablauf ist für diesen Client nicht aktiviert

Ich habe eine mobile App mit Benutzerpool (Benutzername und Passwort). Die App funktioniert gut mit aws-amplify sdk. Wollte aber den Code zu Lambdas verschieben. Also habe ich das folgende Lambda mit Boto3 geschrieben.

Hier ist Lambda:

import boto3

def lambda_handler(event, context):
    client = boto3.client('cognito-idp')
    response = client.initiate_auth(
        ClientId='xxxxxxxxxxxxxx',
        AuthFlow='USER_PASSWORD_AUTH',
        AuthParameters={
            'USERNAME': 'xxxxxx',
            'PASSWORD': 'xxxxxx'
        }
    )
    return response

Versucht auch admin_initiate_auth. 

import boto3
def lambda_handler(event, context):
    client = boto3.client('cognito-idp')
    response = client.initiate_auth(
        UserPoolId='xxxxxxxxx',
        ClientId='xxxxxxxxxxxxxx',
        AuthFlow='USER_PASSWORD_AUTH',
        AuthParameters={
            'USERNAME': 'xxxxxx',
            'PASSWORD': 'xxxxxx'
        }
    )
    return response

Hier ist der Fehler den ich bekomme.

Beim Aufrufen von .__ ist ein Fehler aufgetreten (InvalidParameterException). InitiateAuth-Vorgang: USER_PASSWORD_AUTH-Fluss für diesen .__ nicht aktiviert. client: InvalidParameterException Traceback (letzter Aufruf zuletzt):
Datei "/var/task/lambda_function.py", Zeile 12, in lambda_handler 'PASSWORD': 'xxxxx' Datei "/var/runtime/botocore/client.py", Zeile 317, in _api_call return self._make_api_call (operation_name, kwargs) Datei "/var/runtime/botocore/client.py", Zeile 615, in _make_api_call error_class erhöhen (parsed_response, operation_name) InvalidParameterException: Ein Fehler ist aufgetreten (InvalidParameterException) beim Aufrufen der InitiateAuth-Operation: Der USER_PASSWORD_AUTH-Fluss ist für diesen Client nicht aktiviert

Irgendwelche Gedanken?

6
user9374347

Habe es mir gedacht. Ich habe einen Benutzerpool -> App-Clients -> Details anzeigen -> Aktiviert den Benutzernamen-Kennwort-Fluss (nicht SRP) für die App-basierte Authentifizierung (USER_PASSWORD_AUTH).

Das hat es behoben.

16
user9374347

Ich habe es herausgefunden. Trotz AuthFlow übergeben Sie ExplicitAuthFlows, dann sollte es funktionieren

import boto3
def lambda_handler(event, context):
    client = boto3.client('cognito-idp')
    response = client.initiate_auth(
        UserPoolId='xxxxxxxxx',
        ClientId='xxxxxxxxxxxxxx',
        ExplicitAuthFlows='USER_PASSWORD_AUTH',
        AuthParameters={
            'USERNAME': 'xxxxxx',
            'PASSWORD': 'xxxxxx'
        }
    )
    return response

`

0
Afsheen. Nazish

Für mich habe ich festgestellt, dass meine Anmeldeinformationen einen hmac benötigen, hier ist die Klasse für den Fall, dass sie für jemanden nützlich ist.

import boto3
import boto3.session
import hmac, base64, hashlib
from botocore.client import ClientMeta

class AwsAuth(object):
    '''
    classdocs
    '''

    def gettoken(self):
        if self.token:
            return self.token
        else:
            return False

    def connect(self):

        if not self.username:
            self.username = raw_input("Username: ")

        if not self.password:
            self.password = raw_input("Password: ")

        digest = self.gethmacdigest(self.username)

        response = self.client.initiate_auth(
            ClientId=self.clientid,
            AuthFlow='USER_PASSWORD_AUTH',
            AuthParameters={
                'USERNAME': self.username,
                'PASSWORD': self.password,
                'SECRET_HASH': digest
            },
            ClientMetadata={
                'UserPoolId': self.userpoolid
            }
        )
        self.token = response
        return response

    def gethmacdigest(self, username):

        message = username + self.clientid
        Dig = hmac.new(self.clientsecret, msg=message.encode('UTF-8'), digestmod=hashlib.sha256).digest()    
        return base64.b64encode(Dig).decode()


    def __init__(self, path, url, fileout, filein, userpoolid, clientid, clientsecret, region, username = None, password = None):
        '''
        Constructor
        '''

        #boto3.set_stream_logger('botocore', level="DEBUG")

        self.path = path
        self.url = url
        self.fileout = fileout
        self.filein = filein
        self.userpoolid = userpoolid
        self.clientid = clientid
        self.clientsecret = clientsecret
        self.region = region
        self.token = ""

        boto3.setup_default_session(region_name=region) 

        self.client = boto3.client('cognito-idp')
        if username is not None:
            self.username = username
        else:
            self.username = None
        if password is not None:
            self.password = password
        else:
            self.password = None
0
JazzDeben