@envelop/auth0
Version:
This plugin validates an JWT token created by [Auth0](https://auth0.com/), and injects the Auth0 user properties into your GraphQL context. With this plugin, you can implement authentication and authorization in a simple way.
142 lines (101 loc) • 5.27 kB
Markdown
by [Auth0](https://auth0.com/), and injects the Auth0
user properties into your GraphQL context. With this plugin, you can implement authentication and
authorization in a simple way.
> The plugins is using [JWKS](https://auth0.com/docs/tokens/json-web-tokens/json-web-key-sets)
> standard in order to validate the token.
We recommend using the
[ ](https://www.envelop.dev/docs/guides/adding-authentication-with-auth0)
if this is your first time using this plugin!
1. Sign up for [Auth0](https://auth0.com/), create a tenant based on your needs, and then create an
Auth0 Application (https://auth0.com/docs/applications).
2. Setup Auth0 client based on your client app. You should be able to login on your app, and get a
JWT token from Auth0. Make sure to pass that token in your GraphQL requests sent to your server,
using headers (for example: `Authorization: Bearer XYZ`). You can find more info here:
https://auth0.com/docs/quickstart/spa
3. From your tenant configuration screen, find your `audience` and `domain` configurations.
4. Setup Envelop with that plugin:
```ts
import { execute, parse, specifiedRules, subscribe, validate } from 'graphql'
import { useAuth0 } from '@envelop/auth0'
import { envelop, useEngine } from '@envelop/core'
const getEnveloped = envelop({
plugins: [
useEngine({ parse, validate, specifiedRules, execute, subscribe }),
// ... other plugins ...
useAuth0({
onError: e => {}, // In case of an error, you can override it and customize the error your client will get.
domain: 'YOUR_AUTH0_DOMAIN_HERE',
audience: 'YOUR_AUTH0_AUDIENCE_HERE',
headerName: 'authorization', // Name of the header
preventUnauthenticatedAccess: true, // If you need to have unauthenticated parts on your schema, make sure to disable that by setting it to `false` and the check it in your resolvers.
extendContextField: 'auth0', // The name of the field injected to your `context`
tokenType: 'Bearer' // Type of token to expect in the header
})
]
})
```
5. Make sure to pass your request as part of the context building:
```ts
myHttpServer.on('request', async req => {
const { contextFactory } = getEnveloped({ req })
const contextValue = await contextFactory({ req }) // Make sure to pass it here
})
```
> By default, this plugins looks for `req` or `request` properties in your base context. If you need
> to override it, please use `extractTokenFn` and you can customize it.
6. You should now be able to validate user tokens, and if a user is valid, you can get the Auth0
user id (called `sub`) as part of your `context` during execution:
```ts
const myResolvers = {
Query: {
me: (root, args, context, info) => {
const auth0UserId = context.auth0.sub
}
}
}
```
Pass this to customize the JWKS client creation. See: https://github.com/auth0/node-jwks-rsa
> Setting this will override any other options defined by this plugin.
Pass this to customize the JWT `decode` phase. See:
https://www.npmjs.com/package/jws#jwsdecodesignature
Pass this to customize the JWT `verify` phase. See:
https://github.com/auth0/node-jsonwebtoken#jwtverifytoken-secretorpublickey-options-callback
By default, this library will throw an error during context building if an error has happened.
If you wish to customize the error, you can add `onError` callback and throw a custom error based on
your needs.
By default, this library will prevent execution flow and throw an error in case of an authentication
error.
Setting this to `false` will lead to a `null` value in case of authentication issue (and `onError`
will still get called).
#### `domain`
Specifies the Auth0 domain, please note that you need to specify that field with a protocol, for
example: `my-domain.us.auth0.com`
#### `audience`
Specifies the Auth0 audience.
#### `extractTokenFn(context: any)`
If you wish to customize the token extraction from your HTTP request, override this function. It
gets the `context` built so far as an argument, and you can extract your auth token based on your
setup.
#### `headerName` + `tokenType`
If `extractTokenFn` is not set, the default behavior of this plugin is to look for `req` and
`request` in the context, then look for `headers` and look for `authentication` header (you can
customize it with `headerName`). Then, it validates that the token is of type `Bearer` (you can
customize it with `tokenType` option).
#### `extendContextField`
The name of the field to inject to your `context`. When the user is valid, the decoded and verified
payload of the JWT is injected. In most cases, the field that you need is `sub` (which refers to the
internal Auth0 user identifier).
You can read more about the token structure here:
https://auth0.com/docs/tokens/json-web-tokens/json-web-token-structure
By default, the `auth0` value is used.
## Notes
> Make sure to specify `audience` field in the client, otherwise you'll get an opaque token instead
> of a JWT token.
This plugin validates an JWT token created