Бессерверный пользовательский авторизатор приводит к неопределенным результатам - PullRequest
1 голос
/ 13 февраля 2020

Я следовал учебным пособиям и примерам онлайн о том, как реализовать собственные средства авторизации для моей лямбда-функции. К сожалению, у меня проблемы с доступом к контексту авторизатора внутри моей функции. Выполнение console.log(event.requestContext.authorizer); приводит только к undefined. Я что-то пропустил? Вот небольшой фрагмент.

# serverless.yml

...
myAuthorizer:
  handler: src/functions/myAuthorizer/index.handler

someFunction:
  handler: src/functions/someFunction/index.handler
  events:
    - http:
        method: GET
        path: /hello-world
        authorizer:
          name: myAuthorizer
          identitySource: method.request.header.Authorization
// myAuthorizer.ts

export async function handler(
  event: AWSLambda.CustomAuthorizerEvent,
  context: AWSLambda.Context
): Promise<AWSLambda.AuthResponse> {

  const user = {id: 1, email: 'user@test.com'};

  // some logic...

  return {
    principalId: user.id,
    policyDocument: {
      Version: '2012-10-17',
      Statement: [
        {
          Action: '*',
          Effect: 'Allow',
          Resource: '*',
        },
      ],
    },
    context: { user },
  };
}

// someFunction.ts

export async function handler(
  event: AWSLambda.APIGatewayEvent,
  context: AWSLambda.Context
): Promise<AWSLambda.APIGatewayProxyResult> {

  console.log(event.requestContext.authorizer); // <-- this is undefined
  console.log(Object.keys(event.requestContext)); // <-- no "authorizer" property
  return {
    statusCode: 200,
    body: JSON.stringify({hello: 'world'}),
  };
}

Заранее спасибо!

1 Ответ

1 голос
/ 13 февраля 2020

В функции обработчика myAuthorizer используйте стиль callback вместо стиля async/await.

export async function handler(
  event: AWSLambda.CustomAuthorizerEvent,
  context: AWSLambda.Context
): Promise<void> { // change to void

  const user = { id: 1, email: 'user@test.com' };

  // some logic...

  context.succeed({ // instead of return policy object
    principalId: user.id,
    policyDocument: {
      Version: '2012-10-17',
      Statement: [
        {
          Action: '*',
          Effect: 'Allow',
          Resource: '*',
        },
      ],
    },
    context: { user },
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...