A Flask app, wrapping a single OpenID Connect issuer with a Discourse SSO provider interface.
Project description
Discourse SSO OIDC Bridge - A Python PyPI package
This Python package contains a Flask application that when deployed can be used as and endpoint for Discourse when setting up it's SSO. It will then be able to wrap a OIDC provider and avoid various limitations of not being setup as a Discourse SSO provider.
This repo was made standing on the shoulders giants who made most of the initial work. Thank you @fmarco76 and @stevenmirabito!
I also did some refinements thanks to @greut this Medium article.
Installation
Note that this is only a Flask application, you must use gunicorn
or another
WSGI compatible webserver to host it and setup TLS etc.
WARNING: Not yet tested with Discourse to function, but I'm working on it!
# NOTE: Currently onnly on PyPI's test servers
pip install --upgrade discourse-sso-oidc-bridge-consideratio
Bridge Configuration
This is the common configuration that, default.py.
Config / ENV name | Description |
---|---|
SERVER_NAME |
The domain where you host this app, example: "discourse-sso.example.com" . Note that https:// will be assumed. |
SECRET_KEY |
A secret for Flask, just generate one with openssl rand -hex 32 . |
OIDC_ISSUER |
An URL to the OIDC issuer. To verify you get this right you can try appending /.well-known/openid-configuration to it and see if you get various JSON details rather than a 404. |
OIDC_CLIENT_ID |
A preregistered client_id on your OIDC issuer. |
OIDC_CLIENT_SECRET |
The provided secret for the the preregistered OIDC_CLIENT_ID . |
OIDC_SCOPE |
Comma seperated OIDC scopes, defaults to "openid,profile" . |
DISCOURSE_URL |
The URL of your Discourse deployment, example "https://discourse.example.com" . |
DISCOURSE_SECRET_KEY |
A shared secret between the bridge and Discourse, generate one with openssl rand -hex 32 . |
USERINFO_SSO_MAP |
Valid JSON object in a string mapping OIDC userinfo attribute names to to Discourse SSO attribute names. |
DEFAULT_SSO_ATTRIBUTES |
Valid JSON object in a string mapping Discourse SSO attributes to default values. By default sub is mapped to external_id and preferred_username to username . |
CONFIG_LOCATION |
The path to a Python file to be loaded as config where OIDC_ISSUER etc. could be set. |
OIDC Provider Configuration
You must have a client_id
and client_secret
from your OIDC issuer. The
issuer must also accept redirecting back to <bridge_url>/redirect_uri
, which
for example could be https://discourse-sso.example.com/redirect_uri
.
Development Notes
To make changes and test them
-
Clone the repo
-
Install
pipenv
usingpip
.pip install pipenv
-
Setup a virtual development environment
pipenv install --dev # Optionally enter the environment pipenv shell
-
Run tests
pipenv run pytest
Build and upload a PyPI release
-
Test, build and upload the package
# Make sure you are up to date with what you have declared to require pipenv install --dev # Update changelog, fix requirements, etc. pipenv lock -r > requirements.txt # Run tests pipenv run pytest # Commit and tag to influence the PyPI version # PBR will look for the latest tag and then append development # versions based on your git commits since the latest tag. git add . git commit TAG=$(pipenv run python -c 'from pbr.version import VersionInfo; print(VersionInfo("discourse_sso_oidc_bridge").version_string())') git tag -a $TAG -m "Release $TAG" # Build the package pipenv run python setup.py bdist_wheel # Upload the package to PyPI pipenv run twine upload --skip-existing --username consideratio dist/*
-
Build, run, and push a Docker image
# Build and run docker build -t consideratio/discourse-sso-oidc-bridge:$TAG . docker run --rm -p 8080:8080 consideratio/discourse-sso-oidc-bridge:$TAG # Build and push docker build -t consideratio/discourse-sso-oidc-bridge:$TAG . docker push consideratio/discourse-sso-oidc-bridge:$TAG
Deployment notes
I have deployed this using a simpler not published Helm chart. I'm happy to open source this as well for a complete solution. But to avoid overworking something that few has interest for it in I'd appreciate if you showed interest in this by emailing me or opening an issue or similar.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file discourse_sso_oidc_bridge_consideratio-0.1.5-py3-none-any.whl
.
File metadata
- Download URL: discourse_sso_oidc_bridge_consideratio-0.1.5-py3-none-any.whl
- Upload date:
- Size: 20.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.20.1 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.28.1 CPython/3.6.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 59cbe4b32fd46f6d64b43f845ad7ff9aa50d9551f338f242dcef2f12b33a5c39 |
|
MD5 | 1fc7b4929e8c6eb608fabdafd35370f1 |
|
BLAKE2b-256 | de9c98fa4e23651236927b1e7e3f84554e877d49812b4462dc9133111be30d85 |