¿Cómo se resuelven los errores “No autorizado” al ejecutar solicitudes GraphQL en AWS AppSync?

Actualización más reciente: 20 de julio de 2022

Aparecen errores “No autorizado” al ejecutar solicitudes GraphQL con AWS AppSync. ¿Cómo se solucionan estos errores?

Descripción breve

Existen dos tipos de errores del tipo no autorizado que se definen por el código de estado HTTP que se devuelve en la respuesta:

  • 401 No autorizado: AWS AppSync o el modo de autorización deniegan la solicitud porque faltan las credenciales o estas no son válidas.
  • Respuesta 200 OK con un error de tipo No autorizado: la solicitud se deniega debido a un problema en el nivel de resolvedor o más allá de este.

Para determinar la causa del error por falta de autorización, intente reproducir el problema en un navegador web. A continuación, utilice las herramientas de red del navegador para capturar los mensajes de solicitud y respuesta HTTP. Analice los mensajes para determinar dónde se produjo el error. Para analizarlos sin conexión, guarde los mensajes en un archivo HTTP (HAR).

Resolución

401 Respuesta no autorizada

En el caso de una respuesta 401 No autorizada, compruebe la solicitud de red que envía la carga de GraphQL para confirmar que:

  • El encabezado Autorización o x-api-key está presente y contiene las credenciales correctas para el modo de autorización que requiere la operación o el campo. Si el encabezado no tiene las credenciales correctas, el modo de autorización rechaza la solicitud.
  • En el caso de los tokens web JSON (JWT), el encabezado Autorización no incluye el texto “Portador” (del sitio web de GitHub).
  • El JWT pertenece al grupo de usuarios de Amazon Cognito o al proveedor OIDC correcto.
  • Las credenciales son válidas y no han caducado.

Respuesta 200 OK

Para obtener más información sobre qué causa los errores No autorizado para una respuesta 200 OK, active los registros de Amazon CloudWatch en la API de AWS AppSync. Como práctica recomendada para la resolución de problemas, establezca el registro a nivel de campo en Todos, e incluya contenido detallado.

Las solicitudes que reciben una respuesta 200 OK con el tipo de error No autorizado y el mensaje No autorizado para acceder a X en el tipo Y son denegadas por la lógica en las plantillas de asignación de resolvedores de Apache Velocity Template Language (VTL). Para resolver este problema, complete los siguientes pasos de solución de problemas según el modo de autorización que utilice.

Autorización de Amazon Cognito y OIDC

Compare las reclamaciones de tokens de usuario, como grupos, email_verified e ID de cliente o público, con las comprobaciones de autorización en las plantillas de asignación de resolvedores de VTL. Puede utilizar la herramienta externa jwt.io (de AuthO) para comprobar las reclamaciones de tokens. Si utiliza AWS Amplify, verifique que las reclamaciones de tokens admiten los requisitos de la regla de autorización en el tipo de esquema del modelo.

Por ejemplo, la siguiente plantilla de asignación de resolvedores para Amplify comprueba los datos que se transmiten desde la comprobación de autorización preliminar que realiza AWS AppSync.

#if( $util.authType() == "User Pool Authorization" )
  #if( !$isAuthorized )
    #set( $staticGroupRoles = [{"claim":"cognito:groups","entity":"Admin","allowedFields":xxxxx,yyyyy}] )
    #foreach( $groupRole in $staticGroupRoles )
      #set( $groupsInToken = $util.defaultIfNull($ctx.identity.claims.get($groupRole.claim), []) )
      #if( $groupsInToken.contains($groupRole.entity) )
        #if( $groupRole.isAuthorizedOnAllFields )
          #set( $isAuthorized = true )
          #break
        #else
          $util.qr($allowedFields.addAll($groupRole.allowedFields))
        #end
      #end
    #end
  #end
#end

Además, si utiliza Amplify, verifique que las reglas de autorización del esquema permiten las operaciones de creación, lectura, actualización o eliminación.

Autorización de IAM

Revise las políticas que se aplican al usuario o rol de AWS Identity and Access Management (IAM) que firma la solicitud a AWS AppSync. Compruebe que appsync:GraphQL está concedido en el bloque Acción para cada uno de los campos a los que el usuario accede.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "appsync:GraphQL"
      ],
      "Resource": [
        "arn:aws:appsync:us-east-1:111122223333:apis/graphql-api-id/types/Query/fields/field-1",
        "arn:aws:appsync:us-east-1:111122223333:apis/graphql-api-id/types/Mutation/fields/field-2"
      ]
    }
  ]
}

Nota: Sustituya graphql-api-id por el ID de la API GraphQL y field-1 y field-2 por sus campos.

Si utiliza Amplify para generar las plantillas de asignaciones de resolvedores, verifique lo siguiente:

  • El nombre de sesión del rol con el que se emiten las credenciales de IAM es igual a CognitoIdentityCredentials.
  • Las credenciales de IAM son las mismas que el rol autorizado o no autorizado que Amplify genera.

Si el nombre de la sesión del rol no coincide con la cadena, se deniega el acceso al campo o a la operación.

Autorización de Lambda

  • Compruebe cualquier lógica personalizada que escribió en el código de la función de Lambda donde se emite isAuthorized para garantizar que está establecido en verdadero.
  • Asegúrese de que la matriz deniedFields no contiene el campo o la operación solicitada.
  • Compruebe los registros de CloudWatch, o agregue instrucciones de depuración, para verificar el flujo lógico para determinar la autorización del usuario.

Uso de varios modos de autorización

Cuando la API de AWS AppSync tiene varios modos de autorización, la API utiliza el modo de autorización predeterminado que se haya establecido. Para un tipo o campo que requiera uno de los demás modos de autorización, debe establecer también una directiva de autorización para ese modo. Para obtener más información, consulte Utilizar varios tipos de autorización con las API GraphQL de AWS AppSync.

Por ejemplo, una API de AWS AppSync tiene establecido API_KEY como modo de autorización predeterminado y tiene AMAZON_COGNITO_USER_POOLS como modo de autorización adicional. Si desea utilizar ambos modos, deberá establecer las directivas de autorización @aws_api_key y @aws_cognito_user_pools.

type Post @aws_api_key @aws_cognito_user_pools {
 id: ID!
 author: String
 title: String
}

Nota: El modo de autorización API_KEY predeterminado rechaza las solicitudes debido a los siguientes motivos:

  • Se envía un JWT de Amazon Cognito en el encabezado de la solicitud.
  • Faltan las directivas en el esquema GraphQL.

¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?