scaffold oauth client
This commit is contained in:
commit
e418438f51
82
.gitignore
vendored
Normal file
82
.gitignore
vendored
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
# Compiled python modules.
|
||||||
|
*.py[cod]
|
||||||
|
*.pyc
|
||||||
|
__pycache__
|
||||||
|
.pytest_cache/
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Python egg metadata, regenerated from source files by setuptools.
|
||||||
|
# Packages
|
||||||
|
*.egg
|
||||||
|
*.egg-info
|
||||||
|
|
||||||
|
# Setuptools distribution folder.
|
||||||
|
dist
|
||||||
|
build
|
||||||
|
eggs
|
||||||
|
parts
|
||||||
|
bin
|
||||||
|
var
|
||||||
|
sdist
|
||||||
|
develop-eggs
|
||||||
|
.installed.cfg
|
||||||
|
lib
|
||||||
|
lib64
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
.cache/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.tox
|
||||||
|
coverage.xml
|
||||||
|
htmlcov/
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
|
||||||
|
# IDEs and text editors
|
||||||
|
*~
|
||||||
|
*.swp
|
||||||
|
.idea/
|
||||||
|
.project
|
||||||
|
.pycharm_helpers/
|
||||||
|
.pydevproject
|
||||||
|
|
||||||
|
# The Silver Searcher
|
||||||
|
.agignore
|
||||||
|
|
||||||
|
# OS X artifacts
|
||||||
|
*.DS_Store
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
log/
|
||||||
|
logs/
|
||||||
|
chromedriver.log
|
||||||
|
ghostdriver.log
|
||||||
|
|
||||||
|
# Complexity
|
||||||
|
output/*.html
|
||||||
|
output/*/index.html
|
||||||
|
|
||||||
|
# Sphinx
|
||||||
|
docs/_build
|
||||||
|
docs/modules.rst
|
||||||
|
docs/trinity_oauth_backend.rst
|
||||||
|
docs/trinity_oauth_backend.*.rst
|
||||||
|
|
||||||
|
# Private requirements
|
||||||
|
requirements/private.in
|
||||||
|
requirements/private.txt
|
||||||
|
|
||||||
|
# tox environment temporary artifacts
|
||||||
|
tests/__init__.py
|
||||||
|
|
||||||
|
# Development task artifacts
|
||||||
|
default.db
|
||||||
|
|
||||||
|
.vscode/
|
22
LICENSE.txt
Normal file
22
LICENSE.txt
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
The MIT License
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (c) 2018 Querium Inc.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
1
MANIFEST.in
Normal file
1
MANIFEST.in
Normal file
@ -0,0 +1 @@
|
|||||||
|
include README.rst
|
58
README.rst
Normal file
58
README.rst
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
WP OAuth 2 Backend
|
||||||
|
=============================
|
||||||
|
|
||||||
|
Overview
|
||||||
|
--------
|
||||||
|
|
||||||
|
A Python Social Auth backend for WP OAuth, mostly used for Open edX but can be used elsewhere.
|
||||||
|
This package was originally cloned from https://github.com/appsembler/trinity-oauth-backend.
|
||||||
|
|
||||||
|
This package is structured so that it can be uploaded to PyPI and installed using pip or easyinstall.
|
||||||
|
More detail here: https://python-packaging.readthedocs.io/en/latest/minimal.html
|
||||||
|
|
||||||
|
Setup
|
||||||
|
-----
|
||||||
|
|
||||||
|
General Python/Django
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
include this repo in your project's requiremets.txt, or install it from the command line.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:caption: Python/Django installation
|
||||||
|
cd path/to/your/project
|
||||||
|
source path/to/venv/bin/activate
|
||||||
|
pip install https://github.com/StepwiseMath/stepwisemathai-oauth-backend
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
:caption: lms.envs.tutor.production.py
|
||||||
|
ADDL_INSTALLED_APPS:
|
||||||
|
- "wp_oauth_backend"
|
||||||
|
THIRD_PARTY_AUTH_BACKENDS:
|
||||||
|
- "stepwisemathai_oauth_backend.wp_oauth.WPOAuth2"
|
||||||
|
ENABLE_REQUIRE_THIRD_PARTY_AUTH: true
|
||||||
|
|
||||||
|
add these settings to django.conf:
|
||||||
|
|
||||||
|
.. list-table:: WP Oauth setup
|
||||||
|
:widths: 50 100
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
* - Key
|
||||||
|
- Value
|
||||||
|
* - WPOAUTH_BACKEND_BASE_URL
|
||||||
|
- https://stepwisemath.ai
|
||||||
|
* - WPOAUTH_BACKEND_CLIENT_ID
|
||||||
|
- see: https://stepwisemath.ai/wp-admin/admin.php?page=wo_manage_clients
|
||||||
|
* - WPOAUTH_BACKEND_CLIENT_SECRET
|
||||||
|
- see: https://stepwisemath.ai/wp-admin/admin.php?page=wo_manage_clients
|
||||||
|
|
||||||
|
|
||||||
|
Cookiecutter openedx_devops
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
1. include this repository in your Build additional requirements
|
||||||
|
2.
|
||||||
|
|
||||||
|
Developer Notes
|
||||||
|
-------------
|
3
pyproject.toml
Normal file
3
pyproject.toml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[build-system]
|
||||||
|
requires = ["setuptools", "wheel"]
|
||||||
|
build-backend = "setuptools.build_meta:__legacy__"
|
3
requirements/latest-psa.txt
Normal file
3
requirements/latest-psa.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Latest Python Social Auth
|
||||||
|
social-auth-app-django
|
||||||
|
social-auth-core
|
3
requirements/stable-psa.txt
Normal file
3
requirements/stable-psa.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Stable Python Social Auth, found in Open edX Nutmeg
|
||||||
|
social-auth-app-django==5.0.0
|
||||||
|
social-auth-core==4.2.0
|
5
requirements/test.txt
Normal file
5
requirements/test.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# Packages for testing
|
||||||
|
pytest==7.1.1
|
||||||
|
httpretty==1.1.4
|
||||||
|
pycodestyle==2.8.0
|
||||||
|
-e .
|
47
setup.py
Normal file
47
setup.py
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# pylint: disable=C0111,W6005,W6100
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
|
||||||
|
def get_version(*file_paths):
|
||||||
|
"""
|
||||||
|
Extract the version string from the file at the given relative path.
|
||||||
|
"""
|
||||||
|
filename = os.path.join(os.path.dirname(__file__), *file_paths)
|
||||||
|
version_file = open(filename).read()
|
||||||
|
version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]",
|
||||||
|
version_file, re.M)
|
||||||
|
if version_match:
|
||||||
|
return version_match.group(1)
|
||||||
|
raise RuntimeError('Unable to find version string.')
|
||||||
|
|
||||||
|
|
||||||
|
VERSION = get_version('stepwisemathai_oauth_backend', '__init__.py')
|
||||||
|
|
||||||
|
README = open(os.path.join(os.path.dirname(__file__), 'README.rst')).read()
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name='stepwisemathai',
|
||||||
|
version=VERSION,
|
||||||
|
description=('An OAuth backend for the WP OAuth Plugin, '
|
||||||
|
'mostly used for Open edX but can be used elsewhere.'),
|
||||||
|
long_description=README,
|
||||||
|
author='Lawrence McDaniel, lpm0073@gmail.com',
|
||||||
|
author_email='lpm0073@gmail.com',
|
||||||
|
url='https://github.com/StepwiseMath/stepwisemathai-oauth-backend',
|
||||||
|
packages=[
|
||||||
|
'stepwisemathai_oauth_backend',
|
||||||
|
],
|
||||||
|
include_package_data=True,
|
||||||
|
zip_safe=False,
|
||||||
|
keywords='WP OAuth',
|
||||||
|
classifiers=[
|
||||||
|
'Intended Audience :: Developers',
|
||||||
|
'License :: OSI Approved :: MIT License',
|
||||||
|
],
|
||||||
|
)
|
8
stepwisemathai_oauth_backend/__init__.py
Normal file
8
stepwisemathai_oauth_backend/__init__.py
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
"""
|
||||||
|
An OAuth backend for WordPress.
|
||||||
|
|
||||||
|
It's mostly used for Open edX but can be used elsewhere.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
__version__ = '0.1.0'
|
76
stepwisemathai_oauth_backend/wp_oauth.py
Normal file
76
stepwisemathai_oauth_backend/wp_oauth.py
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
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)
|
Loading…
Reference in New Issue
Block a user