es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo probar las API protegidas de AWS Cognito en Python?

Estoy intentando probar algunas APIs de AWS que están protegidas por Cognito. Encontré la primera parte de cómo obtener el token Json, pero no puedo entender cómo usar correctamente el token para autenticarme en la API.

Aquí está mi código:

import boto3
import requests

username = 'test@gmail.com'
password = 'test1234567'

client = boto3.client('cognito-idp')
response = client.initiate_auth(
    AuthFlow='USER_PASSWORD_AUTH',
    AuthParameters={
        'USERNAME': username,
        'PASSWORD': password,
    },
    ClientId='12121212121212',
)
token = response['AuthenticationResult']['AccessToken']

url = 'https://XXXXXXXX.execute-api.eu-west-1.amazonaws.com/Prod/incidents'
head = {'Authorization': token}
response = requests.get(url, headers=head)

print(response.content)

Estoy recibiendo el siguiente mensaje de error:

b'{\"message\":\"Authorization header requires \'Credential\' parameter. Authorization header requires \'Signature\' parameter. Authorization header requires \'SignedHeaders\' parameter. Authorization header requires existence of either a \'X-Amz-Date\' or a \'Date\' header. Authorization='

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el encabezado de autorización que se está enviando con la solicitud está incompleto. Para autenticarse con la API, el encabezado de autorización debe incluir la Credencial, la Firma, los Encabezados Firmados y either el encabezado X-Amz-Date o el encabezado Date.

    Una forma de incluir estos encabezados es utilizar el proceso de firma de la Versión 4 de la Firma de AWS. Esto implica firmar la solicitud utilizando el SDK de AWS o una biblioteca de terceros como requests-aws4auth.

    Aquí tienes un ejemplo de cómo incluir los encabezados necesarios utilizando la biblioteca requests-aws4auth:

    import boto3 as boto3
    import requests
    from requests_aws4auth import AWS4Auth
    
    username='test@gmail.com'
    password='test1234567'
    
    client = boto3.client('cognito-idp')
    response =  client.initiate_auth(
        AuthFlow='USER_PASSWORD_AUTH',
        AuthParameters={
            "USERNAME": username,
            "PASSWORD": password,
        },
        ClientId='12121212121212',
    )
    token = response['AuthenticationResult']['AccessToken']
    
    url = 'https://XXXXXXXX.execute-api.eu-west-1.amazonaws.com/Prod/incidents'
    
    headers = {
        'Authorization': token,
        'Content-Type': 'application/json'
    }
    
    auth = AWS4Auth(
        'ACCESS_KEY',
        'SECRET_KEY',
        'eu-west-1',
        'execute-api',
        session_token='SESSION_TOKEN'
    )
    
    response = requests.get(url, headers=headers, auth=auth)
    
    print(response.content)
    

    En este ejemplo, se crea el objeto AWS4Auth utilizando la clave de acceso y la clave secreta de AWS, junto con la región y el nombre del servicio de la API. También se incluye el token de sesión si se utilizan credenciales temporales. El diccionario de encabezados incluye el token de autorización y el tipo de contenido de la solicitud.

    Al incluir el objeto AWS4Auth en la solicitud utilizando el parámetro auth, se añaden los encabezados necesarios a la solicitud y se autentica la API.

Comments are closed.