django-salesforce-oauth 1.0.0
Simple package for creating and signing users into your Django site using Salesforce as an OAuth provider
License: MIT
Requires Python: >=3.8,<4.0
Keywords: django,salesforce,oauth

# Quick start

Assuming you've already configured an app in your Salesforce instance to serve
as an OAuth provider, the following should get you up and running.

## Install

`pip install django-salesforce-oauth`

## Settings

Add the app to your `INSTALLED_APPS` in your django settings (`settings.py`):

```python
INSTALLED_APPS = [
    # ...
    "django_salesforce_oauth",
]
```

Add the following required variables to your `settings.py`:

```python
SCOPES = "YOUR SCOPES"  # space delimited, e.g., "id api refresh_token"
SFDC_CONSUMER_KEY = "YOUR KEY"
SFDC_CONSUMER_SECRET = "YOUR SECRET"
OAUTH_REDIRECT_URI = "{YOUR DOMAIN}/oauth/callback/"

# Optional, but Django provides a default you likely don't want
LOGIN_REDIRECT_URL = "/"
```

## Urls

Add `django-salesforce-oauth`'s urls to your main `urls.py`.

```python
from django.urls import path, include

urlpatterns = [
    # ...
    path("oauth/", include("django_salesforce_oauth.urls")),
]
```

Then redirect sign-in requests to the `oauth` namespace.

### View example

```python
from django.shortcuts import redirect

def your_view(request):
    return redirect("oauth")  # or "oauth-sandbox"
```

### Template example

```html
<a href="{% url 'oauth' %}" class="btn btn-primary">Login</a>
```

# Advanced usage

## Custom callback

You likely will want to customize what happens after the OAuth flow is complete instead of simply
getting or creating a user. This can be done by specifying the following in your `settings.py`.

```python
CUSTOM_CALLBACK = "path.to.module.your_callback_function"
```

`your_callback_function` must accept the following two arguments:

1. the request object (useful in case you want to handle redirection yourself)
2. the OAuth object (contains all token and user data)

If you send the user to the `oauth` view with a query parameter called `state`, then you must
provide a third, optional argument to your custom callback function.

3. the state parameter. Only requered if you redirect to `oauth` with `?state=value` in your
   query params.

An example signature is:

```python
def your_callback_function(request, oauth, state=None):
    ...
```

If you do not return a redirect from `your_callback_function`, it's expected it will return
a user object. In this case the user will then be signed in and redirected to
`settings.LOGIN_REDIRECT_URL` (which you'll most likely want to set in your `settings.py`).

### Customizing the callback URI

By default the view behind the `oauth-callback` namespace, specified in the `django_salesforce_oauth`'s app's `urls.py`, is what needs to match `settings.OAUTH_REDIRECT_URI`.
But this can be customized by pointing it to some other url and registering the view wherever
you'd like it declared.

```python
# urls.py

from django_salesforce_oauth.views import oauth_callback

urlpatterns = [
    # ...
    # pass {"domain": "test"} to use a sandbox
    path("my/custom/url", oauth_callback, {"domain": "login"}, name="custom-oauth-callback"),
]
```

# Example project

The example project provides a full example of how to use this package,
but since it's an integration, there's a few steps to actually running it.

## SFDC

Configure a SFDC OAuth app with which you can OAuth against.

## .env

Place a `.env` file inside the `project` folder that contains the following keys
from the OAuth app you configured above:

```
SFDC_CONSUMER_KEY=some_key
SFDC_CONSUMER_SECRET=secret_stuff
```

## django

run migrations and start the server!

---

This project uses [poetry](https://python-poetry.org/) for dependency management
and packaging.