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.


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:


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')),

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.sigver import get_xmlsec_binary

LOGIN_URL = '/login/'
BASE_URL = 'http://localhost:9000/idp'

    'debug' : DEBUG,
    'xmlsec_binary': get_xmlsec_binary(['/opt/local/bin', '/usr/bin/xmlsec1']),
    'entityid': '%s/metadata' % BASE_URL,
    'description': 'Example IdP setup',

    '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),
            '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',
    'cert_file': BASE_DIR + '/certificates/public_key.pem',
    # Encryption
    'encryption_keypairs': [{
        'key_file': BASE_DIR + '/certificates/private_key.pem',
        'cert_file': BASE_DIR + '/certificates/public_key.pem',
    'valid_for': 365,

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

    'http://localhost:8000/saml2/metadata/': {
        # DJANGO: SAML
        '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.

Download files

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

Files for djangosaml2idp, version 0.2.1
Filename, size File type Python version Upload date Hashes
Filename, size djangosaml2idp-0.2.1-py2.7.egg (10.9 kB) File type Egg Python version 2.7 Upload date Hashes View hashes
Filename, size djangosaml2idp-0.2.1-py2.py3-none-any.whl (10.7 kB) File type Wheel Python version py2.py3 Upload date Hashes View hashes
Filename, size djangosaml2idp-0.2.1.tar.gz (7.1 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page