【Django】构建GraphQL的JWT认证
概述
我们将介绍如何在Django上构建GraphQL服务器并实现JWT认证。
我们将使Django的用户能够进行认证,并将刷新令牌保存在数据库中,以便立即将其设置为无效。
此外,我们还会设置使之一旦使用过的刷新令牌将被无效化,无法再次使用。
我们还会进行CORS设置,以便从其他服务器进行访问。
版本
-
- python 3.9.0
-
- django 3.1.3
-
- django-graphql-jwt 0.3.1
- django-cors-headers 3.5.0
安装库。
我们假设Django项目已经创建好了,名为config。
$ pip install django-graphql-jwt==0.3.1 django-cors-headers==3.5.0
修改设置文件
将AuthenticationMiddleware添加到MIDDLEWARE中。
MIDDLEWARE = [
# 追加
'django.contrib.auth.middleware.AuthenticationMiddleware',
]
将JSONWebTokenMiddleware添加到GRAPHENE中。
GRAPHENE = {
# configというプロジェクトを作成して、schemaというファイルを作成しています。
'SCHEMA': 'config.schema.schema',
'MIDDLEWARE': [
# 追加
'graphql_jwt.middleware.JSONWebTokenMiddleware',
],
}
在AUTHENTICATION_BACKENDS中添加JSONWebTokenBackend。
AUTHENTICATION_BACKENDS = [
'graphql_jwt.backends.JSONWebTokenBackend',
'django.contrib.auth.backends.ModelBackend',
]
将RefreshTokenConfig和corsheaders添加到INSTALLED_APPS中。
为了将刷新令牌保存在数据库中,您需要添加RefreshTokenConfig。
添加完成后,请运行python manage.py migrate。
将会创建refresh_token_refreshtoken表。
corsheaders是用于配置CORS的工具,将其添加进来。
INSTALLED_APPS = [
'corsheaders',
'graphql_jwt.refresh_token.apps.RefreshTokenConfig',
]
5. 增加了令牌的各种设置。
JWT_VERIFY_EXPIRATION设置为验证有效期限。
JWT_LONG_RUNNING_REFRESH_TOKEN启用长时间有效的刷新令牌。
JWT_EXPIRATION_DELTA将令牌的有效期限设置为5分钟。
JWT_REFRESH_EXPIRATION_DELTA将刷新令牌的有效期限设置为7天。
GRAPHQL_JWT = {
'JWT_VERIFY_EXPIRATION': True,
'JWT_LONG_RUNNING_REFRESH_TOKEN': True,
'JWT_EXPIRATION_DELTA': timedelta(minutes=5),
'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=7),
}
添加CORS设置。
允许从本地主机的3000端口进行访问。
CORS_ORIGIN_WHITELIST = [
"http://localhost:3000",
]
修改根模式
在项目文件夹(config)中创建一个名为schema.py的文件,并添加jwt认证的Mutaion。
import graphene
import graphql_jwt
class Mutation(graphene.ObjectType):
# トークン生成
token_auth = graphql_jwt.ObtainJSONWebToken.Field()
# トークン認証
verify_token = graphql_jwt.Verify.Field()
# トークンリフレッシュ
refresh_token = graphql_jwt.Refresh.Field()
# リフレッシュトークンの無効化
revoke_token = graphql_jwt.Revoke.Field()
# リフレッシュトークンを一度使用したら削除する設定を追加
@receiver(refresh_token_rotated)
def revoke_refresh_token(sender, request, refresh_token, **kwargs):
refresh_token.revoke(request)
schema = graphene.Schema(mutation=Mutation)
创建一个端点
修改urls.py文件,并创建GraphQL的端点。
为了避免在从Django之外访问时出现CSRF错误,通过使用csrf_exempt解除其功能。
from graphene_django.views import GraphQLView
from django.views.decorators.csrf import csrf_exempt
urlpatterns = [
path('graphql/', csrf_exempt(GraphQLView.as_view(graphiql=True)))
]
样本查询
请参考以下设置。
作为样本,我将附上每个用例的查询。
当执行查询时,您可能会了解到关于检索有效荷载、保存刷新令牌到表中,以及使其无效等方面的信息。
- トークン生成
mutation TokenAuth($username: String!, $password: String!) {
tokenAuth(username: $username, password: $password) {
token
payload
refreshToken
refreshExpiresIn
}
}
- トークン認証
mutation VerifyToken($token: String!) {
verifyToken(token: $token) {
payload
}
}
- トークンリフレッシュ
mutation RefreshToken($refreshToken: String!) {
refreshToken(refreshToken: $refreshToken) {
token
payload
refreshToken
refreshExpiresIn
}
}
- リフレッシュトークンの無効化
mutation RevokeToken($refreshToken: String!) {
revokeToken(refreshToken: $refreshToken) {
revoked
}
}
in Chinese: 最后
这次我们使用Django来构建GraphQL的JWT认证。
使用这个库可以很方便地进行构建,非常好。
我計畫在接下來構建的JWT驗證中使用React前端來使用。一旦構建完成,我會再次進行介紹。