Как предоставить пользовательские данные от конечной точки шлюза API к лямбда-авторизатору - PullRequest
0 голосов
/ 16 ноября 2018

Конечные точки API-шлюза, которые мы используем, должны быть ограничены с помощью разрешений для определенной аудитории.

Идея состоит в том, чтобы использовать lambda-авторизатор для получения разрешений от внешней службы, а затем создать политику, чтобы разрешить илизапретить доступ к конечной точке.

Для сопоставления разрешений с конечной точкой API конечная точка должна будет предоставить разрешения, необходимые для авторизатора.

Теперь у меня вопрос, как я могу обогатитьданные конечной точки с собственными необходимыми разрешениями и их использование в лямбда-выражении авторизатора (возможно, через событие) для дальнейшей проверки.

Пример:

  • Пользователь1 перенаправляется на первую конечную точку GET / petstore / pets (для этой конечной точки требуется разрешение -> Просмотр: Pets )
  • Lambda авторизатор запрашивает разрешения пользователя у внешней службы
  • Служба возвращает: [ Вид: Домашние животные , Вид: Somethingelse и т. Д.]
  • Лямбда-мат авторизатораches пользовательские разрешения для требуемого разрешения конечной точки и создает политику разрешений для совпадения
  • User2 делает то же самое, но не имеет разрешения для просмотра домашних животных, нет совпадений -> Запретить

Вот мой код для лямбды:

import {Callback, Context} from 'aws-lambda';
import {Authorizer} from './authorizer';

export class App {

    constructor(private authorizer: Authorizer = new Authorizer()) {
    }

    public handleEvent(event, callback: Callback): Promise<void> {
        return this.authorizer.checkAuthorization(event, callback)
            .then((policy) => callback(null, policy))
            .catch((error) => callback(error, null));
    }

}

const app: App = new App();

module.exports.lambda_handler = async (event) => {
    return await app.handleEvent(event);
};

Код для метода checkAuthorization:

export class Authorizer {


    public resourceAuthorizer: ResourceAuthorizer = new ResourceAuthorizer();
    public authenticationChecker: AuthenticationChecker = new AuthenticationChecker();

    public checkAuthorization(event, callback): Promise<object> {

        const endpointPermissions = event.endpointPermissions;  // <== this is what I need, a custom field in the event which
                                                            // is provided from the api endpoint in some way
                                                            // in my example this whould contain a string or json 
                                                            // with 'View:Pets' and 'View:Somethingelse'

        return this.authenticationChecker.check(event)
            .then((decodedJwt) => {
                const principalId: string = decodedJwt.payload.sub;

            return Promise.resolve(decodedJwt)
                .then((jwt) => this.resourceAuthorizer.check(jwt, event.endpointPermissions))
                .then((payload) => callback(null,
                getAuthorizationPolicy(principalId, 'Allow', event.endpointPermissions, payload)))
                .catch((payload) => callback(null,
                getAuthorizationPolicy(principalId, 'Deny', event.endpointPermissions, payload)));
            }).catch((error) => {
                console.log(error);
                callback('Unauthorized');
            });
    }
}

event.endpointPermissions в основном то, что я ищу,В зависимости от конечной точки API это должно быть заполнено необходимыми разрешениями для этой конечной точки.Затем resourceAuthorizer извлекает разрешения пользователей из внешней службы и сравнивает их с endpointPermissions, а затем создает политики «Разрешить» или «Запретить».

Итак, где я могу ввести endpointPermissions в моей конечной точке API, чтобы предоставить их авторизатору?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

У меня есть решение моей проблемы без разбора ARN, но оно довольно нетрадиционно:

  1. В методе запроса ресурса создайте параметры строки запроса URL с именами разрешений и установите флажок для «требуемого» * ​​1004 *

method request URL query string parameters

  1. Когда запрос вызывается из клиента (почтальона), эти обязательные параметры должны предоставляться как ключи, они зависят от конечной точки. Значения не имеют значения, потому что при оценке будут использоваться только ключи.

postman request parameters

  1. Событие, полученное авторизатором, теперь содержит queryStringParameters, который можно оценить для дальнейшего использования.

    queryStringParameters in cloudwatch

0 голосов
/ 16 ноября 2018

Событие, передаваемое в Authorizer, содержит methodArn в формате:

arn:aws:execute-api:<Region id>:<Account id>:<API id>/<Stage>/<Method>/<Resource path>

Это даст вам необходимый метод и путь к ресурсу.Это также даст вам идентификатор API, но не имя самого API.

Идентификатор API можно использовать для получения имени API с помощью AWS SDK.См. здесь .

. Это должно дать вам все необходимое для построения значения endpointPermissions.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...