API Gateway Custom Authorizer: управляющее сообщение об ошибке и код - PullRequest
0 голосов
/ 04 июня 2018

У меня есть собственный авторизатор для моего Gateway API.Я прочитал много статей о том, как настроить сообщение об ошибке и код, возвращаемый конечному пользователю при ошибках аутентификации или авторизации. Этот вариант казался наиболее полезным .

Проблема в том, что API-шлюз не работает так, как описано в документации.

Моя пользовательская реализация авторизатора (python):

def lambda_handler(event, context):
    raise Exception('the sky is falling!')

Когда я вызываю API с помощью curl:

kash@Laptop$ date; curl -i -X GET -H "Authorization: Bearer 1234abcd`date +%s`" https://xxxx.execute-api.us-west-2.amazonaws.com/prod/ticket
Mon Jun  4 12:27:51 CDT 2018
HTTP/1.1 500 Internal Server Error
Date: Mon, 04 Jun 2018 17:27:53 GMT
Content-Type: application/json
Content-Length: 16
Connection: keep-alive
x-amzn-RequestId: 9cc6d7ce-681c-xxxx-8a4a-23a7616ba4a5
x-amzn-ErrorType: AuthorizerConfigurationException
x-amz-apigw-id: xxxx=

{"message":null}
kash@Laptop$ 

Как мне заставить его возвращать HTTP 4xx с {"message": "the sky is falling!"}?


Дляотладка: я перешел к Ответам шлюза под моим API и обновил «Шаблоны отображения тела» для «Ошибка конфигурации авторизатора (500)» с этого:

{"message":$context.error.messageString}

до этого:

{
      "errorMessage":"$errorMessage",
      "messageString":"$messageString",

      "context.errorMessage":"$context.errorMessage",
      "context.messageString":"$context.messageString",

      "context.error.errorMessage":"$context.error.errorMessage",
      "context.error.messageString":"$context.error.messageString",

      "context.authorizer.error.errorMessage":"$context.authorizer.error.errorMessage"
      "context.authorizer.error.errorMessage":"$context.authorizer.error.errorMessage"
      "context.authorizer.errorMessage":"$context.authorizer.errorMessage"
      "context.authorizer.messageString":"$context.authorizer.messageString"

      "type": "$context.error.responseType",
      "statusCode": "'404'",
      "stage": "$context.stage",
      "resourcePath": "$context.resourcePath",
      "stageVariables.a": "$stageVariables.a",

      "context.apiId": "$context.apiId",
      "context.authorizer.claims.property": "$context.authorizer.claims.property",
      "context.authorizer.principalId": "$context.authorizer.principalId",
      "context.authorizer.property": "$context.authorizer.property",
      "context.httpMethod": "$context.httpMethod",
      "context.error.message": "$context.error.message",
      "context.error.messageString": "$context.error.messageString",
      "context.error.responseType": "$context.error.responseType",
      "context.extendedRequestId": "$context.extendedRequestId",
      "context.identity.accountId": "$context.identity.accountId",
      "context.identity.apiKey": "$context.identity.apiKey",
      "context.identity.apiKeyId": "$context.identity.apiKeyId",
      "context.identity.caller": "$context.identity.caller",
      "context.identity.cognitoAuthenticationProvider": "$context.identity.cognitoAuthenticationProvider",
      "context.identity.cognitoAuthenticationType": "$context.identity.cognitoAuthenticationType",
      "context.identity.cognitoIdentityId": "$context.identity.cognitoIdentityId",
      "context.identity.cognitoIdentityPoolId": "$context.identity.cognitoIdentityPoolId",
      "context.identity.sourceIp": "$context.identity.sourceIp",
      "context.identity.user": "$context.identity.user",
      "context.identity.userAgent": "$context.identity.userAgent",
      "context.identity.userArn": "$context.identity.userArn",
      "context.integrationLatency": "$context.integrationLatency",
      "context.path": "$context.path",
      "context.protocol": "$context.protocol",
      "context.requestId": "$context.requestId",
      "context.requestTime": "$context.requestTime",
      "context.requestTimeEpoch": "$context.requestTimeEpoch",
      "context.resourceId": "$context.resourceId",
      "context.resourcePath": "$context.resourcePath",
      "context.responseLength": "$context.responseLength",
      "context.responseLatency": "$context.responseLatency",
      "context.status": "$context.status",
      "context.stage": "$context.stage"
 }

