Authentication and registration using graphene and JWT
Install Graphene JWT Auth Registration:
pip install graphene-jwt-auth-registration
Add it to your INSTALLED_APPS:
INSTALLED_APPS = [
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sites",
...
"djoser",
"graphene_django",
"gjwt_auth",
]
Set AUTH_USER_MODEL:
AUTH_USER_MODEL = "gjwt_auth.User"
Add JSONWebTokenBackend backend to your AUTHENTICATION_BACKENDS:
AUTHENTICATION_BACKENDS = [
'graphql_jwt.backends.JSONWebTokenBackend',
'django.contrib.auth.backends.ModelBackend',
]
Add the JSONWebTokenMiddleware:
GRAPHENE = {
'SCHEMA': 'yourproject.schema.schema',
'MIDDLEWARE': [
'graphql_jwt.middleware.JSONWebTokenMiddleware',
],
}
Create graphene schema in yourproject/schema.py:
import graphene
import graphql_jwt
from gjwt_auth.mutations import (
Activate,
DeleteAccount,
Register,
ResetPassword,
ResetPasswordConfirm,
)
from gjwt_auth.schema import User, Viewer
class RootQuery(graphene.ObjectType):
viewer = graphene.Field(Viewer)
def resolve_viewer(self, info, **kwargs):
if info.context.user.is_authenticated:
return info.context.user
return None
class Mutation(graphene.ObjectType):
activate = Activate.Field()
register = Register.Field()
deleteAccount = DeleteAccount.Field()
resetPassword = ResetPassword.Field()
resetPasswordConfirm = ResetPasswordConfirm.Field()
token_auth = graphql_jwt.ObtainJSONWebToken.Field()
verify_token = graphql_jwt.Verify.Field()
refresh_token = graphql_jwt.Refresh.Field()
schema = graphene.Schema(query=RootQuery, mutation=Mutation)
Set djoser setttings:
DOMAIN = os.environ.get('DJANGO_DJOSER_DOMAIN', 'localhost:3000')
SITE_NAME = os.environ.get('DJANGO_DJOSER_SITE_NAME', 'my site')
DJOSER = {
'PASSWORD_RESET_CONFIRM_URL': '?action=set-new-password&uid={uid}&token={token}',
'ACTIVATION_URL': 'activate?uid={uid}&token={token}',
'SEND_ACTIVATION_EMAIL': True,
}
}
Add Graphenes URL patterns:
from django.conf.urls import url
from django.views.decorators.csrf import csrf_exempt
from graphene_django.views import GraphQLView
...
urlpatterns = [
...
url(r'^graphql', csrf_exempt(GraphQLView.as_view(graphiql=True))),
...
]
Does the code actually work?
source <YOURVIRTUALENV>/bin/activate (myenv) $ pip install tox (myenv) $ tox
Tools used in rendering this package: