在django中生成JWT令牌,用于不同服务之间的身份验证



我的用例是创建一个JTW令牌(来自Django Admin的概率),并从其他服务(客户端、邮递员、微服务等)使用该令牌。该令牌不应该过期,因为如果它过期,我必须创建一个新的令牌,并使用新的令牌再次配置所有服务。我知道'rest_framework.authtoken'存在,但它有一些缺点-

  • 它不创建JWT令牌
  • 创建后,我可以在Django Admin中看到它(我只想在创建时显示令牌)

我想要一个类似于大多数短信/电子邮件提供商的服务。他们为我们提供了一个API密钥,我们可以将其用于未来的API调用。期待着一个解决方案。谢谢

DRF有一个内置的JWT身份验证包,您只需要在设置中将其与JWT密钥一起使用即可。py并将JWT身份验证添加到默认身份验证类中:(我添加了自定义有效负载,但你也可以添加默认有效负载)

设置。PY:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders',
'rest_framework',
'rest_framework.authtoken'
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
}
JWT_AUTH = {
'JWT_ENCODE_HANDLER':
'rest_framework_jwt.utils.jwt_encode_handler',
'JWT_DECODE_HANDLER':
'rest_framework_jwt.utils.jwt_decode_handler',
'JWT_PAYLOAD_HANDLER':
'rest_framework_jwt.utils.jwt_payload_handler',
'JWT_PAYLOAD_GET_USER_ID_HANDLER':
'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler',
'JWT_RESPONSE_PAYLOAD_HANDLER':
'rest_framework_jwt.utils.jwt_response_payload_handler',  
'JWT_ALLOW_REFRESH': False,
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=365),
'JWT_SECRET_KEY': SECRET_KEY,
# settings for the start of the autorization header
'JWT_AUTH_HEADER_PREFIX': 'JWT',
# Authorization : JWT <token>
'JWT_AUTH_COOKIE': "JwtToken",
}

url。PY:(添加以下内容)

from rest_framework_jwt.views import verify_jwt_token
urlpatterns = [
....
path('api/jwt-verify/', verify_jwt_token),
....
]

视图。PY(创建代币并验证):

##import the below two##
from rest_framework_jwt.utils import jwt_payload_handler
from rest_framework_jwt.utils import jwt_encode_handler
from rest_framework_jwt.utils import jwt_response_payload_handler
##if the requested user is active and authenticated
####user = authenticate(username=username, password=password) is NOT None
if user.is_active:
user_obj = User.objects.get(
username__iexact=username)

payload = jwt_payload_handler(user_obj)
token = jwt_encode_handler(payload)
response_payload = jwt_response_payload_handler(
token, user_obj, request=request)
response = requests.post("http://127.0.0.1:8080/api/jwt-verify/",
{"token": token})

return JsonResponse({'msg': "token is verified", 'token': response_payload['token']}, safe=False, status=response.status_code)

我找到了https://florimondmanca.github.io/djangorestframework-api-key/它满足了我的所有要求。来自文档

Django REST Framework API Key是一个功能强大的库,允许服务器端客户端安全地使用您的API。这些客户端通常是第三方后端和服务(即机器),它们没有用户帐户,但仍需要以安全的方式与API交互。

✌️简单易用:通过管理站点创建、查看和撤销API密钥,或者使用内置助手以编程方式创建API密钥。

尽可能安全:API密钥的处理与用户密码相同。它们在存储到数据库中之前使用默认的密码散列器进行散列,并且仅在创建时可见。

可定制:通过构建您自己定制的API关键模型、权限类和管理面板来满足特定的业务需求

我现在在我的项目中使用这个包。

最新更新