пользовательские авторизаторы в Amazon API Gateway 500 ошибка

Я использую Serverless-Authentication-template и хочу сопоставить настраиваемый ответ об ошибке. Но он всегда возвращает ошибку 500.

authorize.js

// Authorize
function authorize(event, callback) {
  let providerConfig = config(event);
  try {
    let data = utils.readToken(event.authorizationToken, providerConfig.token_secret);
    console.log("Decrypted data: " + JSON.stringify(data));

    let methodArn = event.methodArn.replace(/(GET|POST|PUT|DELETE)/g, '*').replace(/mgnt.+/g, 'mgnt/*');

    console.log(`Change methodArn to: ${methodArn}`);

    // TODO: handle expiration time validation
    callback(null, utils.generatePolicy(
      data.id, // which is $context.authorizer.principalId
      'Allow',
      methodArn));
  } catch (err) {
    console.log(err);
    callback('401 Unauthenticated');
  }
}

s-function.json

responses:{ 
  "401 Unauthenticated.*": {
      "statusCode": "401"
  },
  "default": {
      "statusCode": "200",
      "responseModels": {
        "application/json;charset=UTF-8": "Empty"
      },
      "responseTemplates": {
        "application/json;charset=UTF-8": ""
      }
  }
}

person Jim    schedule 29.07.2016    source источник


Ответы (1)


После спросите в Amazon Web Services.

К сожалению, отображение Authorizer в настоящее время не настраивается, и каждая ошибка, возвращаемая лямбда-функцией, будет отображаться на код состояния 500 в шлюзе API. Более того, сопоставление выполняется на точном совпадении строки вывода, поэтому, чтобы вернуть клиенту предполагаемую ошибку 401, вы должны выполнить вызов context.fail ('Unauthorized') ;.

Наконец я меняю

callback('401 Unauthenticated');

to

context.fail('Unauthorized');

и работать нормально.

Поделиться кому может с этим столкнуться.

person Jim    schedule 29.07.2016
comment
Это задокументировано где-нибудь в AWS? - person Noel Llevares; 19.12.2016
comment
Здесь REF - person Jim; 18.02.2017
comment
Мне не удалось найти метод fail() в документации, на которую вы ссылались, однако я сделал найти здесь. В документации указано We recommend you use the callback, поэтому кажется, что она устарела, однако на данный момент я не вижу лучшего решения для возврата 401. - person mb-ca; 20.03.2018
comment
Проблема в том, что context.fail('Unauthorized'); приводит к неудачному выполнению лямбды. И когда у вас есть сигнал тревоги, который срабатывает при каждом неудачном выполнении лямбда-выражения, вы будете получать уведомления для каждого несанкционированного запроса. Это может быть токен с истекшим сроком действия, что нормально и не должно приводить к неудачному выполнению лямбда-выражения. - person VolkerK; 20.07.2018
comment
Добавление этого действительно работает, но затем я получаю предупреждение. «Authorizer» функции Auth вернул обещание, а также использует обратный вызов! Есть ли какой-нибудь безопасный способ сделать это с помощью Promise? - person MoshMcCabe; 28.02.2020
comment
Пожалуйста, не размещайте ссылки на документацию AWS. Это всегда бесполезно. - person shredding; 03.06.2020