All Projects → grand-stack → graphql-auth-directives

grand-stack / graphql-auth-directives

Licence: other
Add authorization to your GraphQL API using schema directives.

Programming Languages

javascript
184084 projects - #8 most used programming language
shell
77523 projects

Projects that are alternatives of or similar to graphql-auth-directives

open-psd2
An open source framework for using banking API's built for PSD2 regulation.
Stars: ✭ 20 (-81.82%)
Mutual labels:  authorization
sheriff
Build simple and robust authorization systems with just Elixir and Plug
Stars: ✭ 39 (-64.55%)
Mutual labels:  authorization
casbin-aspnetcore
Casbin.NET integration and extension for ASP.NET Core
Stars: ✭ 39 (-64.55%)
Mutual labels:  authorization
node-js-jwt-auth
Node.js Demo for Token Based Authentication (JWT) with MySQL database
Stars: ✭ 161 (+46.36%)
Mutual labels:  authorization
Casbin4D
An authorization library that supports access control models like ACL, RBAC, ABAC in Delphi
Stars: ✭ 25 (-77.27%)
Mutual labels:  authorization
Gitzilla
A resume builder for your GitHub profile.
Stars: ✭ 60 (-45.45%)
Mutual labels:  graphql-api
macaroons
An Erlang Macaroons library compatible with libmacaroons
Stars: ✭ 27 (-75.45%)
Mutual labels:  authorization
web-haskell-graphql-postgres-boilerplate
Modern webserver in Haskell: Graphql + Postgresql + Authentication + DB migration + Dotenv and more
Stars: ✭ 114 (+3.64%)
Mutual labels:  graphql-api
spartan
A Scalable Client Authentication & Authorization System for Container-based Environments
Stars: ✭ 17 (-84.55%)
Mutual labels:  authorization
keyonic-v2
A Keycloak Mobile Implementation using Angular v4 and Ionic v3
Stars: ✭ 23 (-79.09%)
Mutual labels:  authorization
authorization-proxy
No description or website provided.
Stars: ✭ 31 (-71.82%)
Mutual labels:  authorization
rbac-react-redux-aspnetcore
A starter template for creating JWT token from ASP.NET Core API project and applying that JWT token authentication on React application
Stars: ✭ 54 (-50.91%)
Mutual labels:  authorization
powerauth-crypto
PowerAuth - Open-source solution for authentication, secure data storage and transport security in mobile banking.
Stars: ✭ 48 (-56.36%)
Mutual labels:  authorization
authorized-attributes
Authorized Model Attributes for Laravel
Stars: ✭ 22 (-80%)
Mutual labels:  authorization
core
🔥 Antares Core Implemenation. Most important project layer, this is the heart for your app. ACL, notifiter, console, geoip, areas, utils and many more...
Stars: ✭ 24 (-78.18%)
Mutual labels:  authorization
django-sitegate
Reusable application for Django to ease sign up & sign in processes
Stars: ✭ 32 (-70.91%)
Mutual labels:  authorization
authz0
🔑 Authz0 is an automated authorization test tool. Unauthorized access can be identified based on URLs and Roles & Credentials.
Stars: ✭ 248 (+125.45%)
Mutual labels:  authorization
OpenAM
OpenAM is an open access management solution that includes Authentication, SSO, Authorization, Federation, Entitlements and Web Services Security.
Stars: ✭ 476 (+332.73%)
Mutual labels:  authorization
wordpress
Free PWA & SPA for Wordpress & Woocommerce
Stars: ✭ 103 (-6.36%)
Mutual labels:  graphql-api
opa-spring-security
Open Policy Agent for Spring Security
Stars: ✭ 19 (-82.73%)
Mutual labels:  authorization

graphql-auth-directives

CircleCI

Add authentication to your GraphQL API with schema directives.

Schema directives for authorization

  • @isAuthenticated
  • @hasRole
  • @hasScope

Quick start

npm install --save graphql-auth-directives

Then import the schema directives you'd like to use and attach them during your GraphQL schema construction. For example using neo4j-graphql.js' makeAugmentedSchema:

import { IsAuthenticatedDirective, HasRoleDirective, HasScopeDirective } from "graphql-auth-directives";

const augmentedSchema = makeAugmentedSchema({
  typeDefs,
  schemaDirectives: {
    isAuthenticated: IsAuthenticatedDirective,
    hasRole: HasRoleDirective,
    hasScope: HasScopeDirective
  }
});

The @hasRole, @hasScope, and @isAuthenticated directives will now be available for use in your GraphQL schema:

type Query {
    userById(userId: ID!): User @hasScope(scopes: ["User:Read"])
    itemById(itemId: ID!): Item @hasScope(scopes: ["Item:Read"])
}

Be sure to inject the request headers into the GraphQL resolver context. For example, with Apollo Server:

const server = new ApolloServer({
  schema,
  context: ({ req }) => {
    return req;
  }
});

In the case that the token was decoded with no errors the context.user will store the payload from the token

me: (parent, args, context) => {
      console.log(context.user.id);
}

A JWT must then be included in each GraphQL request in the Authorization header. For example, with Apollo Client:

import { createHttpLink } from 'apollo-link-http';
import { setContext } from 'apollo-link-context';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { ApolloClient } from 'apollo-client';


const httpLink = createHttpLink({
    uri: <YOUR_GRAPHQL_API_URI>
});

const authLink = setContext((_, { headers }) => {
    const token = localStorage.getItem('id_token'); // here we are storing the JWT in localStorage
    return {
        headers: {
            ...headers,
            authorization: token ? `Bearer ${token}` : "",
        }
    }
});

const client = new ApolloClient({
    link: authLink.concat(httpLink),
    cache: new InMemoryCache()
});

Configure

Configuration is done via environment variables.

(required) There are two variables to control how tokens are processed. If you would like the server to verify the tokens used in a request, you must provide the secret used to encode the token in the JWT_SECRET variable. Otherwise you will need to set JWT_NO_VERIFY to true.

export JWT_NO_VERIFY=true //Server does not have the secret, but will need to decode tokens

or

export JWT_SECRET=><YOUR_JWT_SECRET_KEY_HERE> //Server has the secret and will verify authenticity

(optional) By default @hasRole will validate the roles, role, Roles, or Role claim (whichever is found first). You can override this by setting AUTH_DIRECTIVES_ROLE_KEY environment variable. For example, if your role claim is stored in the JWT like this

"https://grandstack.io/roles": [
    "admin"
]

Set:

export AUTH_DIRECTIVES_ROLE_KEY=https://grandstack.io/roles

Running Tests Locally

  1. create ./test/helpers/.env
  2. add relevant values
  3. run the test server
npx babel-node test/helpers/test-setup.js
  1. run the tests
npx ava test/*.js

Test JWTs

Scopes: user:CRUD

key: qwertyuiopasdfghjklzxcvbnm123456
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJHUkFORHN0YWNrIiwiaWF0IjoxNTQ5MTQ1Mjk0LCJleHAiOjE2OTE3ODEzMDcsImF1ZCI6ImdyYW5kc3RhY2suaW8iLCJzdWIiOiJib2JAbG9ibGF3LmNvbSIsIlJvbGUiOiJBRE1JTiIsIlNjb3BlIjpbIlVzZXI6UmVhZCIsIlVzZXI6Q3JlYXRlIiwiVXNlcjpVcGRhdGUiLCJVc2VyOkRlbGV0ZSJdfQ.WJffOec05r8KuzW76asax1iCzv5q4rwRv9kvFyw7c_E
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].