Metadata-Version: 2.1
Name: kleides_dssoclient
Version: 0.9
Summary: Kleides Discourse SSO client for Django
Home-page: https://github.com/ossobv/kleides-dssoclient
Author: Walter Doekes, OSSO B.V.
Author-email: wjdoekes+kleides@osso.nl
License: GPLv3+
Platform: linux
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Web Environment
Classifier: Framework :: Django
Classifier: Framework :: Django :: 2.2
Classifier: Framework :: Django :: 3.0
Classifier: Framework :: Django :: 3.1
Classifier: Intended Audience :: System Administrators
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Topic :: System :: Systems Administration :: Authentication/Directory
License-File: LICENSE

|KLEIDES| Kleides Discourse SSO client
======================================

*Discourse Single-Sign-on (DSSO) provider client* to connect your
*Django* project to a *Discourse Single-Sign-On provider server*.

See: https://meta.discourse.org/t/official-single-sign-on-for-discourse-sso/

Example usage:

* Add ``kleides_dssoclient`` to ``INSTALLED_APPS``.

* Create a custom ``DssoLoginBackend``, for example::

    from kleides_dssoclient.backends import DssoLoginBackend

    class MyProjectDssoLoginBackend(DssoLoginBackend):
        """
        DssoLoginBackend that rejects anyone without is_superuser, and that
        sets all mapped variables on the newly created User object.
        """
        def authenticate(self, dsso_mapping):
            """
            Check that user is a superuser and pass along to DssoLoginBackend.
            """
            if dsso_mapping.get('is_superuser') not in ('True', 'true', '1'):
                return None

            return super(MyProjectDssoLoginBackend, self).authenticate(
                dsso_mapping)

        def configure_user(self, user, dsso_mapping):
            """
            We expect username, email, is_superuser in the dsso_mapping.
            """
            user = (
                super(MyProjectDssoLoginBackend, self)
                .configure_user(user, dsso_mapping))

            user.email = dsso_mapping.get('email', '')
            is_superuser = (
                dsso_mapping.get('is_superuser') in ('True', 'true', '1'))
            user.is_staff = is_superuser
            user.is_superuser = is_superuser

            user.save()
            return user

* Add this to the *Django* ``settings``::

    AUTHENTICATION_BACKENDS = (  # the only backend needed
        'myproject.backends.MyProjectDssoLoginBackend',
    )
    MIDDLEWARE_CLASSES += (
        'kleides_dssoclient.middleware.DssoLoginMiddleware',
    )
    KLEIDES_DSSO_ENDPOINT = 'https://DSSOSERVER/sso/'
    KLEIDES_DSSO_SHARED_KEY = 'oh-sso-very-very-secret'
    KLEIDES_DSSO_CREATE_UNKNOWN_USER = True


.. |KLEIDES| image:: assets/kleides-icon.png
    :alt: Kleides



Changes
-------

v0.9 - *2024-06-13*
~~~~~~~~~~~~~~~~~~~

- Add setting for automatic user creation.
- Remove dsso parameters from the return url.

v0.8 - *2020-09-28*
~~~~~~~~~~~~~~~~~~~

- Allow using the Dsso backend as a mixin.

v0.7 - *2019-07-16*
~~~~~~~~~~~~~~~~~~~

- Allow bypassing the middleware by setting KLEIDES_DSSO_ENDPOINT to None.


v0.6 - *2019-03-06*
~~~~~~~~~~~~~~~~~~~

- Add ``request`` arg to ``DssoLoginBackend`` for Django 2.1.


v0.5 - *2019-03-06*
~~~~~~~~~~~~~~~~~~~

- Add logging to help investigate problems.


v0.3 - *2018-12-18*
~~~~~~~~~~~~~~~~~~~

- Add support for Django 1.10 style middleware.
- Check Django version for is_authenticated usage.


v0.2 - *2018-11-19*
~~~~~~~~~~~~~~~~~~~

- Replace ``sso_mapping`` with ``dsso_mapping`` in authenticate argument list.


v0.1 - *2018-11-16*
~~~~~~~~~~~~~~~~~~~

- Initial release.
