<a id="bungie"></a>

# Bungie

<a id="backend-class"></a>

## Backend class

For Django, add this class path to `AUTHENTICATION_BACKENDS`. For other
integrations, use the same class path in the framework-specific backend
setting.

| Backend name   | Class path                                 |
|----------------|--------------------------------------------|
| `bungie`       | `social_core.backends.bungie.BungieOAuth2` |

Bungie uses OAuth 2.0 for authentication.

- Bungie does not return username, email or name information. They
  return a short form membership id (bungie site account) that is then
  stored as the uid for social auth. To get the username,
  \_GetBungieNetUser_ is called which returns the bungie.net profile,
  including user name as the \_displayName_ field. You may super the
  `get_user_details` function to change behavior or redirect your
  users to a partial pipeline flow that gathers missing user data such
  as email, password (local to your site), first name, last name
  etc. Interrupt the pipeline immediately after `get_username`, as shown
  in the sample pipeline below:
  ```default
  SOCIAL_AUTH_PIPELINE = (
      # Get the information we can about the user and return it in a simple
      # format to create the user instance later. On some cases the details are
      # already part of the auth response from the provider, but sometimes this
      # could hit a provider API.
      'social_core.pipeline.social_auth.social_details',
      'social_core.pipeline.social_auth.social_names',
      # Get the social uid from whichever service we're authing thru. The uid is
      # the unique identifier of the given user in the provider.
      'social_core.pipeline.social_auth.social_uid',
      # Verifies that the current auth process is valid within the current
      # project, this is where emails and domains whitelists are applied (if
      # defined).
      # Super'ed in bungie.py
      'social_core.pipeline.social_auth.auth_allowed',
      # Checks if the current social-account is already associated in the site.
      'social_core.pipeline.social_auth.social_user',
      # Make up a username for this person, appends a random string at the end if
      # there's any collision.
      'social_core.pipeline.user.get_username',
      # Redirect to an @partial view to get missing user information here.
      # If you wish to validate or associate by email, this is required.
      # '<my_app>.pipeline.required_user_information',
      # Send a validation email to the user to verify its email address.
      # Disabled by default.
      # 'social_core.pipeline.mail.mail_validation',
      # Associates the current social details with another user account with
      # a similar email address. Disabled by default.
      # 'social_core.pipeline.social_auth.associate_by_email',
      # Create a user account if we haven't found one yet.
      'social_core.pipeline.user.create_user',
      # Create the record that associates the social account with the user.
      'social_core.pipeline.social_auth.associate_user',
      # Populate the extra_data field in the social record with the values
      # specified by settings (and the default ones like access_token, etc).
      'social_core.pipeline.social_auth.load_extra_data',
      # Update the user record with any changed info from the auth service.
      'social_core.pipeline.user.user_details',
  )
  ```
- Register a new application at [https://www.bungie.net/en/Application/](https://www.bungie.net/en/Application/)
- Set the `Callback URL` in the Bungie.net Application Registration
  page to `https://<your domain>/complete/bungie` This **must** be
  `https`. During development you can use stunnel to proxy the request
  or you can install sslserver from pip.
- Set the `Authentication Backend`, `Client ID (aka OAuth Key)`,
  `OAuth Secret`, and `X-API-KEY` values in your Django settings:
  ```default
  AUTHENTICATION_BACKENDS = (
      ...
      'social_core.backends.bungie.BungieOAuth2',
      ...
  )

  SOCIAL_AUTH_BUNGIE_API_KEY = '...'
  SOCIAL_AUTH_BUNGIE_KEY = '<client_id>'
  SOCIAL_AUTH_BUNGIE_SECRET = '...'
  SOCIAL_AUTH_BUNGIE_ORIGIN = '...'
  ```
- Bungie allows whitespace in usernames, modify these if needed:
  ```default
  SOCIAL_AUTH_SLUGIFY_USERNAMES = False
  SOCIAL_AUTH_CLEAN_USERNAMES = False
  SOCIAL_AUTH_USER_MODEL = 'auth.User'
  ```
