Skip to main content

SAML 2.0 Identity Provider for Django

Project description

PyPi Travis CI Code Health Code Climate Requirements Status

djangosaml2idp implements the Identity Provider side of the SAML2 protocol with Django. It builds on top of PySAML2, is compatible with Python 2/3 and all current supported Django versions.

Installation

PySAML2 uses xmlsec1 binary to sign SAML assertions so you need to install it either through your operating system package or by compiling the source code. It doesn’t matter where the final executable is installed because you will need to set the full path to it in the configuration stage. xmlsec is available (at least) for Debian, OSX and Alpine Linux.

Now you can install the djangosaml2idp package using pip. This will also install PySAML2 and its dependencies automatically:

pip install djangosaml2idp

Configuration & Usage

The first thing you need to do is add djangosaml2idp to the list of installed apps:

INSTALLED_APPS = (
    'django.contrib.admin',
    'djangosaml2idp',
    ...
)

Now include djangosaml2idp in your project by adding it in the url config:

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^idp/', include('djangosaml2idp.urls')),
    url(r'^admin/', admin.site.urls),
    ...
]

In your Django settings, configure your IdP. Configuration follows the pysaml2_configuration. The IdP from the example project looks like this:

...
import saml2
from saml2.saml import NAMEID_FORMAT_EMAILADDRESS, NAMEID_FORMAT_UNSPECIFIED
from saml2.sigver import get_xmlsec_binary

BASE_URL = "http://localhost:9000/idp"

SAML_IDP_CONFIG = {
    "entityid": "%s/metadata" % BASE_URL,
    "description": "Example IdP setup",
    "valid_for": 168,
    "service": {
        "idp": {
            "name": "Django localhost IdP",
            "endpoints": {
                "single_sign_on_service": [
                    ("%s/sso/post" % BASE_URL, saml2.BINDING_HTTP_POST),
                    ("%s/sso/redirect" % BASE_URL, saml2.BINDING_HTTP_REDIRECT),
                ],
            },
            "name_id_format": [NAMEID_FORMAT_EMAILADDRESS, NAMEID_FORMAT_UNSPECIFIED],
            'sign_response': True,
            'sign_assertion': True,
        },
    },
    'metadata': {
        'local': [os.path.join(os.path.join(os.path.join(BASE_DIR, 'idp'), 'saml2_config'), 'sp_metadata.xml')],
    },
    # Signing
    'key_file': BASE_DIR + '/certificates/private_key.pem',  # private part
    'cert_file': BASE_DIR + '/certificates/public_key.pem',  # public part
    # Encryption
    'encryption_keypairs': [{
        'key_file': BASE_DIR + '/certificates/private_key.pem',  # private part
        'cert_file': BASE_DIR + '/certificates/public_key.pem',  # public part
    }],
    "xmlsec_binary": get_xmlsec_binary(["/opt/local/bin", "/usr/bin/xmlsec1"]),
    'debug' : DEBUG,
}

You also have to define a mapping for each SP you talk to:

SAML_IDP_ACS_ATTRIBUTE_MAPPING = {
    "http://localhost:8000/saml2/metadata/": {
        # Map Django user attributes to output SAML attributes
        'email': 'email',
        'first_name': 'first_name',
        'last_name': 'last_name',
        'is_staff': 'is_staff',
        'is_superuser':  'is_superuser',
    }
}

That’s all for the IdP configuration. Assuming you run the Django development server on localhost:8000, you can get its metadata by visiting http://localhost:8000/idp/metadata/. Use this metadata xml to configure your SP. Place the metadata xml from that SP in the location specified in the config dict (sp_metadata.xml in the example above).

Example project

example_project contains a barebone demo setup. It consists of a Service Provider implemented with djangosaml2 and an Identity Provider using djangosaml2idp.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

djangosaml2idp-0.2.0.tar.gz (6.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

djangosaml2idp-0.2.0-py2.py3-none-any.whl (10.4 kB view details)

Uploaded Python 2Python 3

djangosaml2idp-0.2.0-py2.7.egg (10.0 kB view details)

Uploaded Egg

File details

Details for the file djangosaml2idp-0.2.0.tar.gz.

File metadata

File hashes

Hashes for djangosaml2idp-0.2.0.tar.gz
Algorithm Hash digest
SHA256 f290fca9a8a868933a852b90f2ae6fe5d78d1a4aa84173259a735d9ca99ce947
MD5 ade647a48e6b4f55709e4ecb4983d1a4
BLAKE2b-256 91450ced1baa98a179d969f374fdf96d444fe46676a45fc03706191ba7533063

See more details on using hashes here.

File details

Details for the file djangosaml2idp-0.2.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for djangosaml2idp-0.2.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 1f38cf869c3f11542c2ca744b2a9fdb9912bc7ecfb1f0b8764a536bfd9732c9d
MD5 6d0ee904ff229d577dfca43b2b2b2243
BLAKE2b-256 edcf20dbd65d441a1145c6a7ab294e54481afa8027c7215d6cc7fbb8acec9c8b

See more details on using hashes here.

File details

Details for the file djangosaml2idp-0.2.0-py2.7.egg.

File metadata

File hashes

Hashes for djangosaml2idp-0.2.0-py2.7.egg
Algorithm Hash digest
SHA256 4ed85d74638bd38b380272a86367b74049775dc490b45c7aa93221c1230fd9a2
MD5 97f32bc987babe18955a3364fecbb5de
BLAKE2b-256 d102d7e515006262479bc2eb2e3874141eddc89f430fd7d7540ef4c0939f5380

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page