Using Python Social Auth library
# requirement.txt
Django==2.2.6
social-auth-app-django==3.1.0
# auth.py
from social_core.backends.oauth import BaseOAuth2
class BaseSeaauthOAuth2(BaseOAuth2):
def _get_client_url(self, url_template):
client_id, _ = self.get_key_and_secret()
return url_template % client_id
def get_user_id(self, details, response):
return details['email']
def authorization_url(self):
return self._get_client_url(self.AUTHORIZATION_URL)
def access_token_url(self):
return self._get_client_url(self.ACCESS_TOKEN_URL)
def get_user_details(self, response):
email = response.get('user', None)
if not email:
return ValueError('Cannot get email from response')
username, domain = email.split('@', 1)
return {
'username': email,
'email': email,
'fullname': email,
'first_name': username,
'last_name': domain,
}
def revoke_token_url(self, token, uid):
return self._get_client_url(self.REVOKE_TOKEN_URL)
def revoke_token_headers(self, token, uid):
return {
'Authorization': 'Bearer %s' % token,
}
class SeaOAuth2(BaseSeaauthOAuth2):
name = 'seaauth-oauth2'
REDIRECT_STATE = False
AUTHORIZATION_URL = 'https://auth.garenanow.com/web/clients/%s/login/'
ACCESS_TOKEN_URL = 'https://auth.garenanow.com/api/clients/%s/token/'
ACCESS_TOKEN_METHOD = 'POST'
REVOKE_TOKEN_URL = 'https://auth.garenanow.com/api/clients/%s/revoke/'
REVOKE_TOKEN_METHOD = 'POST'
GET_USER_INFO_URL = 'https://auth.garenanow.com/api/clients/%s/profile/'
# settings.py
SOCIAL_AUTH_SEAAUTH_OAUTH2_KEY = 'xxxxxxxxxxxxxxxx'
SOCIAL_AUTH_SEAAUTH_OAUTH2_SECRET = 'xxxxxxxxxxxxxxxx'
AUTHENTICATION_BACKENDS = (
...
'<path-to-auth>.auth.SeaOAuth2', # Add custom SeaAuth backend
...
'django.contrib.auth.backends.ModelBackend',
)
# if you want SeaOAuth2 is the default login method then you can set LOGIN_URL
from django.urls import reverse_lazy
LOGIN_URL = reverse_lazy('social:begin', kwargs={'backend': 'seaauth-oauth2'})