Правильное место для аудита запроса в Hot Chocolate graphql

Я думаю, следует ли мне проверять запросы пользователей в HttpRequestInterceptor или DiagnosticEventListener для Hot Chocolate v11. Проблема с последним заключается в том, что если аудит не смог записать на диск / базу данных, пользователь уйдет с запросом.

В идеале, если аудит не прошел, никакие операции не должны продолжаться. Поэтому по идее я должен использовать HttpRequestInterceptor.

Но как мне получить IRequestContext от IRequestExecutor или IQueryRequestBuilder. Я пробовал поискать в Google, но документация ограничена.


person Jason    schedule 07.05.2021    source источник


Ответы (1)


Ни один :)

HttpRequestInterceptor предназначен для обогащения запроса GraphQL контекстными данными.

С другой стороны, DiagnosticEventListener предназначен для ведения журнала или других инструментов.

Если вы хотите вести журнал аудита, вам следует использовать промежуточное ПО для запросов. Промежуточное ПО запроса может быть добавлено следующим образом.

services
    .AddGraphQLServer()
    .AddQueryType<Query>()
    .UseRequest(next => async context => 
    {

    })
    .UseDefaultPipeline();

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

services
    .AddGraphQLServer()
    .AddQueryType<Query>()
    .UseInstrumentations()
    .UseExceptions()
    .UseTimeout()
    .UseDocumentCache()
    .UseDocumentParser()
    .UseDocumentValidation()
    .UseRequest(next => async context =>
    {
        // write your audit log here and invoke next if the user is allowed to execute

        if(isNotAllowed) 
        {
            // if the user is not allowed to proceed create an error result.
            context.Result = QueryResultBuilder.CreateError(
                ErrorBuilder.New()
                    .SetMessage("Something is broken")
                    .SetCode("Some Error Code")
                    .Build())
        }
        else 
        {
            await next(context);
        }
    })
    .UseOperationCache()
    .UseOperationResolver()
    .UseOperationVariableCoercion()
    .UseOperationExecution();

Конвейер в основном является конвейером по умолчанию, но добавляет ваше промежуточное ПО сразу после проверки документа. На этом этапе ваш запрос GraphQL анализируется и проверяется. Это означает, что мы знаем, что на данном этапе может быть обработан действительный запрос GraphQL. Это также означает, что мы можем использовать свойство context.Document, которое содержит проанализированный запрос GraphQL.

Чтобы преобразовать документ в форматированную строку, используйте context.Document.ToString(indented: true).

Хорошо то, что в промежуточном программном обеспечении мы находимся в асинхронном контексте, что означает, что вы можете легко получить доступ к базе данных и так далее. В отличие от этого, DiagnosticEvents синхронизируются и не рассчитаны на большую рабочую нагрузку.

Промежуточное ПО также можно обернуть в класс вместо делегата.

Если вам нужна дополнительная помощь, присоединяйтесь к нам в Slack.

Нажмите на поддержку сообщества, чтобы присоединиться к каналу Slack: https://github.com/ChilliCream/hotchocolate/issues/new/choose

person Michael Ingmar Staib    schedule 07.05.2021