Strawberry-graphql port of the graphene-django-jwt package
Project description
Strawberry Django JWT
JSON Web Token authentication for Strawberry Django GraphQL
Disclaimer
This project is a forked version of Django GraphQL JWT that substitutes Graphene GraphQL backend for Strawberry
Installation
-
Install last stable version from Pypi:
pip install strawberry-django-jwt
-
Add
AuthenticationMiddleware
middleware to your MIDDLEWARE settings:MIDDLEWARE = [ ..., 'django.contrib.auth.middleware.AuthenticationMiddleware', ..., ]
-
Add following django apps to INSTALLED_APPS:
INSTALLED_APPS = [ 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', ..., ]
If using refresh tokens, also add
strawberry_django_jwt.refresh_token
INSTALLED_APPS = [ 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', ..., 'strawberry_django_jwt.refresh_token', ..., ]
-
Add
JSONWebTokenMiddleware
orAsyncJSONWebTokenMiddleware
middleware to your STRAWBERRY schema definition:from strawberry_django_jwt.middleware import JSONWebTokenMiddleware, AsyncJSONWebTokenMiddleware from strawberry import Schema # !! IMPORTANT !! # Pick only one, async middleware is needed when using AsyncGraphQLSchema schema = Schema(..., extensions=[ JSONWebTokenMiddleware, AsyncJSONWebTokenMiddleware, ])
-
Add
JSONWebTokenBackend
backend to your AUTHENTICATION_BACKENDS:AUTHENTICATION_BACKENDS = [ 'strawberry_django_jwt.backends.JSONWebTokenBackend', 'django.contrib.auth.backends.ModelBackend', ]
-
Add strawberry-django-jwt mutations to the root schema:
import strawberry import strawberry_django_jwt.mutations as jwt_mutations @strawberry.type class Mutation: token_auth = jwt_mutations.ObtainJSONWebToken.obtain verify_token = jwt_mutations.Verify.verify refresh_token = jwt_mutations.Refresh.refresh delete_token_cookie = jwt_mutations.DeleteJSONWebTokenCookie.delete_cookie
schema = strawberry.Schema(mutation=Mutation, query=...)
-
[OPTIONAL] Set up the custom Strawberry views
These views set the status code of failed authentication attempts to 401 instead of the default 200.
from django.urls import re_path from strawberry_django_jwt.decorators import jwt_cookie from strawberry_django_jwt.views import StatusHandlingGraphQLView as GQLView from ... import schema urlpatterns += \ [ re_path(r'^graphql/?$', jwt_cookie(GQLView.as_view(schema=schema))), ]
or, for async views:
from django.urls import re_path from strawberry_django_jwt.decorators import jwt_cookie from strawberry_django_jwt.views import AsyncStatusHandlingGraphQLView as AGQLView from ... import schema urlpatterns += \ [ re_path(r'^graphql/?$', jwt_cookie(AGQLView.as_view(schema=schema))), ]
Known Issues
-
JWT_ALLOW_ANY_CLASSES
-
Only supports return-type based filtering at the moment, because strawberry does not use class-based field definitions (so all superclasses are dropped)
-
It might be possible to create a workaround by using either a class decorator or by creating a custom graphql scheme that somehow preserves class hierarchy of types
-
Example Application
To start the example application, install poetry dev dependencies (poetry install
will suffice) and run poetry run uvicorn tests.example_app.asgi:application
Quickstart Documentation
===============Work in Progress===============
Relay support has been temporarily removed due to lack of experience with Relay
Most of the features are conceptually the same as those provided by Django GraphQL JWT
Authenticating Fields
Fields can be set to auth-only using the login_required
decorator in combination with strawberry.field
or
via login_field
import strawberry
from strawberry.types import Info
from strawberry_django_jwt.decorators import login_required
from strawberry_django_jwt.decorators import login_field
@strawberry.type
class Query:
@login_field
def hello(self, info: Info) -> str:
return "World"
@strawberry.field
@login_required
def foo(self, info: Info) -> str:
return "Bar"
@strawberry.field
@login_required
def foo2(self) -> str:
return "Bar2"
The info argument is optional. If not provided, the login_required decorator decorates the resolver function with a custom function with info.
All required function arguments that are not present in the definition (atm. only info) will be added by
the login_required
decorator to the self
dictionary as kwargs.
Model Mutations
You can add the login_required decorator to them as well
import strawberry
from strawberry_django_jwt.decorators import login_required
from strawberry.django import mutations
@strawberry.type
class Mutation:
foo_create: FooType = login_required(mutations.create(FooInput))
foo_delete: FooType = login_required(mutations.update(FooPartialInput))
foo_update: FooType = login_required(mutations.delete())
Async Views
Should be fully supported :)
import strawberry
from strawberry_django_jwt.decorators import login_field
@strawberry.type
class Query:
@login_field
async def foo(self) -> str:
return "bar"
Other
The introspection query authentication can be controlled by setting JWT_AUTHENTICATE_INTROSPECTION
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for strawberry-django-jwt-0.2.2.dev1658651018.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 16211c57b9a1d324b88346b7e0b01156d603717167d1b6b8f45f6d62c9cbcc85 |
|
MD5 | c1e024700008aa80ec197a12da7f39fa |
|
BLAKE2b-256 | a766938cb7cfd85595c6b005515a2a13854f9b8750cbf12324a971bb53d42ab3 |
Hashes for strawberry_django_jwt-0.2.2.dev1658651018-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e2faaa2fa389f948c35c8ab4a9bfce8051355deeb47bf394dc023edd50b61cb7 |
|
MD5 | 11f9c31706b2409abfd7c4c1249a128a |
|
BLAKE2b-256 | 703fe49540367a9ac4543bd83beb14f476df0963bd5022820c6870b6027a958f |