项目作者: webstack

项目描述 :
JSON Web Token Authentication support for Django
高级语言: Python
项目地址: git://github.com/webstack/django-jwt-auth.git
创建时间: 2018-12-20T10:29:25Z
项目社区:https://github.com/webstack/django-jwt-auth

开源协议:MIT License

下载


Django JWT Auth

Test Suite
pypi-version

Overview

This package provides JSON Web Token
Authentication

support for Django by using PyJWT.

The project is a fork of (https://github.com/jpadilla/django-jwt-auth) created
by José Padilla (maintainer of PyJWT too). José doesn’t seem to have the time
anymore to work on django-jwt-auth.

New features from original code:

  • refresh token
  • provides 2 middlewares
  • Django 3.0+
  • better coverage and packaging

Installation

Install using pip

  1. pip install webstack-django-jwt-auth

Usage

In your urls.py add the following URL route to enable obtaining a token via a
POST included the user’s username and password.

  1. from jwt_auth import views as jwt_auth_views
  2. from your_app.views import RestrictedView
  3. urlpatterns = [
  4. # ...
  5. path("token-auth/", jwt_auth_views.jwt_token),
  6. path("token-refresh/", jwt_auth_views.refresh_jwt_token),
  7. path("protected-url/", RestrictedView.as_view()),
  8. ]

Inside your_app, create a Django restricted view:

  1. import json
  2. from django.http import JsonResponse
  3. from django.views.generic import View
  4. from jwt_auth.mixins import JSONWebTokenAuthMixin
  5. class RestrictedView(JSONWebTokenAuthMixin, View):
  6. def get(self, request):
  7. data = {
  8. "foo": "bar",
  9. "username": request.user.username,
  10. }
  11. return JsonResponse(data)

You can easily test if the endpoint is working by doing the following in your
terminal, if you had a user created with the username admin and password
abc123.

  1. curl -X POST -H "Content-Type: application/json" -d '{"username":"admin","password":"abc123"}' http://localhost:8000/token-auth/

Now in order to access protected api urls you must include the Authorization: Bearer <your_token> header.

  1. curl -H "Authorization: Bearer <your_token>" http://localhost:8000/protected-url/

There is also a provided middleware if you would prefer that to the view
integration. Just add the following to your middleware:

  1. MIDDLEWARE = (
  2. # ...
  3. 'jwt_auth.middleware.JWTAuthenticationMiddleware',
  4. )

Additional Settings

There are some additional settings that you can override similar to how you’d do
it with Django REST framework itself. Here are all the available defaults.

  1. JWT_ALGORITHM = 'HS256'
  2. JWT_ALLOW_REFRESH = False
  3. JWT_AUDIENCE = None
  4. JWT_AUTH_HEADER_PREFIX = 'Bearer'
  5. JWT_DECODE_HANDLER = 'jwt_auth.utils.jwt_decode_handler',
  6. JWT_ENCODE_HANDLER = 'jwt_auth.utils.jwt_encode_handler'
  7. JWT_EXPIRATION_DELTA = datetime.timedelta(seconds=300)
  8. JWT_LEEWAY = 0
  9. JWT_LOGIN_URLS = [settings.LOGIN_URL]
  10. JWT_PAYLOAD_GET_USER_ID_HANDLER = 'jwt_auth.utils.jwt_get_user_id_from_payload_handler'
  11. JWT_PAYLOAD_HANDLER = 'jwt_auth.utils.jwt_payload_handler'
  12. JWT_REFRESH_EXPIRATION_DELTA = datetime.timedelta(days=7)
  13. JWT_SECRET_KEY: SECRET_KEY
  14. JWT_VERIFY = True
  15. JWT_VERIFY_EXPIRATION = True

This packages uses the JSON Web Token Python implementation,
PyJWT and allows to modify some of it’s
available options.

JWT_ALGORITHM

Possible values:

  • HS256 - HMAC using SHA-256 hash algorithm (default)
  • HS384 - HMAC using SHA-384 hash algorithm
  • HS512 - HMAC using SHA-512 hash algorithm
  • RS256 - RSASSA-PKCS1-v1_5 signature algorithm using SHA-256 hash algorithm
  • RS384 - RSASSA-PKCS1-v1_5 signature algorithm using SHA-384 hash algorithm
  • RS512 - RSASSA-PKCS1-v1_5 signature algorithm using SHA-512 hash algorithm

Note:

For the RSASSA-PKCS1-v1_5 algorithms, the “secret” argument in jwt.encode is
supposed to be a private RSA key as imported with
Crypto.PublicKey.RSA.importKey. Likewise, the “secret” argument in jwt.decode
is supposed to be the public RSA key imported with the same method.

Default is "HS256".

JWT_ALLOW_REFRESH

Enable token refresh functionality. Token issued from jwt_auth.views.jwt_token
will have an orig_iat field.

Default is False

JWT_AUDIENCE

Typically, the base address of the resource being accessed, eg https://example.com.

JWT_AUTH_HEADER_PREFIX

You can modify the Authorization header value prefix that is required to be sent
together with the token.

Default is Bearer.

JWT_EXPIRATION_DELTA

This is an instance of Python’s datetime.timedelta. This will be added to
datetime.utcnow() to set the expiration time.

Default is datetime.timedelta(seconds=300)(5 minutes).

JWT_LEEWAY

This allows you to validate an expiration time which is in the past but no
very far. For example, if you have a JWT payload with an expiration time set
to 30 seconds after creation but you know that sometimes you will process it
after 30 seconds, you can set a leeway of 10 seconds in order to have some
margin.

Default is 0 seconds.

JWT_LOGIN_URLS

Set the list of URLs that will be used to authenticate the user, you should take
care to set only required URLs because the middleware will accept
non-authenticated requests (no JWT) to these endpoints.

JWT_PAYLOAD_GET_USER_ID_HANDLER

If you store user_id differently than the default payload handler does,
implement this function to fetch user_id from the payload.

JWT_PAYLOAD_HANDLER

Specify a custom function to generate the token payload

JWT_REFRESH_EXPIRATION_DELTA

Limit on token refresh, is a datetime.timedelta instance. This is how much
time after the original token that future tokens can be refreshed from.

Default is datetime.timedelta(days=7) (7 days).

JWT_SECRET_KEY

This is the secret key used to encrypt the JWT. Make sure this is safe and not
shared or public.

Default is your project’s settings.SECRET_KEY.

JWT_VERIFY

If the secret is wrong, it will raise a jwt.DecodeError telling you as such. You
can still get at the payload by setting the JWT_VERIFY to False.

Default is True.

JWT_VERIFY_EXPIRATION

You can turn off expiration time verification with by setting
JWT_VERIFY_EXPIRATION to False.

Default is True.