From 46a164fa44b3d31ab63f8b0dd3eeddae2e32673d Mon Sep 17 00:00:00 2001 From: Quentin Coumes Date: Mon, 15 Sep 2025 11:34:31 +0200 Subject: [PATCH] Initial commit --- .github/workflows/test_and_publish.yml | 176 +++++++++++++ .gitignore | 12 +- .gitlab-ci.yml | 85 ++++++ CHANGELOG.md | 4 + CONTRIBUTING.md | 108 ++++++++ MANIFEST.in | 5 + README.md | 152 ++++++++++- bin/colors.sh | 11 + bin/pre_commit.sh | 96 +++++++ docs/AUTHORS.md | 7 + docs/CHANGELOG.md | 1 + docs/CONTRIBUTING.md | 1 + docs/LICENSE.md | 1 + docs/css/misc.css | 8 + docs/flow.md | 69 +++++ docs/img/flow.png | Bin 0 -> 355356 bytes docs/index.md | 1 + docs/models.md | 50 ++++ docs/settings.md | 247 ++++++++++++++++++ manage.py | 26 ++ mkdocs.yml | 26 ++ requirements.txt | 5 + requirements_dev.txt | 16 ++ setup.cfg | 112 ++++++++ setup.py | 47 ++++ simple_oauth2/__init__.py | 1 + simple_oauth2/apps.py | 8 + simple_oauth2/enums.py | 11 + simple_oauth2/exceptions.py | 10 + simple_oauth2/migrations/0001_initial.py | 112 ++++++++ simple_oauth2/migrations/__init__.py | 0 simple_oauth2/models.py | 192 ++++++++++++++ simple_oauth2/serializers.py | 9 + simple_oauth2/settings.py | 148 +++++++++++ simple_oauth2/urls.py | 13 + simple_oauth2/utils.py | 86 ++++++ simple_oauth2/views.py | 56 ++++ tests/__init__.py | 0 tests/conftest.py | 140 ++++++++++ tests/test_models.py | 87 ++++++ tests/test_project/__init__.py | 0 .../test_project_conf/__init__.py | 0 tests/test_project/test_project_conf/asgi.py | 16 ++ .../test_project_conf/settings.py | 121 +++++++++ tests/test_project/test_project_conf/urls.py | 21 ++ tests/test_project/test_project_conf/wsgi.py | 16 ++ tests/test_utils.py | 47 ++++ tests/test_viewsets.py | 238 +++++++++++++++++ 48 files changed, 2594 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/test_and_publish.yml create mode 100644 .gitlab-ci.yml create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 MANIFEST.in create mode 100644 bin/colors.sh create mode 100755 bin/pre_commit.sh create mode 100644 docs/AUTHORS.md create mode 120000 docs/CHANGELOG.md create mode 120000 docs/CONTRIBUTING.md create mode 120000 docs/LICENSE.md create mode 100644 docs/css/misc.css create mode 100644 docs/flow.md create mode 100644 docs/img/flow.png create mode 120000 docs/index.md create mode 100644 docs/models.md create mode 100644 docs/settings.md create mode 100755 manage.py create mode 100644 mkdocs.yml create mode 100644 requirements.txt create mode 100644 requirements_dev.txt create mode 100644 setup.cfg create mode 100644 setup.py create mode 100644 simple_oauth2/__init__.py create mode 100644 simple_oauth2/apps.py create mode 100644 simple_oauth2/enums.py create mode 100644 simple_oauth2/exceptions.py create mode 100644 simple_oauth2/migrations/0001_initial.py create mode 100644 simple_oauth2/migrations/__init__.py create mode 100644 simple_oauth2/models.py create mode 100644 simple_oauth2/serializers.py create mode 100644 simple_oauth2/settings.py create mode 100644 simple_oauth2/urls.py create mode 100644 simple_oauth2/utils.py create mode 100644 simple_oauth2/views.py create mode 100644 tests/__init__.py create mode 100644 tests/conftest.py create mode 100644 tests/test_models.py create mode 100644 tests/test_project/__init__.py create mode 100644 tests/test_project/test_project_conf/__init__.py create mode 100644 tests/test_project/test_project_conf/asgi.py create mode 100644 tests/test_project/test_project_conf/settings.py create mode 100644 tests/test_project/test_project_conf/urls.py create mode 100644 tests/test_project/test_project_conf/wsgi.py create mode 100644 tests/test_utils.py create mode 100644 tests/test_viewsets.py diff --git a/.github/workflows/test_and_publish.yml b/.github/workflows/test_and_publish.yml new file mode 100644 index 0000000..06a7853 --- /dev/null +++ b/.github/workflows/test_and_publish.yml @@ -0,0 +1,176 @@ +name: Tests + +on: + push: + branches: + - main + - '*.*.*' + + pull_request: + branches: + - main + - '*.*.*' + + release: + types: [ published ] + +jobs: + + black: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@master + with: + python-version: '3.13' + + - name: Install packages + run: pip install -r requirements_dev.txt + + - name: Black + run: | + black --check -l 120 simple_oauth2/ tests/ + + isort: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@master + with: + python-version: '3.13' + + - name: Install packages + run: pip install -r requirements_dev.txt + + - name: Isort + run: | + isort --check simple_oauth2/ tests/ + + pycodestyle: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@master + with: + python-version: '3.13' + + - name: Install packages + run: pip install -r requirements_dev.txt + + - name: Pycodestyle + run: | + pycodestyle simple_oauth2/ tests/ + + pydocstyle: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@master + with: + python-version: '3.13' + + - name: Install packages + run: pip install -r requirements_dev.txt + + - name: Pydocstyle + run: | + pydocstyle --count simple_oauth2/ + + mypy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@master + with: + python-version: '3.13' + + - name: Install packages + run: pip install -r requirements_dev.txt + + - name: Mypy + run: | + mypy simple_oauth2 --disallow-untyped-def + + bandit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@master + with: + python-version: '3.13' + + - name: Install packages + run: pip install -r requirements_dev.txt + + - name: Bandit + run: | + bandit --ini=setup.cfg -ll 2> /dev/null + + + test: + needs: [black, isort, pycodestyle, pydocstyle, bandit] + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [ '3.10', '3.11', '3.12', '3.13'] + django-version: [ 42, 51, 52 ] + exclude: + - python-version: 3.13 + django-version: 42 + + steps: + - uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@master + with: + python-version: ${{ matrix.python-version }} + - name: Install Tox and any other packages + run: | + pip install tox + - name: Python ${{ matrix.python-version }}, Django ${{ matrix.django-version }}, + run: tox -e py-django${{ matrix.django-version }} + + - name: Upload coverage to Codecov + if: matrix.python-version == 3.13 && matrix.django-version == 52 + uses: codecov/codecov-action@v5 + with: + file: ./coverage.xml + token: ${{ secrets.CODECOV_TOKEN }} + + publish: + needs: test + if: github.event_name == 'release' && github.event.action == 'published' + runs-on: ubuntu-latest + continue-on-error: true + + steps: + - uses: actions/checkout@master + + - name: Set up Python 3.13 + uses: actions/setup-python@v4 + with: + python-version: '3.13' + + - name: Creating Built Distributions + run: | + pip install setuptools + python setup.py sdist + + - name: Publish distribution to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + password: ${{ secrets.pypi_password }} + skip_existing: true diff --git a/.gitignore b/.gitignore index b7faf40..cc1fe83 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,10 @@ +# OS generated files +.DS_Store + +# IDEs and editors +.vscode/ +.idea/ + # Byte-compiled / optimized / DLL files __pycache__/ *.py[codz] @@ -50,6 +57,7 @@ coverage.xml .hypothesis/ .pytest_cache/ cover/ +junit.xml # Translations *.mo @@ -182,9 +190,9 @@ cython_debug/ .abstra/ # Visual Studio Code -# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore +# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore -# and can be added to the global gitignore or merged into this file. However, if you prefer, +# and can be added to the global gitignore or merged into this file. However, if you prefer, # you could uncomment the following to ignore the entire vscode folder # .vscode/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..541d95a --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,85 @@ +image: docker:latest + +services: + - docker:dind + +stages: + - checks + - test + - build + - deploy + +variables: + BUILD_TOOLS_PATH: /home/gitlab-runner/codoc-tools/docker_build + DOCKERFILE_DIR_PATH: $GITLAB_PROJECT_DIR + +################################################################################ +################################# TEMPLATES #################################### +################################################################################ + +.checks: &checks + stage: checks + only: + - merge_requests + before_script: + - python3.11 -m venv venv + - source venv/bin/activate + - python3.11 -m pip install -U pip setuptools wheel + +.test: &test + stage: test + only: + - merge_requests + before_script: + - python3.11 -m venv venv + - source venv/bin/activate + - python3.11 -m pip install -U pip setuptools wheel + - python3.11 -m pip install -r requirements_dev.txt + +################################################################################ +################################### CHECKS ##################################### +################################################################################ + +job:flake8: + <<: *checks + script: + - python3.11 -m pip install flake8 flake8-junit-report + - flake8 . --output-file=flake8.txt + after_script: + - flake8_junit flake8.txt flake8_junit.xml + artifacts: + reports: + junit: flake8_junit.xml + +job:isort: + <<: *checks + script: + - python3.11 -m pip install "isort==5.10.1" + - isort --check django_test/ {{ app_name }}/ + +job:black: + <<: *checks + script: + - python3.11 -m pip install "black==22.3.0" + - black --check --exclude="^.*\b((migrations))\b.*$" -l 120 test_project/ {{ app_name }}/ + +job:pydocstyle: + <<: *checks + script: + - python3.11 -m pip install pydocstyle + - ./bin/pydocstyle.sh + + +################################################################################ +################################### TESTS ###################################### +################################################################################ + +job:unittest: + <<: *test + script: + - python3.11 -m pytest --create-db -vvv -s --color=yes --durations=0 --durations-min=1.0 --cov=. --cov-report term + artifacts: + reports: + junit: junit.xml + coverage: '/TOTAL.*\s+(\d+%)$/' + resource_group: {{ app_name }}_unittest diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..8c900a6 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,4 @@ +Changelog +========= + +## 0.1.0 {% now "SHORT_DATE_FORMAT" %} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..9919af5 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,108 @@ +# Contributing + +Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given. + +You can contribute in many ways: + +## Types of Contributions + +### Report Bugs + +Report bugs at https://github.com/Codoc-os/drf-simple-oauth2. + +If you are reporting a bug, please include: + +* Your operating system name and version. +* Any details about your local setup that might be helpful in troubleshooting. +* Detailed steps to reproduce the bug. + +### Fix Bugs + +Look through the GitHub issues for bugs. Anything tagged with "bug" +is open to whoever wants to implement it. + +### Implement Features + +Look through the GitHub issues for features. Anything tagged with "feature" +is open to whoever wants to implement it. + +### Write Documentation + +Django Opensearch DSL could always use more documentation, whether as part of the official Django Opensearch DSL docs, +in docstrings, or even on the web in blog posts, articles, and such. + +### Submit Feedback + +The best way to send feedback is to file an issue at https://github.com/Codoc-os/drf-simple-oauth2/issues. + +If you are proposing a feature: + +* Explain in detail how it would work. +* Keep the scope as narrow as possible, to make it easier to implement. +* Remember that this is a volunteer-driven project, and that contributions are welcome :) + +--- + +## Setting up local environment + +Ready to contribute? Here's how to set up `drf-simple-oauth2` for local development. + +1. Fork the `drf-simple-oauth2` repo on GitHub. + +2. Clone your fork locally: + + * `git clone git@github.com:/drf-simple-oauth2.git` + +3. Install your local copy into a virtualenv. + + ```bash + python3 -m venv venv + source venv/bin/activate + pip3 install -r requirements.txt + pip3 install -r requirements_dev.txt + ``` + +4. Create a branch for local development: + + * `git checkout -b name-of-your-bugfix-or-feature` + + Now you can make your changes locally. + +## Testing your changes + +Tests must be written inside the `tests/` Django's project. This project contains three directory. + +You can interact with this project using the root-level `manage.py`. + +If you need to manually tests some of your feature, you can create a `sqlite3` +database with `python3 manage.py migrate`. + +## Submitting your changes + +1. Ensure your code is correctly formatted and documented: + +```sh +./bin/pre_commit.sh +``` + +2. Commit your changes and push your branch to GitHub: + +```sh +git add . +git commit -m "Your detailed description of your changes." +git push origin name-of-your-bugfix-or-feature +``` + +3. Submit a pull request through the GitHub website. + +## Pull Request Guidelines + +Before you submit a pull request, check that it meets these guidelines: + +1. The pull request should include tests + +2. If the pull request adds functionality, the documentation should be updated. + +3. The pull request should pass all checks and tests. Check + https://github.com/qcoumes/drf-simple-oauth2/actions + and make sure that the tests pass for all supported Python versions. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..5c3c7da --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,5 @@ +include CONTRIBUTING.md +include LICENSE +include README.md +include CHANGELOG.md +recursive-include simple_oauth2 *py diff --git a/README.md b/README.md index fe0fdcf..f66f244 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,150 @@ -# drf-simple-oauth2 -Simple OAuth2 client package allowing to define OAuth2 / OpenID providers through settings. +# DRF Simple OAuth2 + +[![PyPI Version](https://badge.fury.io/py/drf-simple-oauth2.svg)](https://badge.fury.io/py/drf-simple-oauth2) +[![Documentation Status](https://readthedocs.org/projects/drf-simple-oauth2/badge/?version=latest)](https://drf-simple-oauth2.readthedocs.io/en/latest/?badge=latest) +![Tests](https://github.com/Codoc-os/drf-simple-oauth2/workflows/Tests/badge.svg) +[![Python 3.10+](https://img.shields.io/badge/Python-3.10+-brightgreen.svg)](#) +[![Django 4.2+](https://img.shields.io/badge/Django-4.2+-brightgreen.svg)](#) +[![License MIT](https://img.shields.io/badge/license-MIT-brightgreen.svg)](https://github.com/Codoc-os/drf-simple-oauth2/blob/master/LICENSE) +[![codecov](https://codecov.io/gh/Codoc-os/drf-simple-oauth2/branch/master/graph/badge.svg)](https://codecov.io/gh/Codoc-os/drf-simple-oauth2) +[![CodeFactor](https://www.codefactor.io/repository/github/Codoc-os/drf-simple-oauth2/badge)](https://www.codefactor.io/repository/github/Codoc-os/drf-simple-oauth2) + +**DRF Simple OAuth2** is an OAuth2/OpenID Connect client for Django REST Framework. It lets you define one or many providers entirely via settings. + +You can view the full documentation at . + +## Features + +- Provides endpoints for the OAuth2 Authorization Code flow. +- Supports multiple OAuth2/OpenID providers at once. +- Supports PKCE (Proof Key for Code Exchange). +- Customize the user creation/update logic using the information retrieved from the provider. + +## Requirements + +`drf-simple-oauth2` supports the officially supported versions of its dependencies (mainstream & LTS): + +- **Python** — see the [supported versions](https://devguide.python.org/versions/). +- **Django** — see the [supported versions](https://www.djangoproject.com/download/#supported-versions). + +## Installation + +Install via `pip`: + +```bash +pip install drf-simple-oauth2 +``` + +Add the app: + +```python +INSTALLED_APPS = [ + ... + "simple_oauth2", + ... +] +``` + +Include URLs in your project’s `urls.py`: + +```python +from django.urls import include, path + +urlpatterns = [ + ... + path("", include("simple_oauth2.urls", namespace="simple_oauth2")), + ... +] +``` + +## Configuration + +Define `SIMPLE_OAUTH2` in your Django settings: + +```python +SIMPLE_OAUTH2 = { + "auth0": { + "CLIENT_ID": "", + "CLIENT_SECRET": "", + "BASE_URL": "..auth0.com", + "REDIRECT_URI": "http://localhost:8080/app/auth0/callback", + "POST_LOGOUT_REDIRECT_URI": "http://localhost:8080/app", + }, + "google": { + "CLIENT_ID": "", + "CLIENT_SECRET": "", + "BASE_URL": "accounts.google.com", + "REDIRECT_URI": "http://localhost:8080/app/google/callback", + "POST_LOGOUT_REDIRECT_URI": "http://localhost:8080/app", + }, +} +``` + +See the [documentation](settings.md#available-settings) for all available settings. + +## Usage + +*The following assumes you mounted `simple_oauth2` URLs at the empty path (`""`) as shown above.* + +The flow below describes interactions between a frontend (**App**), a backend (**API**), and an OAuth2/OpenID provider (**Provider**). +You can find a more detailed explanation in the [documentation](flow.md). + +### 1) Redirect the user to the provider + +Request the provider-specific authorization URL from your API, then redirect the browser to it: + +```http +GET http://localhost:8000/oauth2/url/?provider=auth0 +``` +```json +{ + "url": "https://example.com/authorize?response_type=code&client_id=client&scope=openid+profile+email&nonce=085c979c02ecb914a4c6210ad1902037825c18fe8d9b0a1ca0daae113b7747035170e9400c6ec5c7439e1caa3249cc20d52975b34777778c2949f63a14accfb0&state=9143617326b20fa6b3f436001096f5365e1ccb2689becc75091399fb3b3b4f834333f4dada0c44b2d167326d6ddc279698a0b05a0720c45620b8696e944101c4&redirect_uri=https%3A%2F%2Fexample.com%2Fcallback&code_challenge=vo8kwt0Nrf.jfMj8HmMGKJeGJH8SFY8bVhKidrQkg7q2IeW~nfRrdlM4QosTTgjMnMmyzVAC3i5n.lOPx0NJvgB1G7~FSaDVwhTFM-UehPrp6~~lht6jbLVs-9Tlxsld&code_challenge_method=plain" +} +``` + +After consent, the provider redirects back to your App at `REDIRECT_URI` with `code` and `state` parameters. + +### 2) Exchange the code at your API + +POST the `code` and `state` to your API: + +```http +POST http://localhost:8000/oauth2/token/ +{ + "provider": "auth0", + "code": "", + "state": "" +} +``` +```json +{ + "api": { + "access": "", + "refresh": "" + }, + "provider": { + "access_token": "", + "id_token": "", + "refresh_token": "", + "logout_url": "https://example.com/v2/logout?..." + } +} +``` + +> Note: `refresh_token` may be absent depending on the provider configuration. + +The response payload is produced by `TOKEN_PAYLOAD_HANDLER`, which issues JWTs via `djangorestframework-simplejwt` and returns the provider’s tokens. +The `api` object contains tokens for authenticating against **your API**; the `provider` object contains tokens for the **provider**. + +Calling `/oauth2/token/` will also ensure a user exists in your database. This is handled by `TOKEN_USERINFO_HANDLER` (defaults to `simple_oauth2.utils.get_user`). It first tries to match a user via the `sub` claim from the ID Token; otherwise, it uses claims/UserInfo to retrieve or create a user. + +You can customize both behaviors per provider via the [`TOKEN_PAYLOAD_HANDLER`](settings.md#token_payload_handler) and [`TOKEN_USERINFO_HANDLER`](settings.md#token_userinfo_handler)` settings. + +### 3) Logout + +To log out from both your API and the provider: + +1. Log the user out from your API. +2. Redirect the user to the `logout_url` returned in the `provider` object from `/oauth2/token/`. + +The provider will redirect back to your App using `POST_LOGOUT_REDIRECT_URI`. diff --git a/bin/colors.sh b/bin/colors.sh new file mode 100644 index 0000000..e3ee2cd --- /dev/null +++ b/bin/colors.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# Reset +Color_Off=$'\e[0m' # Text Reset + +# Regular Colors +Red=$'\e[0;31m' # Red +Green=$'\e[0;32m' # Green +Yellow=$'\e[0;33m' # Yellow +Purple=$'\e[0;35m' # Purple +Cyan=$'\e[0;36m' # Cyan diff --git a/bin/pre_commit.sh b/bin/pre_commit.sh new file mode 100755 index 0000000..889084a --- /dev/null +++ b/bin/pre_commit.sh @@ -0,0 +1,96 @@ +#!/bin/bash + +BASE_PATH="$(dirname "$0")" +source "$BASE_PATH/colors.sh" +EXIT_CODE=0 + + +################################################################################ +# ISORT # +################################################################################ +echo -n "${Cyan}Formatting import with isort... $Color_Off" +out=$(isort simple_oauth2/ tests/) +if [ ! -z "$out" ] ; then + echo "" + echo -e "$out" +fi +echo "${Green}Ok ✅ $Color_Off" +echo "" + +################################################################################ +# BLACK # +################################################################################ +echo "${Cyan}Formatting code with black...$Color_Off" +black -l 120 simple_oauth2/ tests/ +echo "" + + +################################################################################ +# PYCODESTYLE # +################################################################################ +echo -n "${Cyan}Running pycodestyle... $Color_Off" +out=$(pycodestyle simple_oauth2 tests) +if [ "$?" -ne 0 ] ; then + echo "${Red}Error !$Color_Off" + echo -e "$out" + EXIT_CODE=1 +else + echo "${Green}Ok ✅ $Color_Off" +fi +echo "" + + +################################################################################ +# PYDOCSTYLE # +################################################################################ +echo -n "${Cyan}Running pydocstyle... $Color_Off" +out=$(pydocstyle --count simple_oauth2/) +if [ "$?" -ne 0 ] ; then + echo "${Red}Error !$Color_Off" + echo -e "$out" + EXIT_CODE=1 +else + echo "${Green}Ok ✅ $Color_Off" +fi +echo "" + + +################################################################################ +# MYPY # +################################################################################ +echo -n "${Cyan}Running mypy... $Color_Off" +out=$(mypy simple_oauth2 --disallow-untyped-def) +if [ "$?" -ne 0 ] ; then + echo "${Red}Error !$Color_Off" + echo -e "$out" + EXIT_CODE=1 +else + echo "${Green}Ok ✅ $Color_Off" +fi +echo "" + + +################################################################################ +# BANDIT # +################################################################################ +echo -n "${Cyan}Running bandit... $Color_Off" +out=$(bandit --ini=setup.cfg -ll 2> /dev/null) +if [ "$?" -ne 0 ] ; then + echo "${Red}Error !$Color_Off" + echo -e "$out" + EXIT_CODE=1 +else + echo "${Green}Ok ✅ $Color_Off" +fi +echo "" + + + +################################################################################ + + +if [ $EXIT_CODE = 1 ] ; then + echo "${Red}⚠ You must fix the errors before committing ⚠$Color_Off" + exit $EXIT_CODE +fi +echo "${Purple}✨ You can commit without any worry ✨$Color_Off" diff --git a/docs/AUTHORS.md b/docs/AUTHORS.md new file mode 100644 index 0000000..a561296 --- /dev/null +++ b/docs/AUTHORS.md @@ -0,0 +1,7 @@ +# Credits + +### Contributors + +* [Quentin Coumes (Codoc)](https://github.com/qcoumes) +* [Andrea Chávez Herrejón (Codoc)](https://github.com/andreach2713) + diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md new file mode 120000 index 0000000..04c99a5 --- /dev/null +++ b/docs/CHANGELOG.md @@ -0,0 +1 @@ +../CHANGELOG.md \ No newline at end of file diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 120000 index 0000000..44fcc63 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1 @@ +../CONTRIBUTING.md \ No newline at end of file diff --git a/docs/LICENSE.md b/docs/LICENSE.md new file mode 120000 index 0000000..ea5b606 --- /dev/null +++ b/docs/LICENSE.md @@ -0,0 +1 @@ +../LICENSE \ No newline at end of file diff --git a/docs/css/misc.css b/docs/css/misc.css new file mode 100644 index 0000000..a2fd9a8 --- /dev/null +++ b/docs/css/misc.css @@ -0,0 +1,8 @@ +td, th { + vertical-align: middle; + padding: 5px; +} + +.wy-nav-content { + max-width: 1000px; +} diff --git a/docs/flow.md b/docs/flow.md new file mode 100644 index 0000000..b615cdd --- /dev/null +++ b/docs/flow.md @@ -0,0 +1,69 @@ +# OAuth 2.0 Authorization Code Flow + +![OAuth 2.0 Authorization Code Flow](img/flow.png) + +The Authorization Code Flow (defined in [OAuth 2.0 RFC 6749, §4.1](https://datatracker.ietf.org/doc/html/rfc6749#section-4.1)) +exchanges a short-lived authorization code for tokens. + +## 1) Retrieve the authorization URL from the API + +The client application (**App**) requests the authorization URL from the backend (**API**) +using `GET /oauth2/url/?provider=`. + +## 2) The API generates the authorization URL + +The API generates a unique `state` and builds the authorization URL using the +provider’s `AUTHORIZATION_PATH` and configured settings (`CLIENT_ID`, `REDIRECT_URI`, etc.), +then returns it to the App. + +## 3) Redirect the user to the provider + +The App redirects the browser to the provider’s authorization endpoint using that URL. + +## 4) The user is redirected back to the App + +After the user authenticates and authorizes the application, the provider redirects +back to the App’s `REDIRECT_URI` with an authorization `code` and the original `state`. + +## 5) The App sends the code to the API + +The App sends `code` and `state` to the API via `POST /oauth2/token/`. + +## 6) The API exchanges the code for tokens + +The API verifies the `state` (and `code_verifier` if PKCE is enabled) and exchanges the +`code` for tokens using the provider’s `TOKEN_PATH` and configured settings. + +## 7) The provider returns tokens to the API + +The provider validates the code and returns an ID Token, Access Token, and optionally a +Refresh Token to the API. + +## 8) The API retrieves user info + +The API uses the Access Token to fetch user information from the provider’s `USERINFO_PATH`. + +## 9) The provider returns user info to the API + +The provider returns user information (e.g., `sub`, `email`, `preferred_username`) +according to the scopes requested in the authorization URL. + +## 10) The API creates or updates the user + +The API creates or updates a user in its database using the ID Token and UserInfo via +the `TOKEN_USERINFO_HANDLER()` callable. + +## 11) The API responds to the App + +The API returns the payload produced by `TOKEN_PAYLOAD_HANDLER()`. This typically +includes tokens for authenticating against the API (e.g., JWTs), the provider’s tokens, +and a `logout_url`. + +## 12) The App redirects the user to the provider’s logout URL + +When the user wants to log out, the App logs the user out of the API and then redirects +to the `logout_url` returned in the previous step. + +## 13) The provider redirects the user back to the App + +The provider logs the user out and redirects back to the App’s `POST_LOGOUT_REDIRECT_URI`. diff --git a/docs/img/flow.png b/docs/img/flow.png new file mode 100644 index 0000000000000000000000000000000000000000..bdd8ce6d829ded42c03dca61dce0465ad40fe90c GIT binary patch literal 355356 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 z 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
9FjL9ZPu;nAGJ-bYLS-{NC^aA1{7}Z`<@q9x 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⪫E9!t6KGI!nkm7?YoyRc%fc1UoG(gt4w{$3q48G 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

F+ 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 P_>p_8ECqXH{Q7?YXsuR@ literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md new file mode 120000 index 0000000..32d46ee --- /dev/null +++ b/docs/index.md @@ -0,0 +1 @@ +../README.md \ No newline at end of file diff --git a/docs/models.md b/docs/models.md new file mode 100644 index 0000000..b7b3591 --- /dev/null +++ b/docs/models.md @@ -0,0 +1,50 @@ +# Models + +## Overview + +Internally, `drf-simple-oauth2` uses two models to manage OAuth2 authentication: +`simple_oauth2.models.Session` and `simple_oauth2.models.Sub`. + +## Session + +The `Session` model represents an OAuth2 authorization session. It lets +`drf-simple-oauth2` track the state of an ongoing OAuth2 flow, from the moment +the authorization URL is generated until the user is authenticated and tokens +are issued. + +When a session is started (via `Session.start()`), a new random `state` is +generated, which is expected to be unique for a given provider. The `state` +prevents CSRF during the OAuth2 authorization flow and helps correlate the +callback with the original request. + +Sessions have a limited lifetime (configurable via +[`AUTHORIZATION_SESSION_LIFETIME`](settings.md#authorization_session_lifetime)). + +You may want to set up a periodic cleanup task to delete expired or otherwise +old sessions. You can filter on the `status` field to remove only sessions that +are failed, expired, or completed. + +`status` can have the following values (see `simple_oauth2.enums.Status`): + +- `pending`: The URL has been generated, but the call to `/oauth2/token/` has not yet + been made. +- `completed`: The call to `/oauth2/token/` was successful, and tokens have been issued. +- `token_failed`: The provider denied the authorization request, or an error occurred + while exchanging the authorization code for tokens. +- `userinfo_failed`: An error occurred while fetching the UserInfo from the provider. +- `expired`: The session has expired. + +> **Note**: The status of a session is not automatically set to `expired` at the +> moment it expires. It is marked as such only when `has_expired()` is called. In a +> cleanup job, you can proactively check for expiration using `created_at` or by +> invoking `has_expired()` before deciding to delete a session. + +## Sub + +The `Sub` model represents a unique user identifier (`sub`) from a given provider. +It is used to quickly find a user who has previously authenticated with a specific +provider, even if fields commonly used for identification (such as `username` or +`email`) have changed at the provider. + +A given `sub` is unique **per provider** (i.e., the `(provider, sub)` pair uniquely +identifies an external account). diff --git a/docs/settings.md b/docs/settings.md new file mode 100644 index 0000000..3d4a8f7 --- /dev/null +++ b/docs/settings.md @@ -0,0 +1,247 @@ +# Settings + +## Defining settings + +All settings live in a single `SIMPLE_OAUTH2` dictionary. +Each top-level key is the provider name; each value is a dict of that provider’s settings. + +The minimal required settings per provider are: `CLIENT_ID`, `CLIENT_SECRET`, `REDIRECT_URI`, +`POST_LOGOUT_REDIRECT_URI`, and `BASE_URL`. + +See below for an example configuration: + +```python +SIMPLE_OAUTH2 = { + "auth0": { + "CLIENT_ID": "", + "CLIENT_SECRET": "", + "BASE_URL": "..auth0.com", + "REDIRECT_URI": "http://localhost:8080/app/auth0/callback", + "POST_LOGOUT_REDIRECT_URI": "http://localhost:8080/app", + }, + "google": { + "CLIENT_ID": "", + "CLIENT_SECRET": "", + "BASE_URL": "accounts.google.com", + "REDIRECT_URI": "http://localhost:8080/app/google/callback", + "POST_LOGOUT_REDIRECT_URI": "http://localhost:8080/app", + }, +} +``` + +This assumes the provider exposes the standard OpenID Connect discovery document at +`/.well-known/openid-configuration`. When present, it is used to automatically +populate the remaining required settings: `AUTHORIZATION_PATH`, `TOKEN_PATH`, +`USERINFO_PATH`, `JWKS_PATH`, `LOGOUT_PATH`, and `SIGNING_ALGORITHMS`. + +If the provider serves its discovery document at a non-standard path, set +`OPENID_CONFIGURATION_PATH`. If no discovery document is available, you **must** +manually specify all required settings. + +Optional settings are listed below. + +## Accessing settings + +Use `simple_oauth2.settings.oauth2_settings`, which maps provider names to their +resolved settings: + +```python +from simple_oauth2.settings import oauth2_settings + +auth0_client_id = oauth2_settings["auth0"].CLIENT_ID +``` + +## Available settings + +The following settings are available for each provider. + +### `CLIENT_ID` + +*Required* + +Your OAuth2 client ID. + +### `CLIENT_SECRET` + +*Required* + +Your OAuth2 client secret. + +### `BASE_URL` + +*Required* + +The provider’s base domain. +Examples: Auth0 — `..auth0.com`; Google — `accounts.google.com`. + +### `REDIRECT_URI` + +*Required* + +The URI the provider redirects to after authorization. +Must match the value registered with the provider. + +### `POST_LOGOUT_REDIRECT_URI` + +*Required* + +The URI the provider redirects to after logout. +Must match the value registered with the provider. + +### `AUTHORIZATION_PATH` + +*Required; usually discovered via the provider’s OpenID configuration* + +Path to the authorization endpoint, typically `/authorize`. + +### `TOKEN_PATH` + +*Required; usually discovered via the provider’s OpenID configuration* + +Path to the token endpoint, typically `/oauth/token` or `/token`. + +### `USERINFO_PATH` + +*Required; usually discovered via the provider’s OpenID configuration* + +Path to the UserInfo endpoint, typically `/userinfo`. + +### `JWKS_PATH` + +*Required; usually discovered via the provider’s OpenID configuration* + +Path to the JWKS document, typically `/.well-known/jwks.json`. + +### `LOGOUT_PATH` + +*Required; usually discovered via the provider’s OpenID configuration* + +Path to the logout endpoint, typically `/logout`. + +### `SIGNING_ALGORITHMS` + +*Required; usually discovered via the provider’s OpenID configuration* + +List of algorithms used to sign ID tokens, e.g. `["RS256"]`. + +### `OPENID_CONFIGURATION_PATH` + +*Optional* + +Path to the provider’s OpenID configuration document. +Defaults to `/.well-known/openid-configuration`. Set this if the provider uses a non-standard path. + +### `SCOPES` + +*Optional* + +Scopes requested during authorization. +Defaults to `["openid", "profile", "email"]`. + +### `USE_PKCE` + +*Optional* + +Whether to use PKCE (Proof Key for Code Exchange). +Defaults to `True`. + +### `CODE_CHALLENGE_METHOD` + +*Optional* + +PKCE code challenge method. +Defaults to `S256`. Some providers only support `plain`. + +### `AUTHORIZATION_SESSION_LIFETIME` + +*Optional* + +Lifetime (in seconds) of an authorization session (from URL generation to the call to `/oauth2/token/`). +Defaults to `300` (5 minutes). + +### `AUTHORIZATION_EXTRA_PARAMETERS` + +*Optional* + +Extra query parameters to include in the authorization URL. +Some providers require additional parameters. +Defaults to `{}`. + +### `TOKEN_USERINFO_HANDLER` + +*Optional* + +Callable that creates/updates and returns the authenticated user using the ID token and UserInfo response. +Defaults to `simple_oauth2.utils.get_user`. + +Signature: + +```python +def custom_get_user( + provider, + userinfo: dict, + **kwargs: Any, +) -> models.Model: + ... +``` + +- `provider`: the provider settings used for authentication. +- `userinfo`: the UserInfo response (dict). +- `kwargs`: may contain additional items such as encoded `id_token` and `access_token`. Do **not** assume these are + always present. Tokens may include extra claims and can be decoded via `simple_oauth2.utils.decode_token`. + +Return a model instance representing the authenticated user. + +The contents of `userinfo` and the decoded ID token depend on the provider and requested scopes. At minimum, one of +them should include a `sub` claim that uniquely identifies the user at the provider. + +### `TOKEN_PAYLOAD_HANDLER` + +*Optional* + +Callable that builds the JSON payload returned by the `/oauth2/token/` endpoint. +Defaults to `simple_oauth2.utils.simple_jwt_authenticate`, which issues JWTs via `djangorestframework-simplejwt` and +returns the provider’s tokens. + +Signature: + +```python +def custom_token_payload( + provider, + oauth2_tokens: dict[str, str], + user: models.Model, +) -> dict: + ... +``` + +- `provider`: the provider settings used for authentication. +- `oauth2_tokens`: tokens returned by the provider (usually `access_token`, `id_token`, and optionally `refresh_token`). +- `user`: the user returned by `TOKEN_USERINFO_HANDLER`. + +Return a dict to be serialized as the `/oauth2/token/` response. + +It should at least include a valid logout URI (see `simple_oauth2.utils.simple_jwt_authenticate` for an example of +logout URI generation). + +### `VERIFY_SSL` + +*Optional* + +Whether the CA certificate must be verified when using `urllib.request` or +`requests`. +Default to `True`. + +### `TIMEOUT` + +*Optional* + +The number of seconds waiting for a response before issuing a timeout when using +`urllib.request` or `requests`. +Default to `5`. + +### `ALLOW_REDIRECTS` + +*Optional* + +Enable / disable redirection when using `urllib.request` or `requests`. +Default to `True`. diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..2de3a7d --- /dev/null +++ b/manage.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + +sys.path.append(os.path.join(os.path.dirname(__file__), "tests/test_project/")) + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault( + "DJANGO_SETTINGS_MODULE", "tests.test_project.test_project_conf.settings" + ) + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == "__main__": + main() diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..085972f --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,26 @@ +site_name: DRF Simple OAuth2 +site_author: qcoumes +repo_url: https://github.com/Codoc-os/drf-simple-oauth2 +docs_dir: docs/ +use_directory_urls: true + +nav: + - "Gettings Started": + - Introduction: index.md + + - "Documentation": + - Settings: settings.md + - Models: models.md + - Authorization Flow: flow.md + + - "Other": + - Contributing: CONTRIBUTING.md + - Changelog: CHANGELOG.md + - Authors: AUTHORS.md + - License: LICENSE.md + - Github: https://github.com/Codoc-os/drf-simple-oauth2 + +extra_css: + - css/misc.css + +theme: readthedocs diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f2e3b2b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +django>=4.2.0,<6.0.0 +djangorestframework>=3.0.0,<4.0.0 +djangorestframework-simplejwt>=5.0.0,<6.0.0 +pyjwt>=2.6.0,<3.0.0 +requests>=2.28.0,<3.0.0 diff --git a/requirements_dev.txt b/requirements_dev.txt new file mode 100644 index 0000000..56a06be --- /dev/null +++ b/requirements_dev.txt @@ -0,0 +1,16 @@ +bandit +black +coverage +djangorestframework-simplejwt +django-extensions +flake8 +isort +mkdocs +mypy +pycodestyle +pydocstyle +pyflakes +pytest +pytest-cov +pytest-django +types-requests diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..ef38af8 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,112 @@ +######################## +##### Tox settings ##### +######################## +[tox:tox] +distshare = {homedir}/.tox/distshare + envlist = py{310,311,312,313}-django{42,51,52} +skipsdist = true +skip_missing_interpreters = true +indexserver = + pypi = https://pypi.python.org/simple + +[testenv] +setenv = + PYTHONPATH = {toxinidir} + DJANGO_SETTINGS_MODULE = tests.test_project.test_project_conf.settings +deps = + -rrequirements.txt + -rrequirements_dev.txt + django42: django>=4.2.0,<4.3.0 + django51: django>=5.1.0,<5.2.0 + django52: django>=5.2.0,<6.0.0 +commands = + python3 -m pytest --create-db -vvv -ss --color=yes --durations=0 --durations-min=1.0 --cov=. --cov-report term + coverage xml + + +######################## +### Checks settings #### +######################## +[pycodestyle] +count = True +max-line-length = 120 +max-doc-length = 100 +exclude = venv, .tox +ignore = W503, W504, W605, E121, E123, E126, E203, E501 +# W503: Line break occurred before a binary operator +# W504: Line break occurred after a binary operator +# W605: Invalid escape sequence +# E121: Continuation line under-indented for hanging indent +# E123: Closing bracket does not match indentation of opening bracket's line +# E126: Continuation line over-indented for hanging indent +# E203: Whitespace before ':' +# E501: Line too long + +[mypy] +ignore_missing_imports = True +no_implicit_optional = False +disable_error_code = attr-defined,index,valid-type,union-attr +# valid-type: To remove when dropping python 3.9 support + +[pydocstyle] +convention = numpy +match-dir = (?!tests|migrations|\.).* +match = (?!test_|conftest|manage\.py).*\.py +add_ignore = D100, D104, D105, D106 +# D100: Missing docstring in public module +# D104: Missing docstring in public package +# D105: Missing docstring in magic method +# D106: Missing docstring in public nested class + +[tool:isort] +profile = black +line_length = 120 +src_paths = simple_oauth2,tests + + +[bandit] +targets = simple_oauth2, tests +exclude = venv, .tox +recursive = True +quiet = True +format = custom +msg-template = {abspath}:{line} - {test_id} - {severity} - {msg} + + +############################# +##### Pytest settings ####### +############################# +[tool:pytest] +DJANGO_SETTINGS_MODULE = tests.test_project.test_project_conf.settings +filterwarnings = + error +pythonpath = tests/, tests/test_project/ + + + +############################# +##### Coverage settings ##### +############################# +[coverage:report] +exclude_lines = + pragma: no cover + def __repr__ + def __str__ + TYPE_CHECKING + raise NotImplementedError + @abstractmethod + if verbosity + if verbose +include = + simple_oauth2/* +omit = + venv/* + site-packages/* + +[coverage:run] +branch = True +source = + simple_oauth2 + +[coverage:html] +title = DRF Simple OAuth2's Coverage diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..9154456 --- /dev/null +++ b/setup.py @@ -0,0 +1,47 @@ +"""Setuptools entry point.""" +import codecs +import os + +from setuptools import setup + +DIRNAME = os.path.dirname(__file__) +CLASSIFIERS = [ + "Development Status :: 5 - Production/Stable", + "Framework :: Django :: 4.2", + "Framework :: Django :: 5.1", + "Framework :: Django :: 5.2", + "Intended Audience :: Developers", + "Natural Language :: English", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] +LONG_DESCRIPTION = ( + codecs.open(os.path.join(DIRNAME, "README.md"), encoding="utf-8").read() + + "\n" + + codecs.open(os.path.join(DIRNAME, "docs/CHANGELOG.md"), encoding="utf-8").read() +) +REQUIREMENTS = [ + "django>=4.2.0,<6.0.0", + "djangorestframework>=3.0.0,<4.0.0", + "djangorestframework-simplejwt>=5.0.0,<6.0.0", + "pyjwt>=2.6.0,<3.0.0", + "requests>=2.32.0,<3.0.0", +] + +setup( + name="simple_oauth2", + version="1.0.0", + description=""" Simple OAuth2 client package allowing to define OAuth2 / OpenID providers through settings. """, + long_description=LONG_DESCRIPTION, + long_description_content_type="text/markdown", + author="Quentin Coumes (Codoc)", + author_email="quentin@codoc.co", + url="https://github.com/Codoc-os/drf-simple-oauth2", + packages=["simple_oauth2"], + include_package_data=True, + install_requires=REQUIREMENTS, + keywords="django simple_oauth2 oauth2 oauth openid authentication", + classifiers=CLASSIFIERS, +) diff --git a/simple_oauth2/__init__.py b/simple_oauth2/__init__.py new file mode 100644 index 0000000..5becc17 --- /dev/null +++ b/simple_oauth2/__init__.py @@ -0,0 +1 @@ +__version__ = "1.0.0" diff --git a/simple_oauth2/apps.py b/simple_oauth2/apps.py new file mode 100644 index 0000000..a608679 --- /dev/null +++ b/simple_oauth2/apps.py @@ -0,0 +1,8 @@ +from django.apps import AppConfig + + +class SimpleOauth2Config(AppConfig): + """Configuration for the simple_oauth2 app.""" + + default_auto_field = "django.db.models.BigAutoField" + name = "simple_oauth2" diff --git a/simple_oauth2/enums.py b/simple_oauth2/enums.py new file mode 100644 index 0000000..72ce485 --- /dev/null +++ b/simple_oauth2/enums.py @@ -0,0 +1,11 @@ +from django.db import models + + +class Status(models.TextChoices): + """Valid status values for a Session.""" + + PENDING = "pending" + TOKEN_FAILED = "token_failed" + USERINFO_FAILED = "userinfo_failed" + EXPIRED = "expired" + COMPLETED = "completed" diff --git a/simple_oauth2/exceptions.py b/simple_oauth2/exceptions.py new file mode 100644 index 0000000..c267a3a --- /dev/null +++ b/simple_oauth2/exceptions.py @@ -0,0 +1,10 @@ +class SimpleOAuth2Error(Exception): + """Base exception for simple_oauth2's exceptions.""" + + +class UnknownProvider(SimpleOAuth2Error): + """Raised when an unknown OAuth2 provider is referenced.""" + + def __init__(self, provider: str): + self.provider = provider + super().__init__(f"Unknown OAuth2 provider '{provider}'") diff --git a/simple_oauth2/migrations/0001_initial.py b/simple_oauth2/migrations/0001_initial.py new file mode 100644 index 0000000..8d03da4 --- /dev/null +++ b/simple_oauth2/migrations/0001_initial.py @@ -0,0 +1,112 @@ +# Generated by Django 4.1.13 on 2025-09-08 04:51 + +import django.core.validators +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + +import simple_oauth2.utils + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="Session", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("_provider", models.CharField(db_column="provider", max_length=255)), + ( + "nonce", + models.CharField(default=simple_oauth2.utils.generate_nonce, max_length=255), + ), + ( + "state", + models.CharField(default=simple_oauth2.utils.generate_state, max_length=255), + ), + ( + "code_verifier", + models.CharField( + default=simple_oauth2.utils.generate_code_verifier, + max_length=128, + validators=[ + django.core.validators.RegexValidator( + message="code_verifier must be 43–128 chars of unreserved URL characters (RFC 7636).", + regex="^[A-Za-z0-9\\-._~]{43,128}$", + ) + ], + ), + ), + ( + "status", + models.CharField( + choices=[ + ("PENDING", "Pending"), + ("TOKEN_FAILED", "Token Failed"), + ("USERINFO_FAILED", "Userinfo Failed"), + ("EXPIRED", "Expired"), + ("COMPLETED", "Completed"), + ], + default="PENDING", + max_length=20, + ), + ), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("completed_at", models.DateTimeField(null=True)), + ], + ), + migrations.CreateModel( + name="Sub", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("_provider", models.CharField(db_column="provider", max_length=255)), + ("sub", models.CharField(max_length=255)), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("last_login", models.DateTimeField(auto_now=True)), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + ), + ), + ], + ), + migrations.AddIndex( + model_name="session", + index=models.Index(fields=["created_at"], name="simple_oaut_created_7c172d_idx"), + ), + migrations.AddConstraint( + model_name="session", + constraint=models.UniqueConstraint(fields=("_provider", "state"), name="session_provider_state_key"), + ), + migrations.AddIndex( + model_name="sub", + index=models.Index(fields=["sub"], name="simple_oaut_sub_7eb942_idx"), + ), + migrations.AddConstraint( + model_name="sub", + constraint=models.UniqueConstraint(fields=("_provider", "sub"), name="sub_provider_sub_key"), + ), + ] diff --git a/simple_oauth2/migrations/__init__.py b/simple_oauth2/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/simple_oauth2/models.py b/simple_oauth2/models.py new file mode 100644 index 0000000..c9b6ff7 --- /dev/null +++ b/simple_oauth2/models.py @@ -0,0 +1,192 @@ +import base64 +import datetime +import hashlib +import urllib.parse +from typing import Any + +import requests +from django.contrib.auth import get_user_model +from django.core.exceptions import NON_FIELD_ERRORS +from django.core.validators import RegexValidator +from django.db import IntegrityError, models, transaction +from django.utils import timezone +from rest_framework.exceptions import ValidationError + +from simple_oauth2 import utils +from simple_oauth2.enums import Status +from simple_oauth2.exceptions import SimpleOAuth2Error, UnknownProvider +from simple_oauth2.settings import OAuth2ProviderSettings, oauth2_settings + +PKCE_VALIDATOR = RegexValidator( + regex=r"^[A-Za-z0-9\-._~]{43,128}$", + message="code_verifier must be 43–128 chars of unreserved URL characters (RFC 7636).", +) + + +class Session(models.Model): + """Represent an OAuth2 authorization session.""" + + _provider = models.CharField(max_length=255, db_column="provider") + + nonce = models.CharField(max_length=255, default=utils.generate_nonce) + state = models.CharField(max_length=255, default=utils.generate_state) + code_verifier = models.CharField(max_length=128, default=utils.generate_code_verifier, validators=(PKCE_VALIDATOR,)) + + status = models.CharField(max_length=20, choices=Status.choices, default=Status.PENDING) + created_at = models.DateTimeField(auto_now_add=True) + completed_at = models.DateTimeField(null=True) + + class Meta: + constraints = (models.UniqueConstraint(fields=("_provider", "state"), name="session_provider_state_key"),) + indexes = (models.Index(fields=("created_at",)),) + + @classmethod + def start(cls, provider: str) -> "Session": + """Try creating a unique Session while avoiding race condition.""" + if provider not in oauth2_settings: + raise UnknownProvider(provider) + for _ in range(10): + try: + with transaction.atomic(): + return Session.objects.create(_provider=provider) + except IntegrityError: + continue + raise SimpleOAuth2Error("Could not create a unique authorization session after 10 attempts.") + + @property + def provider(self) -> OAuth2ProviderSettings: + """Return the provider configuration associated with this Session.""" + if self._provider in oauth2_settings: + return oauth2_settings[self._provider] + raise UnknownProvider(self._provider) + + @property + def use_pkce(self) -> bool: + """Return whether or not the Session uses PKCE.""" + return self.provider.USE_PKCE + + @property + def code_challenge_method(self) -> str: + """Return the code challenge method associated with this Session.""" + return self.provider.CODE_CHALLENGE_METHOD + + @property + def code_challenge(self) -> str: + """Return the code challenge from code_verifier and code_challenge_method.""" + if self.code_challenge_method.lower() == "plain": + return self.code_verifier + + elif self.code_challenge_method.lower() == "s256": + digest = hashlib.sha256(self.code_verifier.encode("ascii")).digest() + return base64.urlsafe_b64encode(digest).rstrip(b"=").decode("ascii") + + raise SimpleOAuth2Error(f"Unknown challenge method: '{self.code_challenge_method}'") + + def has_expired(self) -> bool: + """Return whether the authorization session as expired.""" + now = timezone.now().astimezone(datetime.timezone.utc) + if timezone.is_naive(self.created_at): + ts = timezone.make_aware(self.created_at, datetime.timezone.utc) + else: + ts = self.created_at.astimezone(datetime.timezone.utc) + if (now - ts).total_seconds() > self.provider.AUTHORIZATION_SESSION_LIFETIME: + return True + return False + + def authentication_url(self) -> str: + """Generate the OAuth2 authentication URL for the given alias.""" + params = { + "response_type": "code", + "client_id": self.provider.CLIENT_ID, + "scope": " ".join(self.provider.SCOPES), + "nonce": self.nonce, + "state": self.state, + "redirect_uri": self.provider.REDIRECT_URI, + } + if self.use_pkce: + params |= { + "code_challenge": self.code_challenge, + "code_challenge_method": self.provider.CODE_CHALLENGE_METHOD, + } + for key, value in self.provider.AUTHORIZATION_EXTRA_PARAMETERS.items(): + params[key] = value + return f"{self.provider.authorization_uri()}?{urllib.parse.urlencode(params)}" + + def get_tokens(self, code: str) -> dict[str, str]: + """Exchange the authorization code for tokens.""" + if self.has_expired(): + self.status = Status.EXPIRED + self.save(update_fields=["status"]) + raise ValidationError({NON_FIELD_ERRORS: "Authorization session has expired."}) + + data = { + "grant_type": "authorization_code", + "client_id": self.provider.CLIENT_ID, + "client_secret": self.provider.CLIENT_SECRET, + "code": code, + "redirect_uri": self.provider.REDIRECT_URI, + } + if self.use_pkce: + data["code_verifier"] = self.code_verifier + + try: + response = requests.post( + self.provider.token_uri(), + data=data, + timeout=self.provider.TIMEOUT, + verify=self.provider.VERIFY_SSL, + allow_redirects=self.provider.ALLOW_REDIRECTS, + ) + response.raise_for_status() + except requests.RequestException as e: + self.status = Status.TOKEN_FAILED + self.save(update_fields=("status",)) + raise ValidationError( + {"__all__": f"Failed to retrieve tokens from provider: {e.response.content.decode()}"} + ) + + return response.json() + + def get_user(self, access_token: str, **kwargs: Any) -> models.Model: + """Fetch the user infos from the provider and feet it to the handler.""" + try: + response = requests.get( + self.provider.userinfo_uri(), + headers={"Authorization": f"Bearer {access_token}"}, + timeout=self.provider.TIMEOUT, + verify=self.provider.VERIFY_SSL, + allow_redirects=self.provider.ALLOW_REDIRECTS, + ) + response.raise_for_status() + except requests.RequestException as e: + self.status = Status.USERINFO_FAILED + self.save(update_fields=("status",)) + raise ValidationError( + {"__all__": f"Failed to fetch user info from the provider: {e.response.content.decode()}."} + ) + + user = self.provider.TOKEN_USERINFO_HANDLER(self.provider, response.json(), **kwargs) + + return user + + def get_payload(self, oauth2_tokens: dict[str, str], user: models.Model) -> dict: + """Fetch the payload from the provider and feed it to the handler.""" + payload = self.provider.TOKEN_PAYLOAD_HANDLER(self.provider, oauth2_tokens, user) + self.status = Status.COMPLETED + self.completed_at = timezone.now() + self.save(update_fields=("status", "completed_at")) + return payload + + +class Sub(models.Model): + """Link a user to a given OAuth2 provider and its sub.""" + + _provider = models.CharField(max_length=255, db_column="provider") + sub = models.CharField(max_length=255) + user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE) + created_at = models.DateTimeField(auto_now_add=True) + last_login = models.DateTimeField(auto_now=True) + + class Meta: + constraints = (models.UniqueConstraint(fields=("_provider", "sub"), name="sub_provider_sub_key"),) + indexes = (models.Index(fields=("sub",)),) diff --git a/simple_oauth2/serializers.py b/simple_oauth2/serializers.py new file mode 100644 index 0000000..6a9b96c --- /dev/null +++ b/simple_oauth2/serializers.py @@ -0,0 +1,9 @@ +from rest_framework import serializers + + +class TokenSerializer(serializers.Serializer): + """Serializer for the token endpoint input data.""" + + provider = serializers.CharField() + code = serializers.CharField() + state = serializers.CharField() diff --git a/simple_oauth2/settings.py b/simple_oauth2/settings.py new file mode 100644 index 0000000..b9deab1 --- /dev/null +++ b/simple_oauth2/settings.py @@ -0,0 +1,148 @@ +import logging +import urllib.parse +from typing import Any, Callable + +import requests +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.utils.module_loading import import_string + +logger = logging.getLogger(__name__) + +# Default settings for OAuth2 providers +DEFAULTS = { + "OPENID_CONFIGURATION_PATH": "/.well-known/openid-configuration", + "AUTHORIZATION_SESSION_LIFETIME": 300, # 5 minutes + "AUTHORIZATION_EXTRA_PARAMETERS": {}, + "TOKEN_USERINFO_HANDLER": "simple_oauth2.utils.get_user", + "TOKEN_PAYLOAD_HANDLER": "simple_oauth2.utils.simple_jwt_authenticate", + "CODE_CHALLENGE_METHOD": "S256", + "SCOPES": ["openid", "profile", "email"], + "USE_PKCE": True, + "VERIFY_SSL": True, + "TIMEOUT": 5, + "ALLOW_REDIRECTS": True, +} + +# Mapping of settings to OpenID Connect configuration keys +CONFIGURATION_KEY = { + "AUTHORIZATION_PATH": "authorization_endpoint", + "TOKEN_PATH": "token_endpoint", + "USERINFO_PATH": "userinfo_endpoint", + "LOGOUT_PATH": "end_session_endpoint", + "JWKS_PATH": "jwks_uri", + "SIGNING_ALGORITHMS": "id_token_signing_alg_values_supported", +} + +# Settings that may be imported from strings +IMPORT_STRINGS = {"TOKEN_USERINFO_HANDLER", "TOKEN_PAYLOAD_HANDLER"} + +# Mandatory settings that must be either loaded from OpenID configuration, +# or provided by the user +MANDATORY = { + "CLIENT_ID", + "CLIENT_SECRET", + "REDIRECT_URI", + "POST_LOGOUT_REDIRECT_URI", + "BASE_URL", + "AUTHORIZATION_PATH", + "TOKEN_PATH", + "USERINFO_PATH", + "JWKS_PATH", + "LOGOUT_PATH", + "SIGNING_ALGORITHMS", +} + + +def import_from_string(v: str, provider: str, setting_name: str) -> type: + """Attempt to import a class from a string representation.""" + try: + return import_string(v) + except ImportError as e: # pragma: no cover + raise ImportError( + f"Could not import {v} for SIMPLE_OAUTH2 setting '{provider}[{setting_name}]' {e.__class__.__name__}: {e}." + ) + + +class OAuth2ProviderSettings: + """ + A settings object, that allows OAuth2 Provider settings to be accessed as properties. + + Any setting with string import paths will be automatically resolved + and return the class, rather than the string literal. + """ + + def __init__(self, alias: str, user_settings: dict): + self._alias = alias + + # Try retrieving some settings from the provider's OpenID configuration + user_settings = DEFAULTS | user_settings + url = urllib.parse.urljoin(user_settings["BASE_URL"], user_settings["OPENID_CONFIGURATION_PATH"]) + provider_settings = self._load_settings_from_provider( + url, user_settings["TIMEOUT"], user_settings["VERIFY_SSL"], user_settings["ALLOW_REDIRECTS"] + ) + + settings = provider_settings | user_settings + if missing := MANDATORY - {k for k, v in settings.items() if v}: # pragma: no cover + raise ImproperlyConfigured( + f"OAuth2 provider '{self.alias}' is missing mandatory settings: {', '.join(missing)}" + ) + + self._user_settings = settings + + def __getattr__(self, attr: str) -> Any: + """Return the setting value or raise an AttributeError.""" + if attr not in self._user_settings: # pragma: no cover + raise AttributeError(f"Invalid SIMPLE_OAUTH2 setting: '{self.alias}[{attr}]'") + if attr in IMPORT_STRINGS: + return self._perform_import(self._user_settings[attr], attr) + return self._user_settings[attr] + + def _load_settings_from_provider( + self, url: str, timeout: int, verify: bool, allow_redirects: bool + ) -> dict[str, Any]: + """Load settings from the provider's OpenID configuration endpoint.""" + try: + response = requests.get(url, timeout=timeout, verify=verify, allow_redirects=allow_redirects) + response.raise_for_status() + except requests.RequestException as e: # pragma: no cover + logger.warning("Could not fetch '%s' OpenID configuration from '%s': %s", self.alias, url, e) + return {} + configuration = response.json() + return {setting: configuration[path] for setting, path in CONFIGURATION_KEY.items()} + + def _perform_import(self, value: str, setting_name: str) -> Callable: # pragma: no cover + """Import a class from a string representation.""" + if isinstance(value, str): + return import_from_string(value, self.alias, setting_name) + elif isinstance(value, Callable): + return value + raise ImproperlyConfigured( + f"SIMPLE_OAUTH2 setting '{self.alias}[{setting_name}]' must be a string or callable." + ) + + @property + def alias(self) -> str: + """Return the provider alias.""" + return self._alias + + def jwks_uri(self) -> str: + """Return the full JWKS URL.""" + return urllib.parse.urljoin(self.BASE_URL, self.JWKS_PATH) + + def authorization_uri(self) -> str: + """Return the full authorization URL.""" + return urllib.parse.urljoin(self.BASE_URL, self.AUTHORIZATION_PATH) + + def token_uri(self) -> str: + """Return the full token URL.""" + return urllib.parse.urljoin(self.BASE_URL, self.TOKEN_PATH) + + def userinfo_uri(self) -> str: + """Return the full token URL.""" + return urllib.parse.urljoin(self.BASE_URL, self.USERINFO_PATH) + + +oauth2_settings = { + alias: OAuth2ProviderSettings(alias, settings) for alias, settings in getattr(settings, "SIMPLE_OAUTH2", {}).items() +} diff --git a/simple_oauth2/urls.py b/simple_oauth2/urls.py new file mode 100644 index 0000000..cd7eb67 --- /dev/null +++ b/simple_oauth2/urls.py @@ -0,0 +1,13 @@ +from django.urls import include, path +from rest_framework import routers + +from simple_oauth2 import views + +app_name = "simple_oauth2" + +router = routers.SimpleRouter() +router.register(r"oauth2", views.OAuth2ViewSet, basename="oauth2") + +urlpatterns = [ + path("", include(router.urls)), +] diff --git a/simple_oauth2/utils.py b/simple_oauth2/utils.py new file mode 100644 index 0000000..74edb1f --- /dev/null +++ b/simple_oauth2/utils.py @@ -0,0 +1,86 @@ +import secrets +import ssl +import string +import urllib.parse +from typing import Any + +import jwt +from django.contrib.auth import get_user_model +from django.db import models +from rest_framework.exceptions import ValidationError + +from simple_oauth2.settings import OAuth2ProviderSettings + + +def generate_nonce(size: int = 128) -> str: + """Generate a random nonce as an hexadecimal string.""" + return secrets.token_hex(size // 2) + + +def generate_state(size: int = 128) -> str: + """Generate a random state as an hexadecimal string.""" + return secrets.token_hex(size // 2) + + +def generate_code_verifier(size: int = 128) -> str: + """Generate a random code verifier.""" + if not (43 <= size <= 128): + raise ValueError("code_verifier must be 43..128 chars (RFC 7636).") + return "".join(secrets.choice(string.ascii_letters + string.digits + "-._~") for _ in range(size)) + + +def decode_jwt(provider: OAuth2ProviderSettings, token: str) -> dict: + """Decode a JWT token using the provider's JKWS URI.""" + try: + ssl_context = ssl._create_unverified_context() if not provider.VERIFY_SSL else None # nosec: B323 + jwks_client = jwt.PyJWKClient(provider.jwks_uri(), ssl_context=ssl_context, timeout=provider.TIMEOUT) + key = jwks_client.get_signing_key_from_jwt(token).key + except jwt.PyJWKClientConnectionError as e: # pragma: no cover + raise ValidationError({"__all__": f"Failed to fetch JKWS from the provider: {e}"}) + return jwt.decode(token, key, algorithms=provider.SIGNING_ALGORITHMS, audience=provider.CLIENT_ID) + + +def get_user(provider: OAuth2ProviderSettings, userinfo: dict, **kwargs: Any) -> models.Model: + """Create or update a user from the id_token and the userinfo dictionary.""" + from simple_oauth2.models import Sub + + User = get_user_model() + + claims = decode_jwt(provider=provider, token=kwargs["id_token"]) if "id_token" in kwargs else {} + sub_value = claims.get("sub") or userinfo.get("sub") + username = (claims.get("preferred_username") or userinfo.get("preferred_username")) or ( + claims.get("email") or userinfo.get("email") + ) + try: + sub = Sub.objects.get(_provider=provider.alias, sub=sub_value) + sub.save(update_fields=["last_login"]) # Update the 'last_login' timestamp + user = sub.user + except Sub.DoesNotExist: + user = User.objects.create_user(username=username) + Sub.objects.create(user=user, _provider=provider.alias, sub=sub_value) + + user.first_name = claims.get("given_name", "") or userinfo.get("given_name", "") + user.last_name = claims.get("family_name", "") or userinfo.get("family_name", "") + user.email = claims.get("email", "") or userinfo.get("email", "") + user.save() + + return user + + +def simple_jwt_authenticate( + provider: OAuth2ProviderSettings, oauth2_tokens: dict[str, str], user: models.Model +) -> dict: + """Create a simple JWT token payload.""" + from rest_framework_simplejwt.tokens import RefreshToken + + params = { + "client_id": provider.CLIENT_ID, + "id_token_hint": oauth2_tokens["id_token"], + "post_logout_redirect_uri": provider.POST_LOGOUT_REDIRECT_URI, + } + url = urllib.parse.urljoin(provider.BASE_URL, provider.LOGOUT_PATH) + refresh = RefreshToken.for_user(user) + return { + "api": {"refresh": str(refresh), "access": str(refresh.access_token)}, + "provider": oauth2_tokens | {"logout_url": f"{url}?{urllib.parse.urlencode(params)}"}, + } diff --git a/simple_oauth2/views.py b/simple_oauth2/views.py new file mode 100644 index 0000000..efdaaea --- /dev/null +++ b/simple_oauth2/views.py @@ -0,0 +1,56 @@ +from rest_framework import viewsets +from rest_framework.decorators import action +from rest_framework.exceptions import ValidationError +from rest_framework.request import Request +from rest_framework.response import Response + +from simple_oauth2.enums import Status +from simple_oauth2.exceptions import UnknownProvider +from simple_oauth2.models import Session +from simple_oauth2.serializers import TokenSerializer +from simple_oauth2.settings import oauth2_settings + + +class OAuth2ViewSet(viewsets.GenericViewSet): + """Allows authentication through FranceConnect.""" + + authentication_classes: list[type] = [] + permission_classes: list[type] = [] + serializer_class = TokenSerializer + + @action(detail=False, methods=("get",)) + def url(self, request: Request) -> Response: + """Return the OAuth2 URL the login button must use.""" + if (provider := request.query_params.get("provider")) is None: + raise ValidationError( + {"provider": f"OAuth2 provider required, allowed values are: '{', '.join(oauth2_settings)}'"} + ) + try: + session = Session.start(provider) + except UnknownProvider: + raise ValidationError( + { + "provider": f"Unknown OAuth2 provider '{provider}', allowed values are: '{', '.join(oauth2_settings)}'" + } + ) + return Response({"url": session.authentication_url()}) + + @action(detail=False, methods=("post",), serializer_class=TokenSerializer) + def token(self, request: Request) -> Response: + """Return tokens using the code obtained from your provider.""" + serializer = self.get_serializer(data=self.request.data) + serializer.is_valid(raise_exception=True) + + try: + session = Session.objects.get( + _provider=serializer.validated_data["provider"], + state=serializer.validated_data["state"], + status=Status.PENDING, + ) + except Session.DoesNotExist: + raise ValidationError({"state": "No ongoing session matches the provided state."}) + + oauth2_tokens = session.get_tokens(serializer.validated_data["code"]) + user = session.get_user(**oauth2_tokens) + payload = session.get_payload(oauth2_tokens, user) + return Response(payload) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..af8f71f --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,140 @@ +import functools +from types import SimpleNamespace +from typing import Any +from unittest import mock + +import jwt +import requests + +from simple_oauth2.settings import OAuth2ProviderSettings + +CONFIGURATION_RESPONSE = { + "authorization_endpoint": "https://example.com/authorize", + "token_endpoint": "https://example.com/token", + "userinfo_endpoint": "https://example.com/userinfo", + "jwks_uri": "https://example.com/.well-known/jwks.json", + "end_session_endpoint": "https://example.com/logout", + "login_endpoint": "https://example.com/login", + "id_token_signing_alg_values_supported": ["plain", "HS256"], +} + +SIMPLE_OAUTH2_SETTINGS = { + "pkce-plain": { + "CLIENT_ID": "pkce-plain", + "CLIENT_SECRET": "pkce-plain", + "BASE_URL": "https://example.com", + "REDIRECT_URI": "https://example.com/callback", + "POST_LOGOUT_REDIRECT_URI": "https://example.com/logout", + "CODE_CHALLENGE_METHOD": "plain", + }, + "pkce-s256": { + "CLIENT_ID": "pkce-s256", + "CLIENT_SECRET": "pkce-s256", + "BASE_URL": "https://example.com", + "REDIRECT_URI": "https://example.com/callback", + "POST_LOGOUT_REDIRECT_URI": "https://example.com/logout", + "CODE_CHALLENGE_METHOD": "s256", + }, + "pkce-unknown-alg": { + "CLIENT_ID": "pkce-s256", + "CLIENT_SECRET": "pkce-s256", + "BASE_URL": "https://example.com", + "REDIRECT_URI": "https://example.com/callback", + "POST_LOGOUT_REDIRECT_URI": "https://example.com/logout", + "CODE_CHALLENGE_METHOD": "unknown", + }, + "no-pkce": { + "CLIENT_ID": "no-pkce", + "CLIENT_SECRET": "no-pkce", + "BASE_URL": "https://example.com", + "REDIRECT_URI": "https://example.com/callback", + "POST_LOGOUT_REDIRECT_URI": "https://example.com/logout", + "USE_PKCE": False, + }, + "extra-params": { + "CLIENT_ID": "extra-params", + "CLIENT_SECRET": "extra-params", + "BASE_URL": "https://example.com", + "REDIRECT_URI": "https://example.com/callback", + "POST_LOGOUT_REDIRECT_URI": "https://example.com/logout", + "USE_PKCE": False, + "AUTHORIZATION_EXTRA_PARAMETERS": {"foo": "bar", "baz": "qux"}, + }, + "token-fails": { + "CLIENT_ID": "token-fails", + "CLIENT_SECRET": "token-fails", + "BASE_URL": "https://example.com", + "REDIRECT_URI": "https://example.com/callback", + "POST_LOGOUT_REDIRECT_URI": "https://example.com/logout", + "USE_PKCE": False, + "TOKEN_PATH": "/unknown", + }, + "userinfo-fails": { + "CLIENT_ID": "userinfo-fails", + "CLIENT_SECRET": "userinfo-fails", + "BASE_URL": "https://example.com", + "REDIRECT_URI": "https://example.com/callback", + "POST_LOGOUT_REDIRECT_URI": "https://example.com/logout", + "USE_PKCE": False, + "USERINFO_PATH": "/unknown", + }, +} + + +def raise_request_exception(): + """Helper to raise a requests.RequestException from a lambda.""" + raise requests.RequestException(response=SimpleNamespace(status_code="404", content='{"detail": "error"}'.encode())) + + +def mocked_requests(method, url, data=None, **kwargs): + """Mocked requests.request return values.""" + match (method.upper(), url): + case "GET", "https://example.com/.well-known/openid-configuration": + return SimpleNamespace( + status_code="200", json=lambda: CONFIGURATION_RESPONSE, raise_for_status=lambda: None + ) + case "POST", "https://example.com/token": + return SimpleNamespace( + status_code="200", + json=lambda: { + "access_token": "abcdefghijklmnopqrstuwxz", + "id_token": jwt.encode( + { + "sub": "1234567890", + "email": "test@test.com", + "preferred_username": "test", + "aud": data["code"][:-5], + }, + "key", + algorithm="HS256", + ), + }, + raise_for_status=lambda: None, + ) + case "GET", "https://example.com/userinfo": + return SimpleNamespace( + status_code="200", + json=lambda: {"sub": "1234567890", "email": "test@test.com", "preferred_username": "test"}, + raise_for_status=lambda: None, + ) + case _: + return SimpleNamespace( + status_code="404", json=lambda: {"detail": "Not found."}, raise_for_status=raise_request_exception() + ) + + +class override_oauth2_settings: + """Patch 'settings.oauth2_settings' with the provided SIMPLE_OAUTH2 dict.""" + + def __init__(self, simple_oauth2: dict): + self.simple_oauth2 = simple_oauth2 + + def __call__(self, func): + @functools.wraps(func) + def wrapper(*args: Any, **kwargs: Any): + with mock.patch("requests.api.request", side_effect=mocked_requests): + new = {alias: OAuth2ProviderSettings(alias, settings) for alias, settings in self.simple_oauth2.items()} + with mock.patch.dict("simple_oauth2.settings.oauth2_settings", new, clear=True): + return func() + + return wrapper diff --git a/tests/test_models.py b/tests/test_models.py new file mode 100644 index 0000000..aed0f6e --- /dev/null +++ b/tests/test_models.py @@ -0,0 +1,87 @@ +from contextlib import contextmanager +from datetime import timedelta +from typing import Any, Callable, TypeVar + +import pytest +from django.db import models +from django.utils import timezone + +from simple_oauth2.exceptions import SimpleOAuth2Error, UnknownProvider +from simple_oauth2.models import Session +from simple_oauth2.utils import generate_state +from tests.conftest import SIMPLE_OAUTH2_SETTINGS, override_oauth2_settings + +STATE1 = generate_state() +STATE2 = generate_state() + +T = TypeVar("T") + + +@contextmanager +def override_field_default(model: type[models.Model], field_name: str, default: Callable[[], Any]): + field = model._meta.get_field(field_name) + old = field.default + try: + field._get_default = default + field.default = default + yield + finally: + field.default = old + field._get_default = old + + +class ValuesDefault: + """Callable class to return values from a list one after the other.""" + + def __init__(self, values: list[T]): + self.values = values + self.index = 0 + + def __call__(self) -> T: + value = self.values[self.index] + self.index = (self.index + 1) % len(self.values) + return value + + +@pytest.mark.django_db +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_start_multiple_try(): + with override_field_default(Session, "state", ValuesDefault([STATE1] * 5 + [STATE2])): + session = Session.start("no-pkce") + assert session.state == STATE1 + session2 = Session.start("no-pkce") + assert session2.state == STATE2 + + +@pytest.mark.django_db +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_start_integrity_error(): + with override_field_default(Session, "state", ValuesDefault([STATE1] * 11)): + Session.start("no-pkce") + with pytest.raises( + SimpleOAuth2Error, match="Could not create a unique authorization session after 10 attempts." + ): + Session.start("no-pkce") + + +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_provider_unknown(): + session = Session(_provider="unknown") + with pytest.raises(UnknownProvider, match="Unknown OAuth2 provider 'unknown'"): + _ = session.provider + + +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_has_expired(): + session = Session(_provider="no-pkce", created_at=timezone.now()) + assert not session.has_expired() + session.created_at = timezone.now() - timedelta(days=1) + assert session.has_expired() + + +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_has_expired_naive(): + session = Session(_provider="no-pkce", created_at=timezone.now().replace(tzinfo=None)) + assert not session.has_expired() + session.created_at = (timezone.now() - timedelta(days=1)).replace(tzinfo=None) + assert session.has_expired() diff --git a/tests/test_project/__init__.py b/tests/test_project/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_project/test_project_conf/__init__.py b/tests/test_project/test_project_conf/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_project/test_project_conf/asgi.py b/tests/test_project/test_project_conf/asgi.py new file mode 100644 index 0000000..2ed72e0 --- /dev/null +++ b/tests/test_project/test_project_conf/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for test_project project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test_project_conf.settings") + +application = get_asgi_application() diff --git a/tests/test_project/test_project_conf/settings.py b/tests/test_project/test_project_conf/settings.py new file mode 100644 index 0000000..7116dd4 --- /dev/null +++ b/tests/test_project/test_project_conf/settings.py @@ -0,0 +1,121 @@ +""" +Django settings for test_project project. + +Generated by 'django-admin startproject' using Django 4.1.3. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.1/ref/settings/ +""" + +import os +import sys +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + +sys.path.append(str(BASE_DIR)) + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = "django-insecure-o2p02q(1rym0^aqt4=3$w+mokgz^#je^*l&9v-v_ma71276je#" + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + +# Application definition +INSTALLED_APPS = [ + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", + "simple_oauth2", +] + +MIDDLEWARE = [ + "django.middleware.security.SecurityMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", +] + +ROOT_URLCONF = "test_project_conf.urls" + +TEMPLATES = [ + { + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [], + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", + ], + }, + }, +] + +WSGI_APPLICATION = "test_project_conf.wsgi.application" + +# Database +# https://docs.djangoproject.com/en/4.1/ref/settings/#databases + +DATABASES = { + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": os.path.join(BASE_DIR, "db.sqlite3"), + } +} + +# Password validation +# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", + }, +] + +# Internationalization +# https://docs.djangoproject.com/en/4.1/topics/i18n/ + +LANGUAGE_CODE = "en-us" + +TIME_ZONE = "UTC" + +USE_I18N = True + +USE_TZ = True + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.1/howto/static-files/ + +STATIC_URL = "static/" + +# Default primary key field type +# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" diff --git a/tests/test_project/test_project_conf/urls.py b/tests/test_project/test_project_conf/urls.py new file mode 100644 index 0000000..b40e7f2 --- /dev/null +++ b/tests/test_project/test_project_conf/urls.py @@ -0,0 +1,21 @@ +"""test_project URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.1/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" + +from django.urls import include, path + +urlpatterns = [ + path("oauth2/", include("simple_oauth2.urls", namespace="simple_oauth2")), +] diff --git a/tests/test_project/test_project_conf/wsgi.py b/tests/test_project/test_project_conf/wsgi.py new file mode 100644 index 0000000..6179ef3 --- /dev/null +++ b/tests/test_project/test_project_conf/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for test_project project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test_project_conf.settings") + +application = get_wsgi_application() diff --git a/tests/test_utils.py b/tests/test_utils.py new file mode 100644 index 0000000..9a5c73c --- /dev/null +++ b/tests/test_utils.py @@ -0,0 +1,47 @@ +import pytest +from django.contrib.auth import get_user_model + +from simple_oauth2.models import Sub +from simple_oauth2.settings import oauth2_settings +from simple_oauth2.utils import generate_code_verifier, get_user +from tests.conftest import SIMPLE_OAUTH2_SETTINGS, override_oauth2_settings + + +def test_generate_code_verifier(): + assert generate_code_verifier() + with pytest.raises(ValueError): + generate_code_verifier(10) + with pytest.raises(ValueError): + generate_code_verifier(200) + + +@pytest.mark.django_db +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_get_user(): + user = get_user( + provider=oauth2_settings["no-pkce"], + userinfo={ + "sub": "123456", + "preferred_username": "user", + "email": "test@test.com", + }, + ) + assert Sub.objects.filter(sub="123456").exists() + assert user.username == "user" + assert user.email == "test@test.com" + + +@pytest.mark.django_db +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_get_user_through_sub(): + created = get_user_model().objects.create(username="user1", email="test@test.com") + Sub.objects.create(user=created, _provider="no-pkce", sub="123456") + got = get_user( + provider=oauth2_settings["no-pkce"], + userinfo={ + "sub": "123456", + "preferred_username": "user2", # Use another username to ensure sub is used + "email": "test@test.com", + }, + ) + assert created.pk == got.pk diff --git a/tests/test_viewsets.py b/tests/test_viewsets.py new file mode 100644 index 0000000..fc1960d --- /dev/null +++ b/tests/test_viewsets.py @@ -0,0 +1,238 @@ +from datetime import timedelta +from types import SimpleNamespace +from unittest.mock import patch +from urllib.parse import parse_qs, urlparse + +import pytest +from django.urls import reverse +from django.utils import timezone +from rest_framework.test import APIClient + +from simple_oauth2.exceptions import SimpleOAuth2Error +from simple_oauth2.models import Session +from simple_oauth2.settings import oauth2_settings +from tests.conftest import SIMPLE_OAUTH2_SETTINGS, override_oauth2_settings + + +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_oauth2_url_no_provider(): + client = APIClient() + response = client.get(reverse("simple_oauth2:oauth2-url")) + assert response.status_code == 400 + assert response.json() == { + "provider": f"OAuth2 provider required, allowed values are: '{', '.join(oauth2_settings.keys())}'" + } + + +@pytest.mark.django_db +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_oauth2_url_unknown_provider(): + client = APIClient() + response = client.get(reverse("simple_oauth2:oauth2-url"), {"provider": "unknown"}) + assert response.status_code == 400 + assert response.json() == { + "provider": f"Unknown OAuth2 provider 'unknown', allowed values are: '{', '.join(oauth2_settings.keys())}'" + } + + +@pytest.mark.django_db +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_oauth2_url_pkce_unknown_alg(): + client = APIClient() + with pytest.raises(SimpleOAuth2Error, match="Unknown challenge method: 'unknown'"): + client.get(reverse("simple_oauth2:oauth2-url"), {"provider": "pkce-unknown-alg"}) + + +@pytest.mark.django_db +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_oauth2_extra_params_url(): + client = APIClient() + response = client.get(reverse("simple_oauth2:oauth2-url"), {"provider": "extra-params"}) + assert response.status_code == 200, response.json() + assert "url" in response.json() + url = response.json()["url"] + query_params = parse_qs(urlparse(url).query) + assert query_params["client_id"] == ["extra-params"] + assert query_params["response_type"] == ["code"] + assert query_params["redirect_uri"] == ["https://example.com/callback"] + assert query_params["scope"] == ["openid profile email"] + assert "state" in query_params + assert "nonce" in query_params + assert "foo" in query_params + assert query_params["foo"] == ["bar"] + assert "baz" in query_params + assert query_params["baz"] == ["qux"] + + +@pytest.mark.django_db +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_oauth2_token_unknown_session(): + client = APIClient() + response = client.post( + reverse("simple_oauth2:oauth2-token"), {"provider": "pkce", "state": "unknown", "code": "code"} + ) + assert response.status_code == 400 + assert response.json() == {"state": "No ongoing session matches the provided state."} + + +@pytest.mark.django_db +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_oauth2_token_expired(): + client = APIClient() + response = client.get(reverse("simple_oauth2:oauth2-url"), {"provider": "no-pkce"}) + state = parse_qs(urlparse(response.json()["url"]).query)["state"][0] + Session.objects.filter(state=state).update(created_at=timezone.now() - timedelta(days=1)) + response = client.post( + reverse("simple_oauth2:oauth2-token"), {"provider": "no-pkce", "state": state, "code": "no-pkce-code"} + ) + assert response.status_code == 400 + assert response.json() == {"__all__": "Authorization session has expired."} + + +@pytest.mark.django_db +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_oauth2_token_fails(): + client = APIClient() + response = client.get(reverse("simple_oauth2:oauth2-url"), {"provider": "token-fails"}) + state = parse_qs(urlparse(response.json()["url"]).query)["state"][0] + response = client.post( + reverse("simple_oauth2:oauth2-token"), {"provider": "token-fails", "state": state, "code": "token-fails-code"} + ) + assert response.status_code == 400 + assert response.json() == {"__all__": 'Failed to retrieve tokens from provider: {"detail": "error"}'} + + +@pytest.mark.django_db +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_oauth2_userinfo_fails(): + client = APIClient() + response = client.get(reverse("simple_oauth2:oauth2-url"), {"provider": "userinfo-fails"}) + state = parse_qs(urlparse(response.json()["url"]).query)["state"][0] + response = client.post( + reverse("simple_oauth2:oauth2-token"), + {"provider": "userinfo-fails", "state": state, "code": "userinfo-fails-code"}, + ) + assert response.status_code == 400 + assert response.json() == {"__all__": 'Failed to fetch user info from the provider: {"detail": "error"}.'} + + +@pytest.mark.django_db +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_oauth2_without_pkce_url(): + client = APIClient() + response = client.get(reverse("simple_oauth2:oauth2-url"), {"provider": "no-pkce"}) + assert response.status_code == 200 + assert "url" in response.json() + url = response.json()["url"] + query_params = parse_qs(urlparse(url).query) + assert query_params["client_id"] == ["no-pkce"] + assert query_params["response_type"] == ["code"] + assert query_params["redirect_uri"] == ["https://example.com/callback"] + assert query_params["scope"] == ["openid profile email"] + assert "state" in query_params + assert "nonce" in query_params + assert "code_challenge" not in query_params + assert "code_challenge_method" not in query_params + + +@pytest.mark.django_db +@patch("jwt.jwks_client.PyJWKClient.get_signing_key", side_effect=lambda token: SimpleNamespace(key="key")) +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_oauth2_without_pkce_token(): + client = APIClient() + response = client.get(reverse("simple_oauth2:oauth2-url"), {"provider": "no-pkce"}) + state = parse_qs(urlparse(response.json()["url"]).query)["state"][0] + response = client.post( + reverse("simple_oauth2:oauth2-token"), {"provider": "no-pkce", "state": state, "code": "no-pkce-code"} + ) + assert response.status_code == 200, response.json() + data = response.json() + assert "api" in data + assert "access" in data["api"] + assert "refresh" in data["api"] + assert "provider" in data + assert "logout_url" in data["provider"] + assert "id_token" in data["provider"] + assert "access_token" in data["provider"] + + +@pytest.mark.django_db +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_oauth2_with_pkce_plain_url(): + client = APIClient() + response = client.get(reverse("simple_oauth2:oauth2-url"), {"provider": "pkce-plain"}) + assert response.status_code == 200 + assert "url" in response.json() + url = response.json()["url"] + query_params = parse_qs(urlparse(url).query) + assert query_params["client_id"] == ["pkce-plain"] + assert query_params["response_type"] == ["code"] + assert query_params["redirect_uri"] == ["https://example.com/callback"] + assert query_params["scope"] == ["openid profile email"] + assert "state" in query_params + assert "nonce" in query_params + assert "code_challenge" in query_params + assert "code_challenge_method" in query_params + assert query_params["code_challenge_method"] == ["plain"] + + +@pytest.mark.django_db +@patch("jwt.jwks_client.PyJWKClient.get_signing_key", side_effect=lambda token: SimpleNamespace(key="key")) +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_oauth2_with_pkce_plain_token(): + client = APIClient() + response = client.get(reverse("simple_oauth2:oauth2-url"), {"provider": "pkce-plain"}) + state = parse_qs(urlparse(response.json()["url"]).query)["state"][0] + response = client.post( + reverse("simple_oauth2:oauth2-token"), {"provider": "pkce-plain", "state": state, "code": "pkce-plain-code"} + ) + assert response.status_code == 200, response.json() + data = response.json() + assert "api" in data + assert "access" in data["api"] + assert "refresh" in data["api"] + assert "provider" in data + assert "logout_url" in data["provider"] + assert "id_token" in data["provider"] + assert "access_token" in data["provider"] + + +@pytest.mark.django_db +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_oauth2_with_pkce_s256_url(): + client = APIClient() + response = client.get(reverse("simple_oauth2:oauth2-url"), {"provider": "pkce-s256"}) + assert response.status_code == 200 + assert "url" in response.json() + url = response.json()["url"] + query_params = parse_qs(urlparse(url).query) + assert query_params["client_id"] == ["pkce-s256"] + assert query_params["response_type"] == ["code"] + assert query_params["redirect_uri"] == ["https://example.com/callback"] + assert query_params["scope"] == ["openid profile email"] + assert "state" in query_params + assert "nonce" in query_params + assert "code_challenge" in query_params + assert "code_challenge_method" in query_params + assert query_params["code_challenge_method"] == ["s256"] + + +@pytest.mark.django_db +@patch("jwt.jwks_client.PyJWKClient.get_signing_key", side_effect=lambda token: SimpleNamespace(key="key")) +@override_oauth2_settings(SIMPLE_OAUTH2_SETTINGS) +def test_oauth2_with_pkce_s256_token(): + client = APIClient() + response = client.get(reverse("simple_oauth2:oauth2-url"), {"provider": "pkce-s256"}) + state = parse_qs(urlparse(response.json()["url"]).query)["state"][0] + response = client.post( + reverse("simple_oauth2:oauth2-token"), {"provider": "pkce-s256", "state": state, "code": "pkce-s256-code"} + ) + assert response.status_code == 200, response.json() + data = response.json() + assert "api" in data + assert "access" in data["api"] + assert "refresh" in data["api"] + assert "provider" in data + assert "logout_url" in data["provider"] + assert "id_token" in data["provider"] + assert "access_token" in data["provider"]