{ "info": { "author": "Erik Sundell", "author_email": "erik.i.sundell@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# Discourse SSO OIDC Bridge - A Python PyPI package and a Docker image\n\nThis Python package contains a Flask application that when deployed can be used\nas and endpoint for Discourse when setting up it's SSO. It will then be able to\nwrap a OIDC provider and avoid various [limitations](https://meta.discourse.org/t/sso-vs-oauth2-difference/76543/11)\nof not being setup as a Discourse SSO provider.\n\nThe Flask application can be deployed using a Docker image that is also within\nthis repo and published to docker hub as\n`consideratio/discourse-sso-oidc-bridge`.\n\nThis repo was made standing on the shoulders giants who made most of the initial\nwork. Thank you [__@fmarco76__](https://github.com/fmarco76) and\n[__@stevenmirabito__](https://github.com/stevenmirabito) for the valuable work\nyou have made!\n\n- https://github.com/fmarco76/DiscourseSSO\n- https://github.com/ComputerScienceHouse/DiscourseOIDC\n\nI also did some Dockerfile refinements thanks to\n[__@greut__](https://github.com/greut)'s excellent [Medium\narticle](https://medium.com/@greut/building-a-python-package-a-docker-image-using-pipenv-233d8793b6cc).\n\n## Installation\n\nNote that this only installs a Python package containing a Flask application,\nyou must use `gunicorn` or another WSGI compatible webserver to host it and\nsetup TLS etc.\n\n```sh\npip install --upgrade discourse-sso-oidc-bridge-consideratio\n```\n\nTo startup a the Flask app within a prebuilt Docker image, do the following.\n\n```sh\ndocker run --rm -p 8080:8080 consideratio/discourse-sso-oidc-bridge\n```\n\nTo actually use it, you should make it deployed in a way that it is accessible\nfor discourse and its users, so it can redirect arriving users who wants to\nlogin to it. To do this, visit the discourse settings and search for `sso`.\n\n![](discourse_settings.png)\n\n> **NOTE:** When you do this setup, you want to check and fill in `enable sso`,\n`sso url`, and `sso secret`. What you write in your `sso secret` should be\nrepeated in your bridge configuration.\n\n## Bridge Configuration\n\nThese are common configuration options, but you can find some more exotic ones within [default.py](discourse-sso-oidc-bridge/default.py).\n\nTo configure these, you have two options.\n\n- You can provide provide a Python based config file and set the `CONFIG_LOCATION` environment variable allowing the application to locate it.\n\n ```python\n #######################\n # Flask Configuration #\n #######################\n\n DEBUG = True\n\n # NOTE: Your OIDC provider needs to have \"Login redirect URIs\" setup to the following\n # endpoint managed by flask-pyoidc:\n # https://discourse-sso.example.com/redirect_uri\n PREFERRED_URL_SCHEME = 'https'\n SERVER_NAME = 'discourse-sso.example.com'\n SECRET_KEY = 'my-secret-key-that-i-came-up-with-myself'\n\n # NOTE: Relates to OIDC_SESSION_PERMANENT as well.\n # http://flask.pocoo.org/docs/1.0/config/#PERMANENT_SESSION_LIFETIME\n # NOTE: You may want to learn about the \"maximum session age\" setting in discourse\n # as well.\n # PERMANENT_SESSION_LIFETIME = 2678400\n\n\n ################################\n # OpenID Connect Configuration #\n ################################\n\n # NOTE: Relates to PERMANENT_SESSION_LIFETIME as well.\n # https://github.com/zamzterz/Flask-pyoidc#flask-configuration\n # OIDC_SESSION_PERMANENT = True\n\n # NOTE: If you add /.well-known/openid-configuration to your OIDC_ISSUER, you should get a bunch of JSON details back if you got it right.\n OIDC_ISSUER = 'https://my-oidc-provider.com'\n OIDC_CLIENT_ID = 'my-client-id-from-my-oidc-provider'\n OIDC_CLIENT_SECRET = 'my-secret-key-from-my-oidc-provider'\n OIDC_SCOPE = 'openid profile email offline_access'\n\n ###########################\n # Discourse Configuration #\n ###########################\n\n DISCOURSE_URL = 'https://discourse.example.com'\n DISCOURSE_SECRET_KEY = 'my-other-secret-that-i-came-up-with-myself'\n ```\n\n- You can set environment variables with the same name as the config options.\n The default python config will look in these environment variables and use\n them if available.\n\n| __Config / ENV name__ | __Description__ |\n|-|-|\n| `DEBUG` | Very useful while setting this up as you get lots of additional logs, but also sensitive information. Defaults to `False`. |\n| `PREFERRED_URL_SCHEME` | Will influence the generated redirect_uri, defaults to `\"https\"`.\n| `SERVER_NAME` | The domain where you host this app, example: `\"discourse-sso.example.com\"`. |\n| `SECRET_KEY` | A secret for Flask, just generate one with `openssl rand -hex 32`. |\n| `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. |\n| `OIDC_CLIENT_ID` | A preregistered `client_id` on your OIDC issuer. |\n| `OIDC_CLIENT_SECRET` | The provided secret for the the preregistered `OIDC_CLIENT_ID`. |\n| `OIDC_SCOPE` | Comma or space seperated OIDC scopes, defaults to `\"openid profile\"`. |\n| `OIDC_EXTRA_AUTH_REQUEST_PARAMS` | Valid JSON object in a string containing key/values for additional parameters to be sent along with the initial request to the OIDC provider, defaults to `\"{}\"`. |\n| `DISCOURSE_URL` | The URL of your Discourse deployment, example `\"https://discourse.example.com\"`. |\n| `DISCOURSE_SECRET_KEY` | A shared secret between the bridge and Discourse, generate one with `openssl rand -hex 32`. |\n| `USERINFO_SSO_MAP` | Valid JSON object in a string mapping OIDC userinfo attribute names to to Discourse SSO attribute names. |\n| `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`. |\n| `CONFIG_LOCATION` | The path to a Python file to be loaded as config where `OIDC_ISSUER` etc. could be set. |\n\n## OIDC Provider Configuration\n\nYou must have a `client_id` and `client_secret` from your OIDC issuer. The\nissuer must also accept redirecting back to\n`:///redirect_uri`, which for example could be\n`https://discourse-sso.example.com/redirect_uri`.\n\n## Development Notes\n\n### To make changes and test them\n\n1. Clone the repo\n\n2. Install `pipenv` using `pip`.\n\n ```sh\n pip install pipenv\n ```\n\n3. Setup a virtual development environment\n\n ```sh\n pipenv install --dev\n\n # Optionally enter the environment\n pipenv shell\n ```\n\n4. Run tests\n\n ```sh\n pipenv run pytest\n ```\n\n### Build and upload a PyPI release\n\n1. Test, build and upload the package\n\n ```sh\n # Make sure you are up to date with what you have declared to require\n pipenv install --dev\n\n # Update changelog, fix requirements, etc.\n pipenv lock -r > requirements.txt\n\n # Run tests\n pipenv run pytest\n\n # Commit and tag to influence the PyPI version\n # PBR will look for the latest tag and then append development\n # versions based on your git commits since the latest tag.\n git add .\n git commit\n\n\n TAG=$(pipenv run python -c 'from pbr.version import VersionInfo; print(VersionInfo(\"discourse_sso_oidc_bridge\").version_string())')\n git tag -a $TAG -m \"Release $TAG\"\n\n # Build the package\n pipenv run python setup.py bdist_wheel\n\n # Upload the package to PyPI\n pipenv run twine upload --skip-existing --username consideratio dist/*\n ```\n\n2. Build, run, and push a Docker image\n\n ```sh\n # Build and run\n docker build -t consideratio/discourse-sso-oidc-bridge:$TAG .\n docker run --rm -p 8080:8080 consideratio/discourse-sso-oidc-bridge:$TAG\n\n # Build and push\n docker build -t consideratio/discourse-sso-oidc-bridge:$TAG -t consideratio/discourse-sso-oidc-bridge:latest .\n docker push consideratio/discourse-sso-oidc-bridge:$TAG\n ```\n\n## Deployment notes\n\nI 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.\n\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "Apache License, Version 2.0", "maintainer": "", "maintainer_email": "", "name": "discourse-sso-oidc-bridge-consideratio", "package_url": "https://pypi.org/project/discourse-sso-oidc-bridge-consideratio/", "platform": "", "project_url": "https://pypi.org/project/discourse-sso-oidc-bridge-consideratio/", "project_urls": null, "release_url": "https://pypi.org/project/discourse-sso-oidc-bridge-consideratio/0.1.9/", "requires_dist": [ "alabaster (==0.7.12)", "asn1crypto (==0.24.0)", "beaker (==1.10.1)", "certifi (==2019.3.9)", "cffi (==1.12.2)", "chardet (==3.0.4)", "click (==7.0)", "cryptography (==2.6.1)", "flask-pyoidc (==2.0.0)", "flask (==1.0.2)", "future (==0.17.1)", "healthcheck (==1.3.3)", "idna (==2.8)", "itsdangerous (==1.1.0)", "jinja2 (==2.10.1)", "mako (==1.0.8)", "markupsafe (==1.1.1)", "oic (==0.12)", "pycparser (==2.19)", "pycryptodomex (==3.8.1)", "pyjwkest (==1.4.0)", "pyopenssl (==19.0.0)", "requests (==2.21.0)", "six (==1.12.0)", "urllib3 (==1.24.1)", "werkzeug (==0.15.2)" ], "requires_python": "", "summary": "A Flask app, wrapping a single OpenID Connect issuer with a Discourse SSO provider interface.", "version": "0.1.9" }, "last_serial": 5241930, "releases": { "0.0.5": [ { "comment_text": "", "digests": { "md5": "174f855d9fd368a1be7189fe9967b756", "sha256": "d8ee20cdb939ed174c39a50eefbe1ce2a8bda4191e9be0a87389ae5c862e7a74" }, "downloads": -1, "filename": "discourse_sso_oidc_bridge_consideratio-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "174f855d9fd368a1be7189fe9967b756", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12481, "upload_time": "2019-02-25T11:30:00", "url": "https://files.pythonhosted.org/packages/06/6e/c9c2606a81a81c2ab80fa3302e7ee69573159410c583bc4d5b18fd682960/discourse_sso_oidc_bridge_consideratio-0.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bb688ece1f40b5d521781e0557663dc3", "sha256": "3b673f6129939609e40ed7d5331d76bd1a16a369cb09821cef448093fa11b66d" }, "downloads": -1, "filename": "discourse-sso-oidc-bridge-consideratio-0.0.5.tar.gz", "has_sig": false, "md5_digest": "bb688ece1f40b5d521781e0557663dc3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6970, "upload_time": "2019-02-25T11:30:04", "url": "https://files.pythonhosted.org/packages/59/1c/32317769e9e18ef8a45750ed1b4d1d32213f88e4bd6e858bc1856785a5c7/discourse-sso-oidc-bridge-consideratio-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "a4d2a09f33e16a6dcf9c2430d84c1c25", "sha256": "c94f33bf8df16c1577bb10f77853b2ef8103cc21d32673b5faec9aadcd673d46" }, "downloads": -1, "filename": "discourse_sso_oidc_bridge_consideratio-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "a4d2a09f33e16a6dcf9c2430d84c1c25", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12479, "upload_time": "2019-02-25T11:30:02", "url": "https://files.pythonhosted.org/packages/8f/0c/86013ee15c5b6888855b812a2c1978d584a122bdf57f194345a9067f035e/discourse_sso_oidc_bridge_consideratio-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "63b79f23d9d75b80fbeba7603f39f8a3", "sha256": "c08d5308526f9d7207b15aecf3cde6825603c95fed8580958398d4d23e8c9b98" }, "downloads": -1, "filename": "discourse-sso-oidc-bridge-consideratio-0.0.6.tar.gz", "has_sig": false, "md5_digest": "63b79f23d9d75b80fbeba7603f39f8a3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6961, "upload_time": "2019-02-25T11:30:05", "url": "https://files.pythonhosted.org/packages/4f/cf/fa290d93601293ab49cb56eb7c4ec7d85f9533f6e44f075e096c0eef715a/discourse-sso-oidc-bridge-consideratio-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "622f4baec91b6dcc042c0b188ff12169", "sha256": "87dc663dca34510c5cb380087c200c5b5bc74eab2d78215782e09cf026fc33b5" }, "downloads": -1, "filename": "discourse_sso_oidc_bridge_consideratio-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "622f4baec91b6dcc042c0b188ff12169", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15255, "upload_time": "2019-02-25T15:56:49", "url": "https://files.pythonhosted.org/packages/94/c6/a36fe8083380ff79aa02c707f374e7003c1f89191b9a1f7d090e0db8bf48/discourse_sso_oidc_bridge_consideratio-0.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6f271abe8ebbed01a369ba99720081bc", "sha256": "b86a84171d4ddcef7dc28b27cde7c9b1887817f389f2a99d846cc61f62e53819" }, "downloads": -1, "filename": "discourse-sso-oidc-bridge-consideratio-0.0.7.tar.gz", "has_sig": false, "md5_digest": "6f271abe8ebbed01a369ba99720081bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6979, "upload_time": "2019-02-25T15:56:50", "url": "https://files.pythonhosted.org/packages/f3/53/fc50284ef8a19b8834de833b314cbdd4e83d8f264bbdad5905fbfdf05a62/discourse-sso-oidc-bridge-consideratio-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "50b70c7ce2434778c356a28e76671a36", "sha256": "09d71586d5d13123a797ff6230796e5fa87a601028f9925c7e9fc1a281e80ed3" }, "downloads": -1, "filename": "discourse_sso_oidc_bridge_consideratio-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "50b70c7ce2434778c356a28e76671a36", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15537, "upload_time": "2019-02-25T18:20:46", "url": "https://files.pythonhosted.org/packages/e4/c8/ed08f3160398faa839f5e8a79e251d8c30b558e082e9b079bdab840528a3/discourse_sso_oidc_bridge_consideratio-0.0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ef274e69b8221711ccfebe3a33f912ef", "sha256": "70c2f29af64b63a86ab17cb58a0d054f3d980a96373a8be25b92937db20dbe80" }, "downloads": -1, "filename": "discourse-sso-oidc-bridge-consideratio-0.0.8.tar.gz", "has_sig": false, "md5_digest": "ef274e69b8221711ccfebe3a33f912ef", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7238, "upload_time": "2019-02-25T18:20:48", "url": "https://files.pythonhosted.org/packages/c8/94/11147fda51e7692604c11e2d6492eaa1e917f02e4960075d5c1b2ac44057/discourse-sso-oidc-bridge-consideratio-0.0.8.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "b5a9aeae8e2e3a3e0729174345488603", "sha256": "97948c46aa1f54e004239ed45a0a1c1bf3c9d90c7b22422402862a56de96c3a4" }, "downloads": -1, "filename": "discourse_sso_oidc_bridge_consideratio-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b5a9aeae8e2e3a3e0729174345488603", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19273, "upload_time": "2019-02-26T10:23:23", "url": "https://files.pythonhosted.org/packages/21/39/4332f82c143d2e17dd3d900e9445c6f7b0cb0954abca7aa811e5d9f437e1/discourse_sso_oidc_bridge_consideratio-0.1.0-py3-none-any.whl" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "9e7ab6120d1775e6271be1fd5fcabf62", "sha256": "5349134ed5accc1733e0347f80042a8db6efdb518e5a4845197071ba773f3cb0" }, "downloads": -1, "filename": "discourse_sso_oidc_bridge_consideratio-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "9e7ab6120d1775e6271be1fd5fcabf62", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19120, "upload_time": "2019-02-26T10:41:26", "url": "https://files.pythonhosted.org/packages/db/06/8d4cc234ca7414220882c74895209fcd40ad4d62057ef316798e8e09b001/discourse_sso_oidc_bridge_consideratio-0.1.1-py3-none-any.whl" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "116ffd4a3654e2a23a288ac6220a3d7b", "sha256": "71b1dd70797a3ef8a5b17a4fc73eb6e689739d0a1f27740cfe7fe3e8fa3504c5" }, "downloads": -1, "filename": "discourse_sso_oidc_bridge_consideratio-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "116ffd4a3654e2a23a288ac6220a3d7b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19493, "upload_time": "2019-02-26T12:59:02", "url": "https://files.pythonhosted.org/packages/b1/fd/2c6f71100ec8637b2d688b315c4c8663c2fb48806ff836f26c8860f5aba6/discourse_sso_oidc_bridge_consideratio-0.1.2-py3-none-any.whl" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "cdf077fabe194f8d81284230d9a822a9", "sha256": "c040d9bd4f2664706017a4b62690f490aceb9fa18ce54da6d713802af6a5a501" }, "downloads": -1, "filename": "discourse_sso_oidc_bridge_consideratio-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "cdf077fabe194f8d81284230d9a822a9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19972, "upload_time": "2019-02-26T17:59:51", "url": "https://files.pythonhosted.org/packages/6e/8e/4d4d1fbabdf7b53ecdae3f79c5520f28c6c76731f4a7d916d753de466ce0/discourse_sso_oidc_bridge_consideratio-0.1.4-py3-none-any.whl" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "1fc7b4929e8c6eb608fabdafd35370f1", "sha256": "59cbe4b32fd46f6d64b43f845ad7ff9aa50d9551f338f242dcef2f12b33a5c39" }, "downloads": -1, "filename": "discourse_sso_oidc_bridge_consideratio-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "1fc7b4929e8c6eb608fabdafd35370f1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19998, "upload_time": "2019-03-05T15:48:42", "url": "https://files.pythonhosted.org/packages/de/9c/98fa4e23651236927b1e7e3f84554e877d49812b4462dc9133111be30d85/discourse_sso_oidc_bridge_consideratio-0.1.5-py3-none-any.whl" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "2f1447aa7e3b19616500b31e021df498", "sha256": "d55b075956d6bda25145185f25d7d91f66698d2a0fe0618990c013f597b09ac5" }, "downloads": -1, "filename": "discourse_sso_oidc_bridge_consideratio-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "2f1447aa7e3b19616500b31e021df498", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 20331, "upload_time": "2019-03-08T13:14:45", "url": "https://files.pythonhosted.org/packages/1c/df/c9a6b486b23d232f40908dc5faadd10650377e271ce7eeb3514108d10f14/discourse_sso_oidc_bridge_consideratio-0.1.6-py3-none-any.whl" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "81b81c6de37dad0bf738221b97072c67", "sha256": "5e360fc9fa3c106dbb01d523753c7ce6847ff3d240b4fbec3f8ef2f5766b88c7" }, "downloads": -1, "filename": "discourse_sso_oidc_bridge_consideratio-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "81b81c6de37dad0bf738221b97072c67", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21032, "upload_time": "2019-03-08T16:01:52", "url": "https://files.pythonhosted.org/packages/55/c1/ed75839bc1289e438b9fd740cbe306b97a4541e8d8e67aa317eea5f06828/discourse_sso_oidc_bridge_consideratio-0.1.7-py3-none-any.whl" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "fddab021de6943e08315a0770aa08a5a", "sha256": "907b1c9fee2cf8a7ed25d2a458d4a88faac7802fac9f6e050bf724c929a3dd04" }, "downloads": -1, "filename": "discourse_sso_oidc_bridge_consideratio-0.1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "fddab021de6943e08315a0770aa08a5a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21129, "upload_time": "2019-04-15T09:10:01", "url": "https://files.pythonhosted.org/packages/90/2a/d20deb0ee8cc2874a09b7bc19353b66ceb346253f78263cac5bfc6ec5a43/discourse_sso_oidc_bridge_consideratio-0.1.8-py3-none-any.whl" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "9418335d9b19e2f50498de4329f726b6", "sha256": "142604a6e34df3a635973307e0aabb930dd5c492876d777c8d7b4468bbb2dfd0" }, "downloads": -1, "filename": "discourse_sso_oidc_bridge_consideratio-0.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "9418335d9b19e2f50498de4329f726b6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21167, "upload_time": "2019-05-08T08:26:58", "url": "https://files.pythonhosted.org/packages/21/af/92d4cac935772b93de8fe6664b3c245b1c1a286957318acda43ced8cbed7/discourse_sso_oidc_bridge_consideratio-0.1.9-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9418335d9b19e2f50498de4329f726b6", "sha256": "142604a6e34df3a635973307e0aabb930dd5c492876d777c8d7b4468bbb2dfd0" }, "downloads": -1, "filename": "discourse_sso_oidc_bridge_consideratio-0.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "9418335d9b19e2f50498de4329f726b6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21167, "upload_time": "2019-05-08T08:26:58", "url": "https://files.pythonhosted.org/packages/21/af/92d4cac935772b93de8fe6664b3c245b1c1a286957318acda43ced8cbed7/discourse_sso_oidc_bridge_consideratio-0.1.9-py3-none-any.whl" } ] }