GraphQL Authentication with Apollo: Leveraging Custom Directives and Plugins for Precise Access Control

C. R. Raja Vignesh
Javarevisited
Published in
4 min readJun 29, 2024

In GraphQL applications, a significant challenge is the lack of a centralized authentication mechanism. Unlike REST APIs, where each endpoint can handle its own authentication logic, GraphQL’s single endpoint architecture requires a unified strategy to manage access control across all queries, mutations, and subscriptions.

This centralized endpoint model means that traditional methods of endpoint-specific authentication do not apply. Instead, developers must devise a system that consistently applies authentication checks across all operations which is particularly crucial for implementing fine-grained access control, where different resources require distinct access validations based on user roles and permissions.

Even the official documentation of graphQL is vague on this topic and suggests implementing the resource based access controls on the resolver layer. The need to implement these checks within each resolver can make the codebase messy and harder to maintain/reuse. It increases the risk of inconsistent access control policies, as different developers might implement similar checks in slightly different ways across various resolvers.

Authorization using a Custom Apollo Plugin

Apollo GraphQL supports the use of Custom Directives and Schema transformations, providing a robust tools to handle authentication and authorization efficiently. Embedding this authentication and fine grained access control logic into Apollo Plugins creates a reusable and centralized framework for authentication and authorization.

Flow for Centralized authentication and fine grained access control using Apollo Plugins
Flow for Centralized authentication and fine grained access control using Apollo Plugins

The Apollo plugin framework provides various lifecycle events/hooks that can be utilized to customize and manage the authentication mechanisms for the GraphQL applications. The requestDidStart and didResolveOperation events are ideal for implementing authentication mechanisms as well as the schema transformation logic so that the access control mechanisms using custom directives can be incorporated to the requests.

The Schema transformation using custom directive can in turn be used to embed the reusable logic for managing fine grained access control to the resources. Although there are many such resources for implementing authentication using directives, majority of these documentations and examples utilize the SchemaDirectiveVisitor which is a deprecated with the newer versions for the Apollo GraphQL Server and graphql-tools which in turn documents the use of newer directiveResolvers API.

Based on this framework a new authorization plugin has been created that can be utilized with minimal changes to the GraphQL application.

Features

  • Centralized authentication using authentication server.
  • Support for Oauth 2.0/Okta integration.
  • Fine Grained access control to the GraphQL resources as well as the individual fields of the resources.
  • Additional flavors for fine-grained access control with Encryption and redaction of sensitive fields.

Utilizing the new authentication and authorization framework -

npm i @infotrends/apollo-graphql-tools

Setting up authentication using AuthenticationManagerPlugin:

Authorization - 401 - Unauthorized Access

Implementing Fine Grained Access Control

The plugin supports the fine grained access control for managing the access control to individual fields/resources using @Secured Custom Directive. The below directive declaration needs to be added along with the GraphQL schema:

Now, the schema directive can be utilized within the GraphQL schema of the application to identify fields that need to be protected/secured.

The plugin manages the access control using the details about the authorities provided to the user. The plugin provides a default authorities provider that utilizes the mongo database as the backend. The authorities provider contains the access details for the user.

Sample authorities provider document for a user

With this access and the directive configuration, the plugin will take care of restricting access to the unauthorized resources for the user

Fine Grained access control in action

For a user without access to any of the resources, it will take care of restricting all the fields in the response.

User without access to read any of the fields in the resource

The framework in turn also supports integration with OAuth 2.0 frameworks and has been tested for integration with Okta. This can be achieved by simply modifying the authentication provider being used to — Oauth2AuthenticatorProvider.

The plugin along with the full documentation is available at - https://www.npmjs.com/package/@infotrends/apollo-graphql-tools

The full source code is available at - https://github.com/Vicky-cmd/apollo-graphql-tools

--

--

C. R. Raja Vignesh
Javarevisited

Currently Working as a Developer in Tata Consultancy Services on Spring Boot Applications & Microservices. Interested to learn new things about cloud and DevOps