Having a running setup, using OAuth2 login with Django & python-social-auth==0.1.19, you can simply create a file bnet.py within the social/backends folder:
from social.backends.oauth import BaseOAuth2
class BnetOAuth2(BaseOAuth2):
"""Battlenet OAuth2 authentication backend"""
name = 'bnet-oauth2'
EMAIL_SUFFIX = "code-corner.de"
REDIRECT_STATE = False
AUTHORIZATION_URL = 'https://eu.battle.net/oauth/authorize'
ACCESS_TOKEN_URL = 'https://eu.battle.net/oauth/token'
ACCESS_TOKEN_METHOD = 'POST'
DEFAULT_SCOPE = ['wow.profile',
'sc2.profile']
EXTRA_DATA = [
('refresh_token', 'refresh_token', True),
('expires_in', 'expires'),
('token_type', 'token_type', True)
]
def asd_get_user_id(self, details, response):
if self.setting('USE_UNIQUE_USER_ID', False):
return response['email']
else:
return response['username']
def get_user_details(self, response):
return {'username': response.get('username', ''),
'email': response.get('email', ''),
'fullname': response.get('name', ''),
'first_name': response.get('given_name', ''),
'last_name': response.get('family_name', '')}
def user_data(self, access_token, *args, **kwargs):
id = self.get_json(
'https://eu.api.battle.net/account/user/id',
params={'access_token': access_token}
)["id"]
btag = self.get_json(
'https://eu.api.battle.net/account/user/battletag',
params={'access_token': access_token}
)["battletag"]
first_name, last_name = btag.split("#")
return {"id": id,
"username": first_name,
"email": "%d@%s" % (id, self.EMAIL_SUFFIX),
"family_name": last_name,
"given_name": first_name,
"name": btag}
Finally activate the created backend and don’t forget to add the BNet API keys to your django settings. Now go and try the login.
SOCIAL_AUTH_BNET_OAUTH2_KEY = "..."
SOCIAL_AUTH_BNET_OAUTH2_SECRET = "..."
AUTHENTICATION_BACKENDS = ('social.backends.bnet.BnetOAuth2')
After login, a new user should be created using the part of the battle tag before the # as username and first_name and the number behind the # as last_name. The email will be filled using the BNet account id and a user-defined suffix.