{ "info": { "author": "Jonathan Davila", "author_email": "jonathan@davila.io", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Framework :: Django :: 1.10", "Framework :: Django :: 1.11", "Framework :: Django :: 1.8", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Security", "Topic :: System :: Systems Administration :: Authentication/Directory" ], "description": "[![Pypi version](https://img.shields.io/pypi/v/django-saml2-pro-auth.svg)](https://pypi.org/project/django-saml2-pro-auth/) [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/MindPointGroup/django-saml2-pro-auth/master/LICENSE)\n\n[![Coverage Status](https://coveralls.io/repos/github/MindPointGroup/django-saml2-pro-auth/badge.svg?branch=master)](https://coveralls.io/github/MindPointGroup/django-saml2-pro-auth?branch=master) [![CircleCI](https://circleci.com/gh/MindPointGroup/django-saml2-pro-auth.svg?style=svg)](https://circleci.com/gh/MindPointGroup/django-saml2-pro-auth)\n\n\n![Python versions](https://img.shields.io/pypi/pyversions/django-saml2-pro-auth.svg) [![Django versions](https://img.shields.io/badge/django-1.8%2C%201.10%2C%201.11-44B78B.svg)](https://pypi.org/project/django-saml2-pro-auth/)\n\n[![Downloads](http://pepy.tech/badge/django-saml2-pro-auth)](http://pepy.tech/project/django-saml2-pro-auth)\n\n\n# django-saml2-pro-auth\nSAML2 authentication backend for Django\n\n\n## Installation\n\n`pip install django-saml2-pro-auth`\n\n### Prerequisites\n\nOn your OS you must install libxml, xmlsec1 and openssl (dev packages where available). The package name will vary by OS.\n\nFor example, on Ubuntu the prerequisite package names are `build-essential libssl-dev libffi-dev python-dev libxml2-dev libxmlsec1 xmlsec1 libxmlsec1-openssl libxmlsec1-dev`\n\nYou'll want to find the equivalent on your OS of choice.\n\n## Configuration\n\n### Installation\n\n**Python 2**\n\n```bash\n pip install django-saml2-pro-auth\n```\n\n**Python 3**\n\n```bash\n pip3 install django-saml2-pro-auth\n```\n\n\n### settings.py\n\nHere is an example full configuration. Scroll down to read about each option\n\n```python\n\nAUTHENTICATION_BACKENDS = [\n 'django_saml2_pro_auth.auth.Backend'\n]\n\nSAML_ROUTE = 'sso/saml/'\n\nSAML_REDIRECT = '/'\n\nSAML_FAIL_REDIRECT = '/login_failed'\n\nSAML_USERS_MAP = [{\n \"MyProvider\" : {\n \"email\": dict(key=\"Email\", index=0),\n \"name\": dict(key=\"Username\", index=0)\n }\n\n}]\n\n\nSAML_PROVIDERS = [{\n \"MyProvider\": {\n \"strict\": True,\n \"debug\": False,\n \"custom_base_path\": \"\",\n \"sp\": {\n \"entityId\": \"https://test.davila.io/sso/saml/metadata\",\n \"assertionConsumerService\": {\n \"url\": \"https://test.davila.io/sso/saml/?acs\",\n \"binding\": \"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST\"\n },\n \"singleLogoutService\": {\n \"url\": \"https://test.davila.io/sso/saml/?sls\",\n \"binding\": \"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect\"\n },\n \"NameIDFormat\": \"urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified\",\n ## For the cert/key you can place their content in\n ## the x509cert and privateKey params\n ## as single-line strings or place them in\n ## certs/sp.key and certs/sp.crt or you can supply a\n ## path via custom_base_path which should contain\n ## sp.crt and sp.key\n \"x509cert\": \"\",\n \"privateKey\": \"\",\n },\n \"idp\": {\n \"entityId\": \"https://kdkdfjdfsklj.my.MyProvider.com/0f3172cf-5aa6-40f4-8023-baf9d0996cec\",\n \"singleSignOnService\": {\n \"url\": \"https://kdkdfjdfsklj.my.MyProvider.com/applogin/appKey/0f3172cf-5aa6-40f4-8023-baf9d0996cec/customerId/kdkdfjdfsklj\",\n \"binding\": \"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect\"\n },\n \"singleLogoutService\": {\n \"url\": \"https://kdkdfjdfsklj.my.MyProvider.com/applogout\",\n \"binding\": \"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect\"\n },\n \"x509cert\": open(os.path.join(BASE_DIR,'certs/MyProvider.crt'), 'r').read(),\n },\n \"organization\": {\n \"en-US\": {\n \"name\": \"example inc\",\n \"displayname\": \"Example Incorporated\",\n \"url\": \"example.com\"\n }\n },\n \"contact_person\": {\n \"technical\": {\n \"given_name\": \"Jane Doe\",\n \"email_address\": \"jdoe@examp.com\"\n },\n \"support\": {\n \"given_name\": \"Jane Doe\",\n \"email_address\": \"jdoe@examp.com\"\n }\n },\n \"security\": {\n \"nameIdEncrypted\": False,\n \"authnRequestsSigned\": True,\n \"logoutRequestSigned\": False,\n \"logoutResponseSigned\": False,\n \"signMetadata\": False,\n \"wantMessagesSigned\": False,\n \"wantAssertionsSigned\": True,\n \"wantNameId\": True,\n \"wantNameIdEncrypted\": False,\n \"wantAssertionsEncrypted\": True,\n \"signatureAlgorithm\": \"http://www.w3.org/2000/09/xmldsig#rsa-sha1\",\n \"digestAlgorithm\": \"http://www.w3.org/2000/09/xmldsig#rsa-sha1\",\n }\n\n }\n}]\n```\n\n**AUTHENTICATION_BACKENDS:** This is required exactly as in the example. It tells Django to use this as a valid auth mechanism.\n\n**SAML_ROUTE (optional, default=/sso/saml/):** This tells Django where to do all SAML related activities. The default route is /sso/saml/. You still need to include the source urls in your own `urls.py`. For example:\n\n```python\nfrom django.conf.urls import include, url\nfrom django.contrib import admin\nfrom django.conf import settings\nfrom django.conf.urls.static import static\nimport profiles.urls\nimport accounts.urls\nimport django_saml2_pro_auth.urls as saml_urls\n\nfrom . import views\n\nurlpatterns = [\n url(r'^$', views.HomePage.as_view(), name='home'),\n url(r'^about/$', views.AboutPage.as_view(), name='about'),\n url(r'^users/', include(profiles.urls, namespace='profiles')),\n url(r'^admin/', include(admin.site.urls)),\n url(r'^', include(accounts.urls, namespace='accounts')),\n url(r'^', include(saml_urls, namespace='saml')),\n]\n\n```\nSo first import the urls via `import django_saml2_pro_auth.urls as saml_urls` (it's up to you if you want name it or not). Then add it to your patterns via `url(r'^', include(saml_urls, namespace='saml'))`. This example will give you the default routes that this auth backend provides.\n\n**SAML_REDIRECT (optional, default=None):** This tells the auth backend where to redirect users after they've logged in via the IdP. **NOTE**: This is not needed for _most_ users. Order of precedence is: SAML_REDIRECT value (if defined), RELAY_STATE provided in the SAML response, and the fallback is simply to go to the root path of your application.\n\n**SAML_FAIL_REDIRECT (optional, default=None):** This tells the auth backend where to redirect when the SAML authentication fails on the Django side. When using the supplied backend this can happen when a user is marked with is_active=False in the Django DB while still being able to authenticate with the IdP. When SAML_FAIl_REDIRECT has not been set, a SAMLError is raised to avoid redirect loops.\n\n**SAML_USERS_MAP (required):** This is what makes it possible to map the attributes as they come from your IdP into attributes that are part of your User model in Django. There a few ways you can define this. The dict keys (the left-side) are the attributes as defined in YOUR User model, the dict values (the right-side) are the attributes as supplied by your IdP.\n\n```python\n## Simplest Approach, when the SAML attributes supplied by the IdP are just plain strings\n## This means my User model has an 'email' and 'name' attribute while my IdP passes 'Email' and 'Username' attrs\nSAML_USERS_MAP = [{\n \"myIdp\" : {\n \"email\": \"Email\",\n \"name\": \"Username\n }\n}]\n```\n\nSometimes, IdPs might provide values as Arrays (even when it really should just be a string). This package supports that too. For example, suppose your IdP supplied user attributes with the following data structure:\n`{\"Email\": [\"foo@example.com\"], \"Username\": \"foo\"}`\nYou simply would make the key slightly more complex where `key` is the key and `index` represents the index where the desired value is located. See below:\n\n```python\nSAML_USERS_MAP = [{\n \"myIdp\" : {\n \"email\": {\"key\": \"Email\", \"index\": 0},\n \"name\": \"Username\n }\n```\n\nAnd of course, you can use the dict structure even when there IdP supplied attribute isn't an array. For example:\n\n```python\nSAML_USERS_MAP = [{\n \"myIdp\" : {\n \"email\": {\"key\": \"Email\"},\n \"name\": {\"key\": \"Username\"}\n }\n```\n\n**SAML_USERS_LOOKUP_ATTRIBUTE (optional):**\nSpecifies the User model field to be used for object lookup in the database.\nHas to be one of the dict keys for the Django's User model specified in \"SAML_USERS_MAP\".\n\nThe attribute in the Django User model should have the \"unique\" flag set.\n(In the default User model in django only username has a unique contstraint in the DB, the same email could be used by multiple users)\n\nDefaults to \"username\"\n\n```python\nSAML_USERS_LOOKUP_ATTRIBUTE = \"email\"\n```\n\n**SAML_USERS_SYNC_ATTRIBUTES (optional):**\nSpecifies if the user attributes have to be updated at each login with those received from the IdP.\n\nDefaults to False\n\n```python\nSAML_USERS_SYNC_ATTRIBUTES = True\n```\n\n\n**SAML_USERS_STRICT_MAPPING (optional):**\nSpecifies if every user attribute defined in SAML_USER_MAP must be present\nin the saml response or not.\n\nDefaults to True\n\n```python\nSAML_USERS_STRICT_MAPPING = False\n```\n\nIf set to False, you can optionally specify a default value in the \"SAML_USER_MAP\"\ndict and it will set the value when the attribute is not present in the IdP response object.\n\nExample default value setting\n\n```python\n# set default value for is_superuser and is_staff to False\nSAML_USERS_STRICT_MAPPING = False\nSAML_USERS_MAP = [{\n \"MyProvider\" : {\n \"email\": dict(key=\"email\", index=0),\n \"username\": dict(key=\"username\", index=0),\n \"is_superuser\": dict(key=\"is_superuser\", index=0, default=False),\n \"is_staff\": dict(key=\"is_staff\", index=0, default=False)\n }\n}]\n```\n\n**SAML_PROVIDERS:** This is exactly the same spec as OneLogin's [python-saml and python3-saml packages](https://github.com/onelogin/python3-saml#settings). The big difference is here you supply a list of dicts where the top most key(s) must map 1:1 to the top most keys in `SAML_USERS_MAP`. Also, this package allows you to ref the cert/key files via `open()` calls. This is to allow those of you with multiple external customers to login to your platform with any N number of IdPs.\n\n\n## Routes\n\n| **Route** | **Uses** |\n|-------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `/sso/saml/?acs&provider=MyProvider` | The Assertion Consumer Service Endpoint. This is where your IdP will be POSTing assertions. The 'provider' query string must have a value that matches a top level key of your SAML_PROVIDERS settings. |\n| `/sso/saml/metadata?provider=MyProvider` | This is where the SP (ie your Django App) has metadata. Some IdPs request this to generate configuration. The 'provider' query string must have a value that matches a top level key of your SAML_PROVIDERS settings. |\n| `/sso/saml/?provider=MyProvider` | Use this endpoint when you want to trigger an SP-initiated login. For example, this could be the `href`of a \"Login with ClientX Okta\" button. |\n\n## Gotchas\n\nThe following are things that you may run into issue with. Here are some tips.\n\n* Ensure the value of the SP `entityId` config matches up with what you supply in your IdPs configuration.\n* Your IdP may default to particular Signature type, usually `Assertion` or `Response` are the options. Depending on how you define your SAML provider config, it will dictate what this value should be.\n\n# Wishlist and TODOs\n\nThe following are things that arent present yet but would be cool to have\n\n* Implement logic for Single Logout Service\n* ADFS IdP support\n* Integration test with full on mock saml interactions to test the actual backend auth\n* Tests add coverage to views and the authenticate() get_user() methods in the auth backend\n* models (with multi-tentant support) for idp and sp in order to facilitate management via django admin\n* Tests/Support for Django 2\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/MindPointGroup/django-saml2-pro-auth", "keywords": "sso single-signon authentication saml saml2 django development okta onelogin", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "django-saml2-pro-auth", "package_url": "https://pypi.org/project/django-saml2-pro-auth/", "platform": "", "project_url": "https://pypi.org/project/django-saml2-pro-auth/", "project_urls": { "Homepage": "https://github.com/MindPointGroup/django-saml2-pro-auth" }, "release_url": "https://pypi.org/project/django-saml2-pro-auth/0.0.10/", "requires_dist": [ "python3-saml", "six", "check-manifest; extra == 'dev'" ], "requires_python": "", "summary": "SAML2 authentication backend for Django wrapping OneLogin's python-saml package https://github.com/onelogin/python-saml", "version": "0.0.10" }, "last_serial": 4332962, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "4e582fb9582039cf4c3903e44db34fc1", "sha256": "d191f773ebaa46a17497dc7bc8985f4838e9855c490cd6a1c745b9fa0b75a865" }, "downloads": -1, "filename": "django_saml2_pro_auth-0.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4e582fb9582039cf4c3903e44db34fc1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13409, "upload_time": "2017-11-01T14:13:41", "url": "https://files.pythonhosted.org/packages/b7/f1/47a0b9fc4ef28816bcf9445b99dfae21659872aa6e4f3aabd7a232e406bc/django_saml2_pro_auth-0.0.1-py2.py3-none-any.whl" } ], "0.0.10": [ { "comment_text": "", "digests": { "md5": "9bd2b299e7331f5b70be1f915018228f", "sha256": "d67bc2f87f069ca936c2eb3c0adee0787dd1f457c52ba271b144761d3c351edd" }, "downloads": -1, "filename": "django_saml2_pro_auth-0.0.10-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9bd2b299e7331f5b70be1f915018228f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9957, "upload_time": "2018-10-02T15:10:45", "url": "https://files.pythonhosted.org/packages/7e/8a/d5bcf764b03a7dfe156b709b131251b4fd991a607b862a00cc751b472d6e/django_saml2_pro_auth-0.0.10-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d4350b735eaafef9d0efaace67fe7ce9", "sha256": "eaaeff2f8b2947461f19c3971f719e306394672d547a3f980ca06a4aff584c4d" }, "downloads": -1, "filename": "django-saml2-pro-auth-0.0.10.tar.gz", "has_sig": false, "md5_digest": "d4350b735eaafef9d0efaace67fe7ce9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13795, "upload_time": "2018-10-02T15:10:47", "url": "https://files.pythonhosted.org/packages/90/a0/261df9e6875fdbb79f4cfa25bfe3fdc52ea248e64811809f8453138392df/django-saml2-pro-auth-0.0.10.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "0090577a45bec3aae4582a65a86baf2c", "sha256": "fe33a30d1a3897ad1ce218cc5fe10b973906566189f84e801e0d8dbc2b1d1f55" }, "downloads": -1, "filename": "django_saml2_pro_auth-0.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0090577a45bec3aae4582a65a86baf2c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13920, "upload_time": "2017-11-02T13:01:53", "url": "https://files.pythonhosted.org/packages/3e/23/61344fea847f1ffc4c8ba4b285cbea531ae1f4b32fa07e9a070e4ff63e6e/django_saml2_pro_auth-0.0.2-py2.py3-none-any.whl" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "8fdc4088073e39261332dbe5510eefb5", "sha256": "3f45f3d7e90f823ec5bc180dadc6d6638d42018750e93a947216bde9120efbe5" }, "downloads": -1, "filename": "django_saml2_pro_auth-0.0.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8fdc4088073e39261332dbe5510eefb5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13616, "upload_time": "2018-01-22T13:24:26", "url": "https://files.pythonhosted.org/packages/ee/70/f4f83ce764352215e8e513812a7f081ca056b0dc428393b21df459aca2ff/django_saml2_pro_auth-0.0.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2c731e599348eae4f71e2dd973e3d799", "sha256": "d9ee548368aaecf0fc28ba032769d35d205872406348d0f0f50a47268464afa8" }, "downloads": -1, "filename": "django-saml2-pro-auth-0.0.4.tar.gz", "has_sig": false, "md5_digest": "2c731e599348eae4f71e2dd973e3d799", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9599, "upload_time": "2018-01-22T13:24:27", "url": "https://files.pythonhosted.org/packages/b9/a9/3cb99109fe4c75d345eedc7a9c91d8a37bfc14f51759bb669e50a5b2d975/django-saml2-pro-auth-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "6d0b24de5426a8e58c40bdb319edd6cd", "sha256": "4da37831ebb5ab3f08225fcbd1348e992f38fdd180d6a17ec9398896e6b5d1fb" }, "downloads": -1, "filename": "django_saml2_pro_auth-0.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6d0b24de5426a8e58c40bdb319edd6cd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14264, "upload_time": "2018-02-22T14:35:18", "url": "https://files.pythonhosted.org/packages/1b/e0/9fda2dab60d90acffec049a758c8d67061af3214fde122c30b7365696b4b/django_saml2_pro_auth-0.0.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2ec67cce2f32111dcf0826f3670df27c", "sha256": "9c8541cf35aa5ec0a63cc7531d58c2cb50244774671c5fa266141277fef2a537" }, "downloads": -1, "filename": "django-saml2-pro-auth-0.0.5.tar.gz", "has_sig": false, "md5_digest": "2ec67cce2f32111dcf0826f3670df27c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10062, "upload_time": "2018-02-22T14:35:26", "url": "https://files.pythonhosted.org/packages/72/5f/2ad6b95b61c6fef56cb62eeafcc7a92055cf08176e2e462e7c66b6da921c/django-saml2-pro-auth-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "daadb625164a8782d3b0dc46c46f6490", "sha256": "6b23cfcf7446455b5d3262b9cc4e0bbeccee35c83a0926d3b9d8a9ab0285d1d2" }, "downloads": -1, "filename": "django_saml2_pro_auth-0.0.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "daadb625164a8782d3b0dc46c46f6490", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14374, "upload_time": "2018-04-02T12:49:23", "url": "https://files.pythonhosted.org/packages/5a/79/aaa7b9c238e7352aa7c7a228f8db66e693910973549cc5cc60709a612b63/django_saml2_pro_auth-0.0.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "220a633ff3a1f1ad15f8d3cbbe04a14a", "sha256": "5d38d991a003ad7c3b8f1e2560d7b0f34cd16f34f69dfb250513fc7fc4069b97" }, "downloads": -1, "filename": "django-saml2-pro-auth-0.0.6.tar.gz", "has_sig": false, "md5_digest": "220a633ff3a1f1ad15f8d3cbbe04a14a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10130, "upload_time": "2018-04-02T12:49:24", "url": "https://files.pythonhosted.org/packages/8f/39/6107365c6f78446c8f5f8d2ea02b0ca0811391a1f3d53ef8cbe1e149d232/django-saml2-pro-auth-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "6f6ba656c0d5dabbb63ced94a43e2dc0", "sha256": "c4067a190d7a3bd272d80bca2dfcf2f996c97b26a25e395882fcfb5557fc0d90" }, "downloads": -1, "filename": "django_saml2_pro_auth-0.0.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6f6ba656c0d5dabbb63ced94a43e2dc0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9570, "upload_time": "2018-07-04T16:34:29", "url": "https://files.pythonhosted.org/packages/e1/8e/c64cfb7edecb0c87edbf5492d1c35c068434f9d44d9239d4b770b75c2562/django_saml2_pro_auth-0.0.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c8f857bdac693a10b407e2b887ee056f", "sha256": "f639926c56970de280393cfc2316ae4a7527b64fbd4058b88505bc33e8592f96" }, "downloads": -1, "filename": "django-saml2-pro-auth-0.0.7.tar.gz", "has_sig": false, "md5_digest": "c8f857bdac693a10b407e2b887ee056f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10018, "upload_time": "2018-07-04T16:34:30", "url": "https://files.pythonhosted.org/packages/e5/f1/bfee5de82212e0caaff9cf8a87d0df1ddf67d0760e33d98fd9ecfd5afa3f/django-saml2-pro-auth-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "68fadc95ae12503eac6a53831418aa63", "sha256": "c23388125cb8be59a48e84186279b49fec4e0b00da4711664bc66e8c78411fda" }, "downloads": -1, "filename": "django_saml2_pro_auth-0.0.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "68fadc95ae12503eac6a53831418aa63", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9739, "upload_time": "2018-08-08T15:13:48", "url": "https://files.pythonhosted.org/packages/cb/68/79ca188695953db3124ab88b012ea9ec4b031e91f96b6aa427a870b76a34/django_saml2_pro_auth-0.0.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dd8fd1fac5bd9dd8983dc7a0cc69a8bb", "sha256": "0f6d78384f97d3e760699857bf20abc36d61990def392e9462710b2c33ee655b" }, "downloads": -1, "filename": "django-saml2-pro-auth-0.0.8.tar.gz", "has_sig": false, "md5_digest": "dd8fd1fac5bd9dd8983dc7a0cc69a8bb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13000, "upload_time": "2018-08-08T15:13:50", "url": "https://files.pythonhosted.org/packages/1d/f0/33354183c2e40c4130e3ec48d06171940e0b0be3b41769a9d449da08979f/django-saml2-pro-auth-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "c0b6c001b6183fa7231101068024777c", "sha256": "4df12a2ff79d445513b72f2cbf74f9cfa84b808035dc4af46c8977fcb0eb391e" }, "downloads": -1, "filename": "django_saml2_pro_auth-0.0.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c0b6c001b6183fa7231101068024777c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9952, "upload_time": "2018-08-31T18:16:28", "url": "https://files.pythonhosted.org/packages/29/eb/f313cf4aa92577799f7f2d205d553e5c8a515e2c9c09f12319257d947919/django_saml2_pro_auth-0.0.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aec1504c5207a087d0fd00e531529f3e", "sha256": "dd9f512ef78ae0c5e99407bf85cb15898e13be03bd1dc8273889f3f8f51ee415" }, "downloads": -1, "filename": "django-saml2-pro-auth-0.0.9.tar.gz", "has_sig": false, "md5_digest": "aec1504c5207a087d0fd00e531529f3e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13797, "upload_time": "2018-08-31T18:16:30", "url": "https://files.pythonhosted.org/packages/f4/2a/f8e7269e0ce17724dde0b8f143b0c02ff96072b534c289083bfd8338a4ae/django-saml2-pro-auth-0.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9bd2b299e7331f5b70be1f915018228f", "sha256": "d67bc2f87f069ca936c2eb3c0adee0787dd1f457c52ba271b144761d3c351edd" }, "downloads": -1, "filename": "django_saml2_pro_auth-0.0.10-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9bd2b299e7331f5b70be1f915018228f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9957, "upload_time": "2018-10-02T15:10:45", "url": "https://files.pythonhosted.org/packages/7e/8a/d5bcf764b03a7dfe156b709b131251b4fd991a607b862a00cc751b472d6e/django_saml2_pro_auth-0.0.10-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d4350b735eaafef9d0efaace67fe7ce9", "sha256": "eaaeff2f8b2947461f19c3971f719e306394672d547a3f980ca06a4aff584c4d" }, "downloads": -1, "filename": "django-saml2-pro-auth-0.0.10.tar.gz", "has_sig": false, "md5_digest": "d4350b735eaafef9d0efaace67fe7ce9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13795, "upload_time": "2018-10-02T15:10:47", "url": "https://files.pythonhosted.org/packages/90/a0/261df9e6875fdbb79f4cfa25bfe3fdc52ea248e64811809f8453138392df/django-saml2-pro-auth-0.0.10.tar.gz" } ] }