У меня есть быстро растущая схема 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 через посещение директивы?