Пользовательская директива GraphQL Logi c Реализация - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть быстро растущая схема GraphQL, написанная на go с использованием библиотеки github.com/graphql-go/graphql, и я пытаюсь реализовать пользовательскую директиву для определений полей для аутентификации.

Я создаю экземпляр объекта директивы с помощью:

var AuthenticatedDirective = graphql.NewDirective(graphql.DirectiveConfig{
    Name:        "authenticated",
    Description: "Identifies a query or mutation as requiring authentication for resolution",
    Locations:   []string{graphql.DirectiveLocationFieldDefinition},
    Args: graphql.FieldConfigArgument{
        "type": &graphql.ArgumentConfig{
            Type: graphql.NewNonNull(graphql.String),
        },
    },
})

... добавляя его в схему следующим образом:

var customDirectives = []*graphql.Directive{
    types.AuthenticatedDirective,
}

func CompileSchema(query *graphql.Object, mutation *graphql.Object) (graphql.Schema, error) {
    return graphql.NewSchema(graphql.SchemaConfig{
        Query:      query,
        Mutation:   mutation,
        Directives: append(graphql.SpecifiedDirectives, customDirectives...),
    })
}

Эти два вместе соответствующим образом создают и внедряют определение директивы в схему, чтобы она была доступна для использования, однако, Похоже, не существует четкого способа реализации логики c, стоящей за обработкой директивы или назначением ее определениям полей.

Например, если у меня есть определение поля Query, например:

// type Query {
//   me: @authenticated(type: "jwt")
// }
"me": &graphql.Field{
    Description: "(Authenticated) Parses and validates the authorization header token and returns the targeted User",
    Type:        types.UserType,
    Resolve:     resolvers.MeResolver,
},

Как мне go назначить директиву для этого определения поля запроса и реализовать протокол проверки JWT c через посещение директивы?

...