Skip to main content

Capture and store OAuth2 tokens for later use.

Project description

OAuth2 Token Capture for Django

This Django package that enables easy capture of OAuth2 tokens from various providers like X (Twitter), LinkedIn, and GitHub.

Features

  • OAuth2 token exchange
  • User information retrieval
  • Support for multiple providers
  • Easily extendable to support new providers

Requirements

  • Python 3.6+
  • Django 3.0+
  • requests

You will also need to setup an OAuth2 application with each provider you want to use. This will give you a client ID and client secret that you will need to configure the package.

Installation

Install the package using pip:

pip install oauth2_capture

or while in development mode:

pip install -e .

or from another project, make sure to follow HEAD on master from https://github.com/heysamtexas/django-oauth2-capture:

pip install git+https://github.com/yourusername/django-oauth2-capture.git@master

Configuration

Add it to your installed apps in your Django settings file:

INSTALLED_APPS = [
    ...
    'oauth2_capture',
    ...
]

Usage

  • TODO

Adding a new provider

class NewProviderOAuth2Provider(OAuth2Provider):
    @property
    def authorize_url(self) -> str:
        return "https://newprovider.com/oauth/authorize"

    @property
    def token_url(self) -> str:
        return "https://newprovider.com/oauth/token"

    @property
    def user_info_url(self) -> str:
        return "https://api.newprovider.com/userinfo"

    def get_user_info(self, access_token: str) -> dict:
        headers = {"Authorization": f"Bearer {access_token}"}
        response = requests.get(self.user_info_url, headers=headers, timeout=10)
        return response.json()

    def exchange_code_for_token(self, code: str, redirect_uri: str) -> dict:
        data = {
            "grant_type": "authorization_code",
            "code": code,
            "redirect_uri": redirect_uri,
            "client_id": self.config["client_id"],
            "client_secret": self.config["client_secret"],
        }
        headers = {"Content-Type": "application/x-www-form-urlencoded"}
        response = requests.post(self.token_url, data=data, headers=headers, timeout=10)
        return response.json()

User Flow

The following is a simplified user flow for how we obtain and save the oauth tokens. The flow is as follows:

sequenceDiagram
    participant U as User
    participant C as Client
    participant P as Provider
    U->>C: Clicks on "connect" with provider
    C->>P: Redirects to provider's authorize URL
    P->>C: Redirects to client's redirect URI with code
    C->>P: Exchanges code for token
    P->>C: Returns token
    C->>P: Retrieves user info
    P->>C: Returns user info
    C->>U: Redirects to home page
    C->>C: Save or update the user token in database

Note: if the user is not logged in at their provider, they will be prompted to login before they can authorize the client. (This is not shown in the diagram)

Setting up your development environment

  1. Clone the repository
  2. Create a virtual environment
  3. Install the requirements
  4. Configure the environment variables
    1. Acquire the client ID and client secret from the providers
    2. Put client_id and secrets into local env file in the development/ folder
  5. Migrate the database with python manage.py migrate
## License

- see [LICENSE](LICENSE) file


## Appendix

### Provider's endpoints, docs, etc

- [Twitter](https://developer.twitter.com/en/docs/authentication/oauth-2-0)
- [LinkedIn](https://docs.microsoft.com/en-us/linkedin/shared/authentication/authorization-code-flow?context=linkedin/context)
- [GitHub](https://docs.github.com/en/developers/apps/building-oauth-apps/authorizing-oauth-apps)
- [Reddit](https://github.com/reddit-archive/reddit/wiki/OAuth2)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

oauth2_capture-0.1.6.tar.gz (18.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

oauth2_capture-0.1.6-py3-none-any.whl (14.4 kB view details)

Uploaded Python 3

File details

Details for the file oauth2_capture-0.1.6.tar.gz.

File metadata

  • Download URL: oauth2_capture-0.1.6.tar.gz
  • Upload date:
  • Size: 18.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.32.3

File hashes

Hashes for oauth2_capture-0.1.6.tar.gz
Algorithm Hash digest
SHA256 85ed7bdbf8d049130e62a7947886e7d147498730bda6dd9382981e51db651d4f
MD5 5d6545aca8241db779cba3c1eee644c5
BLAKE2b-256 0d94ba6e0967247ac07f1bcc49291a9304d8c6f31f8399e0213f267a7d8d6f84

See more details on using hashes here.

File details

Details for the file oauth2_capture-0.1.6-py3-none-any.whl.

File metadata

File hashes

Hashes for oauth2_capture-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 bca3833fe49de9bf8da5ee49bb5754e50347e9f7c8abff2302a73c17d065d734
MD5 61bace9e23ee6c231d4da0eff5028b90
BLAKE2b-256 abb5226dac1909707eee59a0f1b00d708f21c6954d10322ebb8714d0614dd240

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page