77 lines
2.1 KiB
Python
77 lines
2.1 KiB
Python
import json
|
|
from urllib.parse import urlencode
|
|
from urllib.request import urlopen
|
|
from social_core.backends.oauth import BaseOAuth2
|
|
from django.conf import settings
|
|
|
|
from logging import getLogger
|
|
logger = getLogger(__name__)
|
|
|
|
|
|
class WPOAuth2(BaseOAuth2):
|
|
|
|
"""WP OAuth authentication backend"""
|
|
name = 'wp-oauth2'
|
|
SOCIAL_AUTH_SANITIZE_REDIRECTS = False
|
|
ACCESS_TOKEN_METHOD = 'POST'
|
|
EXTRA_DATA = []
|
|
SCOPE_SEPARATOR = ','
|
|
|
|
@property
|
|
def base_url(self):
|
|
return settings.WPOAUTH_BACKEND_BASE_URL
|
|
|
|
@property
|
|
def CLIENT_ID(self):
|
|
return settings.WPOAUTH_BACKEND_CLIENT_ID
|
|
|
|
@property
|
|
def CLIENT_SECRET(self):
|
|
return settings.WPOAUTH_BACKEND_CLIENT_SECRET
|
|
|
|
@property
|
|
def AUTHORIZATION_URL(self) -> str:
|
|
return f"{self.base_url}/oauth/authorize"
|
|
|
|
@property
|
|
def ACCESS_TOKEN_URL(self) -> str:
|
|
return f"{self.base_url}/oauth/token"
|
|
|
|
@property
|
|
def USER_QUERY(self) -> str:
|
|
return f"{self.base_url}/oauth/me"
|
|
|
|
def get_user_details(self, response):
|
|
"""Return user details from the WP account"""
|
|
user_details = {
|
|
'id': int(response.get('ID')),
|
|
'username': response.get('user_login'),
|
|
'email': response.get('user_email'),
|
|
'fullname': response.get('display_name'),
|
|
}
|
|
logger.info('get_user_details() - {}'.format(user_details))
|
|
return user_details
|
|
|
|
def user_data(self, access_token, *args, **kwargs):
|
|
"""Loads user data from service"""
|
|
url = f'{self.USER_QUERY}?' + urlencode({
|
|
'access_token': access_token
|
|
})
|
|
|
|
try:
|
|
return json.loads(self.urlopen(url))
|
|
except ValueError:
|
|
return None
|
|
|
|
def urlopen(self, url):
|
|
return urlopen(url).read().decode("utf-8")
|
|
|
|
def get_user_id(self, details, response):
|
|
return details['id']
|
|
|
|
def get_username(self, strategy, details, backend, user=None, *args, **kwargs):
|
|
return details['username']
|
|
|
|
def get_key_and_secret(self):
|
|
return (self.CLIENT_ID, self.CLIENT_SECRET)
|