Skip to main content

License

Django Rest Framework JWT permissions

Module that check API View permissions from JWT payloads.

Installation

pip install django3-rest-jwt-permission

Using

Add rest_jwt_permission in your INSTALLED_APPS and configure the settings as you wish. Here is an example:

REST_JWT_PERMISSION = {
    "SCOPE_PROVIDERS": [
        "rest_jwt_permission.providers.APIEndpointScopeProvider",
        "rest_jwt_permission.providers.AdminScopeProvider"
    ],
    "GET_PAYLOAD_FROM_SCOPES_HANDLER": (
        "rest_jwt_permission.handlers.get_payload_from_scopes"
    ),
    "GET_SCOPES_FROM_PAYLOAD_HANDLER": (
        "rest_jwt_permission.handlers.get_scopes_from_payload"
    ),
    "GET_PAYLOAD_FROM_REQUEST_HANDLER": (
        "rest_jwt_permission.handlers.get_jwt_payload_from_request"
    )
}

Now you can use JWTAPIPermission class in your API Views through permission_classes property or even setting it as the default permission class in your settings

Example

For a more pratical example, check rest-jwt-permission-example.

Motivation

Inspired by GitHub Personal access token and by Auth0 API Keys blog post, this package provides a Django Rest Framework Permission object to check permissions from JWT payloads.

This enables your API to check permissions avoiding an extra database hit.

How it works

Basically, it extracts a list of all Rest API Views and generate an unique ID for each endpoint + action. Then, after authenticaton, your API should inject which permission identifiers the user has access. The JWT payload should look like the following:

{
  "scopes": [
    "myviewset:get"
    "function_endpoint:get",
    "basicview:get",
    "simpleviewsetpermission:custom_action:put",
    "modelviewsetpermission:retrieve:get",
    "modelviewsetpermission:destroy:delete",
    "modelviewsetpermission:some_detail_metod:patch",
  ]
}

On each authenticated request, the JWTAPIPermission permission class will generate the unique ID for the requested view and will check whether the JWT payloads contains the ID. If so, the user has access.

⚠️ This package does not automatically injects the scopes payload into the JWT, although we have helpers (rest_jwt_permission.handlers.get_payload_from_scopes) you can use to do that. We strongly recommend you to use REST framework JWT Auth package as it provides all you need to make this eaiser. You can change the payload handler though it's JWT_PAYLOAD_HANDLER setting.

You can also create some sort of admin page to select the permissions for user and/or groups like GitHub token scopes, and use that to inject the token into the JWT:

GitHub Token Page

Scopes

Scopes are basically what users can access (has permission to do). Each scope should has an unique identifier (see Scope base class). You can extend the base Scope class and add extra properties and methods.

Providers

Providers are objects that returns a list of existing scopes. We currently have 2 built-in providers:

  • APIEndpointScopeProvider: returns all scopes for Django REST Framework registered views.
  • AdminScopeProvider: returns admin related scopes. Currently, only returns superuser scope.

You can develop new providers to your project as you need or even extend the built-ins.

Settings

This project was build with extension in mind, so it is easy to extend, add or remove features.

See the list of settings you can customize, all of them are inside the REST_JWT_PERMISSION setting key:

SCOPE_PROVIDERS: List of providers used to extract the existing scopes. Defaults to:

"SCOPE_PROVIDERS": [
    "rest_jwt_permission.providers.APIEndpointScopeProvider",
    "rest_jwt_permission.providers.AdminScopeProvider"
]

GET_PAYLOAD_FROM_SCOPES_HANDLER: Handler function to get the payload with scopes to be injected into JWT. Defaults to:

"GET_PAYLOAD_FROM_SCOPES_HANDLER": "rest_jwt_permission.handlers.get_payload_from_scopes"

GET_SCOPES_FROM_PAYLOAD_HANDLER: Handler function to get the scopes from a JWT payload. Defaults to:

"GET_SCOPES_FROM_PAYLOAD_HANDLER": "rest_jwt_permission.handlers.get_scopes_from_payload"

GET_PAYLOAD_FROM_REQUEST_HANDLER: Handler function to get JWT payload from Request. Defaults to:

"GET_PAYLOAD_FROM_REQUEST_HANDLER": "rest_jwt_permission.handlers.get_jwt_payload_from_request"

JWT_PAYLOAD_SCOPES_KEY: Payload key that will contain the scopes. Defaults to:

"JWT_PAYLOAD_SCOPES_KEY": "scopes"

Showing all available roles

You can use the show_roles management command to print all available roles according to your providers.

python manage.py show_roles

Running tests

Install dependencies from dev-requirements.txt and run py.test --cov:

pip install dev-requirements.txt && py.test --cov

Compatibility

  • Django >= 3.2.11
  • Django Rest Framework >= 3.12.2

License

MIT

Metadata

Release files for django3-rest-jwt-permission 1.0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django3-rest-jwt-permission 1.0.2
File Size Uploaded Provenance
django3-rest-jwt-permission-1.0.2.tar.gz 12.2 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for django3-rest-jwt-permission 1.0.2
File Interpreter ABI Platform
django3_rest_jwt_permission-1.0.2-py3-none-any.whl Python 3 none any Details

Total release size: 33.3 kB

Release files / django3-rest-jwt-permission-1.0.2.tar.gz

Download URL django3-rest-jwt-permission-1.0.2.tar.gz
Size 12.2 kB
Tags Source
SHA-256 checksum
How to use checksums
bd18733c7d8d4682d767159b5497511fa044f87233c42d38cccff0879f8e8bee
BLAKE2b-256 checksum
How to use checksums
a39d7271e508c9e7eaf325c81f91444a2f1a3c7789095d48ef1c81ecf0e01a6f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

Release files / django3_rest_jwt_permission-1.0.2-py3-none-any.whl

Download URL django3_rest_jwt_permission-1.0.2-py3-none-any.whl
Size 21.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
466cd1cfbfcf506881e8be6800c1ae0483d01f3903411b7c11d03ee15b8fbef9
BLAKE2b-256 checksum
How to use checksums
03ced8d184838370ef72f45131c9e3e271ef7dc2dc9b709098743355765bac58
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

Security for django3-rest-jwt-permission 1.0.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.0.2 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page