跳转至

Ninja JWT 入门指南

Requirements

  • Python >= 3.6
  • Django >= 2.1
  • Django-Ninja >= 0.16.1
  • Django-Ninja-Extra >= 0.11.0

这些是官方支持的 Python 版本和软件包版本。其他版本可能也会起作用。你可以自由修改 tox 配置并看看有哪些可能。

安装

Ninja JWT 能通过 pip 来安装:

pip install django-ninja-jwt

此外,你需要向你的 Django-Ninja API 注册 NinjaJWTDefaultController控制器。

from ninja_jwt.controller import NinjaJWTDefaultController
from ninja_extra import NinjaExtraAPI

api = NinjaExtraAPI()
api.register_controllers(NinjaJWTDefaultController)
NinjaJWTDefaultController 带有三条路由 obtain_token(获取令牌), refresh_token(刷新令牌) and verify_token(验证令牌)。 它是两个子类 TokenVerificationController(令牌验证控制器)TokenObtainPairController(令牌获取对控制器)的组合。 如果你希望自定义这些路由,你可以从这些控制器继承并更改其实现。

from ninja_extra import api_controller
from ninja_jwt.controller import TokenObtainPairController

@api_controller('token', tags=['Auth'])
class MyCustomController(TokenObtainPairController):
    """仅获取令牌和刷新令牌"""
...
api.register_controllers(MyCustomController)

如果你希望使用本地化/翻译,只需将 ninja_jwt 添加到 INSTALLED_APPS

INSTALLED_APPS = [
    ...
    'ninja_jwt',
    ...
]

用法

为了验证 Ninja JWT 正在工作,你可以使用 curl 发出几个测试请求:

curl \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"username": "davidattenborough", "password": "boatymcboatface"}' \
  http://localhost:8000/api/token/pair

...
{
  "access":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiY29sZF9zdHVmZiI6IuKYgyIsImV4cCI6MTIzNDU2LCJqdGkiOiJmZDJmOWQ1ZTFhN2M0MmU4OTQ5MzVlMzYyYmNhOGJjYSJ9.NHlztMGER7UADHZJlxNG0WSi22a2KaYSfd1S-AuT7lU",
  "refresh":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImNvbGRfc3R1ZmYiOiLimIMiLCJleHAiOjIzNDU2NywianRpIjoiZGUxMmY0ZTY3MDY4NDI3ODg5ZjE1YWMyNzcwZGEwNTEifQ.aEoAYkSJjoWH1boshQAaTkf8G3yn0kapko6HFRt7Rh4"
}

你可以使用返回的访问令牌来证明对受保护视图的认证:

curl \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiY29sZF9zdHVmZiI6IuKYgyIsImV4cCI6MTIzNDU2LCJqdGkiOiJmZDJmOWQ1ZTFhN2M0MmU4OTQ5MzVlMzYyYmNhOGJjYSJ9.NHlztMGER7UADHZJlxNG0WSi22a2KaYSfd1S-AuT7lU" \
  http://localhost:8000/api/some-protected-view/

当这个短期访问令牌过期时,你可以使用长期的刷新令牌来获取另一个访问令牌:

curl \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"refresh":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImNvbGRfc3R1ZmYiOiLimIMiLCJleHAiOjIzNDU2NywianRpIjoiZGUxMmY0ZTY3MDY4NDI3ODg5ZjE1YWMyNzcwZGEwNTEifQ.aEoAYkSJjoWH1boshQAaTkf8G3yn0kapko6HFRt7Rh4"}' \
  http://localhost:8000/api/token/refresh/

...
{"access":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoiYWNjZX...", "refresh":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoicmVm..."}

Cryptographic Dependencies (Optional)

如果你计划使用某些数字签名算法(即 RSA 和 ECDSA;访问 PyJWT 以获取其他算法)来编码或解码令牌, 你将需要安装加密库 cryptography_ 。这可以明确地安装,或者作为 django-ninja-jwt 要求中的一个必填项进行安装:

pip install django-ninja-jwt[crypto]

在使用 Ninja JWT 的项目的需求文件中,推荐使用 django-ninja-jwt[crypto] 格式, 因为单独的 cryptography 需求行之后可能会被误认为是未使用的需求并被删除。 cryptography

大功告成

继续下一章节 路由鉴权.


本文总阅读量