и ответ:

 {
      "errorMessage":"",
      "messageString":"",

      "context.errorMessage":"",
      "context.messageString":"",

      "context.error.errorMessage":"",
      "context.error.messageString":"null",

      "context.authorizer.error.errorMessage":""
      "context.authorizer.error.errorMessage":""
      "context.authorizer.errorMessage":""
      "context.authorizer.messageString":""

      "type": "AUTHORIZER_CONFIGURATION_ERROR",
      "statusCode": "'404'",
      "stage": "prod",
      "resourcePath": "/ticket",
      "stageVariables.a": "",

      "context.apiId": "xxxx",
      "context.authorizer.claims.property": "",
      "context.authorizer.principalId": "",
      "context.authorizer.property": "",
      "context.httpMethod": "GET",
      "context.error.message": "",
      "context.error.messageString": "null",
      "context.error.responseType": "AUTHORIZER_CONFIGURATION_ERROR",
      "context.extendedRequestId": "xxxx=",
      "context.identity.accountId": "",
      "context.identity.apiKey": "",
      "context.identity.apiKeyId": "",
      "context.identity.caller": "",
      "context.identity.cognitoAuthenticationProvider": "",
      "context.identity.cognitoAuthenticationType": "",
      "context.identity.cognitoIdentityId": "",
      "context.identity.cognitoIdentityPoolId": "",
      "context.identity.sourceIp": "xxx.244.xxx.2",
      "context.identity.user": "",
      "context.identity.userAgent": "curl/7.47.0",
      "context.identity.userArn": "",
      "context.integrationLatency": "",
      "context.path": "/prod/ticket",
      "context.protocol": "HTTP/1.1",
      "context.requestId": "57e2462d-681c-xxxx-7dd93186dc68",
      "context.requestTime": "04/Jun/2018:17:25:57 +0000",
      "context.requestTimeEpoch": "1528133157762",
      "context.resourceId": "pz9fb8",
      "context.resourcePath": "/ticket",
      "context.responseLength": "",
      "context.responseLatency": "",
      "context.status": "",
      "context.stage": "prod"


 }

Я прочитал:

и некоторые другие на форумах AWS.

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

сопоставление ответа авторизатора и шлюза выполняется через

https://docs.aws.amazon.com/apigateway/latest/developerguide/supported-gateway-response-types.html

, вы можете изменить код возврата, чтобы настроить код состояния.

Что касаетсяСообщение об ошибке, я только что попытался добавить поле в мой вывод контекста через авторизатор, как описано здесь, https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-lambda-authorizer-output.html

и сослаться на это поле в моем сопоставлении шаблона для access_denied как $ context.authorizer.myErrorMsg

и это работает, если мой авторизатор выводит документ политики отклонения.

Надеюсь, это поможет

0 голосов
/ 05 июля 2018

В случае, если это кому-то поможет:

CA = пользовательский авторизатор

  • код ошибки : AWS не позволяет полностьюРеализация CA, чтобы продиктовать код ошибки, отправленный обратно вызывающей стороне.
    • Если ЦС возвращает Политику аутентификации, у которой нет ресурса / метода, который был вызван в одном из операторов с действием Разрешить , тогда пользователь получает 403 с чем-то вроде «Не авторизован дляресурс доступа "
    • Если ЦС возвращает Политику аутентификации, в которой есть операторы с действием Запретить , который содержит ресурс / метод, который был вызван, то пользователь получает 403 с чем-то вроде" доступ запрещен явно сa Deny "
    • Если Возникшее CA исключение имеет сообщение" Unauthorized ", то пользователь получает 401 с сообщением" Unauthorized ".
    • Если CA выдает исключение с любым другим сообщением, пользователь получает HTTP-500 внутренняя ошибка сервера (ошибка конфигурации авторизатора) и вызов отклонен / не авторизован.
  • сообщение об ошибке : разрешен только статический контрольчерез шаблон отображения тела в ответах шлюза.
    • Например, вы можете обновить шаблон отображения тела для «Неавторизованный [401]» в «Ответах шлюза», чтобы сказать «Мой сервис не любит вас по неизвестной причине», а затем всякий раз, когда CA выдает исключение «Неавторизованный»конечный пользователь получает HTTP 401 с надписью «Моя служба не любит вас по неизвестной причине».
    • Аналогичным образом вы также можете обновить «Отказано в доступе [403]» или «Ошибка конфигурации авторизатора [500]».Но сообщение является статическим и не может управляться из реализации CA.
    • NOT возможно иметь различные 401 сообщения, такие как:
    • 401: Несанкционировано из-за истекшего токена.
    • 401: не авторизован из-за отсутствия области действия.

Другая не связанная с этим вещь: поскольку в определенных условиях CA выдает исключение, чтобы передать ошибку аутентификации, изС точки зрения метрики это увеличивает показатель Lambda ErrorCount.Таким образом, этот показатель не позволяет определить «ошибки приложения».

...