How do I call an API Gateway with Cognito credentials in Python

前端 未结 4 1948
时光取名叫无心
时光取名叫无心 2020-12-16 01:53

I\'ve managed to setup an API Gateway secured with Cognito. The unauthenticated user role has an access policy that should grant it access to the gateway. I\'ve also managed

相关标签:
4条回答
  • 2020-12-16 02:31

    Here is an example from our public docs: http://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html

    Cognito creds are no different than any other temporary creds, and the signing process is also the same. If you want to move back to Python the example above should be good, or I would guess that there are third-party libraries out there to do the signature for you.

    0 讨论(0)
  • 2020-12-16 02:40

    The following code (and the requests-aws4auth library) did the job:

    import boto3
    import datetime
    import json
    from requests_aws4auth import AWS4Auth
    import requests
    
    boto3.setup_default_session(region_name='us-east-1')
    identity = boto3.client('cognito-identity', region_name='us-east-1')
    
    account_id='XXXXXXXXXXXXXXX'
    identity_pool_id='us-east-1:YYY-YYYY-YYY-YY'
    api_prefix='ZZZZZZZZZ'
    
    response = identity.get_id(AccountId=account_id, IdentityPoolId=identity_pool_id)
    identity_id = response['IdentityId']
    print ("Identity ID: %s"%identity_id)
    
    resp = identity.get_credentials_for_identity(IdentityId=identity_id)
    secretKey = resp['Credentials']['SecretKey']
    accessKey = resp['Credentials']['AccessKeyId']
    sessionToken = resp['Credentials']['SessionToken']
    expiration = resp['Credentials']['Expiration']
    
    print ("\nSecret Key: %s"%(secretKey))
    print ("\nAccess Key %s"%(accessKey))
    print ("\nSession Token: %s"%(sessionToken))
    print ("\nExpiration: %s"%(expiration))
    
    method = 'GET'
    headers = {}
    body = ''
    service = 'execute-api'
    url = 'https://%s.execute-api.us-east-1.amazonaws.com/dev/helloworld' % api_prefix
    region = 'us-east-1'
    
    auth = AWS4Auth(accessKey, secretKey, region, service, session_token=sessionToken)
    response = requests.request(method, url, auth=auth, data=body, headers=headers)
    print(response.text)
    
    0 讨论(0)
  • 2020-12-16 02:43

    identity_pool_id how to get

    If you have not federated pool which could give you "identity_pool_id" , execution code below will give you identity_pool_id

    import boto3
    boto3.setup_default_session(
        aws_access_key_id='AKIAJ7TBC72BPWNEWIDQ', 
        aws_secret_access_key='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', 
        region_name='ap-southeast-2')
    
    client = boto3.client('cognito-identity')
    response = client.list_identity_pools(MaxResults=3,)
    
    print("IdentityPoolId-- ", response)
    
    0 讨论(0)
  • 2020-12-16 02:51

    My code is based largely on the questioner's own answer, but I've tried to make it clearer where all the values come from.

    import boto3
    import requests
    from requests_aws4auth import AWS4Auth
    # Use 'pip install boto3 requests requests-aws4auth' to get these
    
    region_name = 'ap-southeast-2' # or 'us-west-1' or whatever
    
    # 12 decimal digits from your AWS login page
    account_id = '123456789012'
    
    # I've only found this in the sample code for other languages, e.g. JavaScript
    # Services→Cognito→Manage Federated Identities→(your-id-pool)→Sample code
    identity_pool_id = 'ap-southeast-2:fedcba98-7654-3210-1234-56789abcdef0'
    
    # Create a new identity
    boto3.setup_default_session(region_name = region_name)
    identity_client = boto3.client('cognito-identity', region_name=region_name)
    identity_response = identity_client.get_id(AccountId=account_id,
        IdentityPoolId=identity_pool_id)
    
    # We normally wouldn't log this, but to illustrate:
    identity_id = identity_response['IdentityId']
    print ('identity_id:', identity_id) # good idea not to log this
    
    # Get the identity's credentials
    credentials_response = identity_client.get_credentials_for_identity(IdentityId=identity_id)
    credentials = credentials_response['Credentials']
    access_key_id = credentials['AccessKeyId']
    secret_key = credentials['SecretKey']
    service = 'execute-api'
    session_token = credentials['SessionToken']
    expiration = credentials['Expiration']
    # Again, we normally wouldn't log this:
    print ('access_key_id', access_key_id)
    print ('secret_key', secret_key)
    print ('session_token', session_token)
    print ('expiration', expiration)
    # The access_key_id will look something like 'AKIABC123DE456FG7890', similar to
    # Services→IAM→Users→(AWS_USER_NAME)→Security credentials→Access key ID
    
    # Get the authorisation object
    auth = AWS4Auth(access_key_id, secret_key, region_name, service,
        session_token=session_token)
    current_app['auth'] = auth
    # Just an illustration again:
    print ('auth: %(service)s(%(date)s) %(region)s:%(access_id)s' % auth.__dict__)
    
    # We'll use that object to send a request to our app. This app doesn't
    # exist in real life, though, so you'll need to edit the following quite
    # heavily:
    
    # Services→Cognito→Manage your User Pools→(your-user-pool)→Apps→App name
    app_name = 'my-app-name'
    
    api_path = 'dev/helloworld'
    method = 'GET'
    headers = {}
    body = ''
    url = 'https://%s.%s.%s.amazonaws.com/%s' % (app_name, service, region_name,
        api_path)
    response = requests.request(method, url, auth=auth, data=body, headers=headers)
    
    0 讨论(0)
提交回复
热议问题