{ "info": { "author": "Lenno Nagel", "author_email": "lenno@namespace.ee", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Session", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "=========================\nDjango REST Framework SSO\n=========================\n\nDjango REST Framework SSO is an extension to Django REST Framework that enables\nSingle sign-on in a microservice-oriented environment using the JWT standard.\n\nThis library provides two types of JWT tokens:\n\n1. non-expiring session tokens for your primary login application (aka. \"refresh tokens\")\n\n2. short-lived authorization tokens for accessing your other apps (these contain permissions given by the primary app)\n\nThe client is expected to first login to your primary login application by POSTing an username and password. The client will receive a permanent session token that will allow subsequent requests to the same server be authenticated. These tokens do not contain any permissions/authorization information and cannot be used for SSO into other apps.\n\nAfterwards, the client is expected to obtain and keep updating authorization tokens using the session token. These secondary tokens are short-lived (15mins..1 hour) and contain the permissions that the user has at the time of issuance. These tokens are used to access other services, which then trust the permissions in the JWT payload for the lifetime of the token.\n\nQuick start\n-----------\n\n1. Add \"rest_framework_sso\" to your INSTALLED_APPS setting like this::\n\n INSTALLED_APPS = [\n ...\n 'rest_framework_sso',\n ]\n\n2. Include the session and authorization token URLs::\n\n from rest_framework_sso.views import obtain_session_token, obtain_authorization_token\n\n urlpatterns = [\n ...\n url(r'^session/', obtain_session_token),\n url(r'^authorize/', obtain_authorization_token),\n ]\n\nAdditional data in authorization tokens\n---------------------------------------\nFor example, you may want to include an `account` field in your JWT authorization tokens,\nso that `otherapp` will know about the user's permissions. To do this, you may need to override\nthe ObtainAuthorizationTokenView and AuthorizationTokenSerializer::\n\n class ObtainAuthorizationTokenView(rest_framework_sso.views.ObtainAuthorizationTokenView):\n \"\"\"\n Returns a JSON Web Token that can be used for authenticated requests.\n \"\"\"\n serializer_class = AuthorizationTokenSerializer\n\n\n class AuthorizationTokenSerializer(serializers.Serializer):\n account = serializers.HyperlinkedRelatedField(\n queryset=Account.objects.all(),\n required=True,\n view_name='api:account-detail',\n )\n\n class Meta:\n fields = ['account']\n\nReplace the authorization token view in your URL conf::\n\n urlpatterns = [\n url(r'^authorize/$', ObtainAuthorizationTokenView.as_view()),\n ...\n ]\n\nAdd the `account` keyword argument to the `create_authorization_payload` function::\n\n from rest_framework_sso import claims\n\n def create_authorization_payload(session_token, user, account, **kwargs):\n return {\n claims.TOKEN: claims.TOKEN_AUTHORIZATION,\n claims.SESSION_ID: session_token.pk,\n claims.USER_ID: user.pk,\n claims.EMAIL: user.email,\n 'account': account.pk,\n }\n\nYou will need to activete this function in the settings::\n\n REST_FRAMEWORK_SSO = {\n 'CREATE_AUTHORIZATION_PAYLOAD': 'myapp.authentication.create_authorization_payload',\n ...\n }\n\nJWT Authentication\n------------------\nIn order to get-or-create User accounts automatically within your microservice apps,\nyou may need to write your custom JWT payload authentication function::\n\n from django.contrib.auth import get_user_model\n from rest_framework_sso import claims\n\n def authenticate_payload(payload):\n user_model = get_user_model()\n user, created = user_model.objects.get_or_create(\n service=payload.get(claims.ISSUER),\n external_id=payload.get(claims.USER_ID),\n )\n if not user.is_active:\n raise exceptions.AuthenticationFailed(_('User inactive or deleted.'))\n return user\n\n\nEnable authenticate_payload function in REST_FRAMEWORK_SSO settings::\n\n REST_FRAMEWORK_SSO = {\n 'AUTHENTICATE_PAYLOAD': 'otherapp.authentication.authenticate_payload',\n ...\n }\n\nEnable JWT authentication in the REST_FRAMEWORK settings::\n\n REST_FRAMEWORK = {\n 'DEFAULT_AUTHENTICATION_CLASSES': (\n 'rest_framework_sso.authentication.JWTAuthentication',\n 'rest_framework.authentication.SessionAuthentication',\n ...\n ),\n ...\n }\n\nRequests that have been successfully authenticated with JWTAuthentication contain\nthe JWT payload data in the `request.auth` variable. This data can be used in your\nAPI views/viewsets to handle permissions, for example::\n\n from rest_framework_sso import claims\n\n class UserViewSet(viewsets.ReadOnlyModelViewSet):\n serializer_class = UserSerializer\n queryset = User.objects.none()\n\n def get_queryset(self):\n if not request.user.is_authenticated or not request.auth:\n return self.none()\n return User.objects.filter(\n service=request.auth.get(claims.ISSUER),\n external_id=request.auth.get(claims.USER_ID),\n )\n\nSettings\n--------\nExample settings for project that both issues and validates tokens for `myapp` and `otherapp`::\n\n REST_FRAMEWORK_SSO = {\n 'CREATE_AUTHORIZATION_PAYLOAD': 'myapp.authentication.create_authorization_payload',\n 'IDENTITY': 'myapp',\n 'SESSION_AUDIENCE': ['myapp'],\n 'AUTHORIZATION_AUDIENCE': ['myapp', 'otherapp'],\n 'ACCEPTED_ISSUERS': ['myapp'],\n 'PUBLIC_KEYS': {\n 'myapp': 'keys/myapp-20180101.pem', # both private/public key in same file\n },\n 'PRIVATE_KEYS': {\n 'myapp': 'keys/myapp-20180101.pem', # both private/public key in same file\n },\n }\n\nExample settings for project that only accepts tokens signed by `myapp` public key for `otherapp`::\n\n REST_FRAMEWORK_SSO = {\n 'AUTHENTICATE_PAYLOAD': 'otherapp.authentication.authenticate_payload',\n 'VERIFY_SESSION_TOKEN': False,\n 'IDENTITY': 'otherapp',\n 'ACCEPTED_ISSUERS': ['myapp'],\n 'PUBLIC_KEYS': {\n 'myapp': 'keys/myapp-20180101.pem', # only public key in this file\n },\n }\n\nFull list of settings parameters with their defaults::\n\n REST_FRAMEWORK_SSO = {\n 'CREATE_SESSION_PAYLOAD': 'rest_framework_sso.utils.create_session_payload',\n 'CREATE_AUTHORIZATION_PAYLOAD': 'rest_framework_sso.utils.create_authorization_payload',\n 'ENCODE_JWT_TOKEN': 'rest_framework_sso.utils.encode_jwt_token',\n 'DECODE_JWT_TOKEN': 'rest_framework_sso.utils.decode_jwt_token',\n 'AUTHENTICATE_PAYLOAD': 'rest_framework_sso.utils.authenticate_payload',\n\n 'ENCODE_ALGORITHM': 'RS256',\n 'DECODE_ALGORITHMS': None,\n 'VERIFY_SIGNATURE': True,\n 'VERIFY_EXPIRATION': True,\n 'VERIFY_ISSUER': True,\n 'VERIFY_AUDIENCE': True,\n 'VERIFY_SESSION_TOKEN': True,\n 'EXPIRATION_LEEWAY': 0,\n 'SESSION_EXPIRATION': None,\n 'AUTHORIZATION_EXPIRATION': datetime.timedelta(seconds=300),\n\n 'IDENTITY': None,\n 'SESSION_AUDIENCE': None,\n 'AUTHORIZATION_AUDIENCE': None,\n 'ACCEPTED_ISSUERS': None,\n 'KEY_STORE_ROOT': None,\n 'PUBLIC_KEYS': {},\n 'PRIVATE_KEYS': {},\n\n 'AUTHENTICATE_HEADER': 'JWT',\n }\n\nGenerating RSA keys\n-------------------\nYou can use openssl to generate your public/private key pairs::\n\n $ openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048\n $ openssl rsa -pubout -in private_key.pem -out public_key.pem\n $ cat private_key.pem public_key.pem > keys/myapp-20180101.pem\n\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/namespace-ee/django-rest-framework-sso", "keywords": "", "license": "MIT License", "maintainer": "", "maintainer_email": "", "name": "djangorestframework-sso", "package_url": "https://pypi.org/project/djangorestframework-sso/", "platform": "", "project_url": "https://pypi.org/project/djangorestframework-sso/", "project_urls": { "Homepage": "https://github.com/namespace-ee/django-rest-framework-sso" }, "release_url": "https://pypi.org/project/djangorestframework-sso/0.2.4/", "requires_dist": [ "PyJWT (<2.0.0,>=1.5.2)" ], "requires_python": "", "summary": "Single sign-on extension to the Django REST Framework.", "version": "0.2.4" }, "last_serial": 5949144, "releases": { "0.0.1": [], "0.0.10": [ { "comment_text": "", "digests": { "md5": "9c4d939da0d14469b7b0e260e5601ae6", "sha256": "c3f624cc50ee37690734b807959a606b7546a4365aa1676f780070079cfd0cdb" }, "downloads": -1, "filename": "djangorestframework-sso-0.0.10.tar.gz", "has_sig": false, "md5_digest": "9c4d939da0d14469b7b0e260e5601ae6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11216, "upload_time": "2018-05-17T14:17:58", "url": "https://files.pythonhosted.org/packages/65/02/f6d057d2eea4b4fe4ce22709dd7073af9a998d03d4cff16edffb5014fbf7/djangorestframework-sso-0.0.10.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "8b6e5c7b5c151b3231e42cf939a626cd", "sha256": "7a1051e43ddd5a03e07c5abf4749a69547824677ce8376ff97b06ea6eb8d08e8" }, "downloads": -1, "filename": "djangorestframework-sso-0.0.2.tar.gz", "has_sig": false, "md5_digest": "8b6e5c7b5c151b3231e42cf939a626cd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7475, "upload_time": "2016-06-21T10:18:06", "url": "https://files.pythonhosted.org/packages/08/c2/79f71915b94e1d3612b441e5a340e417be68cca532c24f36e56e1d1c6816/djangorestframework-sso-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "7358e0d2cbf5e9822f4f795a79748f6a", "sha256": "153852bde3227d9a3ebc601c7c23acd10582dc8a83a0503a6b745411d6cf83ec" }, "downloads": -1, "filename": "djangorestframework-sso-0.0.3.tar.gz", "has_sig": false, "md5_digest": "7358e0d2cbf5e9822f4f795a79748f6a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9750, "upload_time": "2016-06-27T08:46:47", "url": "https://files.pythonhosted.org/packages/bc/c7/76dc46fa61dd73f5f74d8a58009c9766904add8015b8311eedbbfe73d5d6/djangorestframework-sso-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "2ffd08cf051dfaed277d8a435753fa82", "sha256": "5032b11f3e51d0a4efa708815f034bc33840745ef6e15631c6cf1e42808b26a9" }, "downloads": -1, "filename": "djangorestframework-sso-0.0.4.tar.gz", "has_sig": false, "md5_digest": "2ffd08cf051dfaed277d8a435753fa82", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10878, "upload_time": "2016-06-28T11:44:13", "url": "https://files.pythonhosted.org/packages/c5/42/994b3398d610dfd6fb1e484770bfb1cf7d74b7c08a674c91879c70af5879/djangorestframework-sso-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "28597d942f95ea3f16355e33f824ef44", "sha256": "c552368605d95d47e8e5c0fa96a1f3765bb7b9aff13f01fa26f75ecb095ba9ff" }, "downloads": -1, "filename": "djangorestframework-sso-0.0.5.tar.gz", "has_sig": false, "md5_digest": "28597d942f95ea3f16355e33f824ef44", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10916, "upload_time": "2016-06-28T11:51:01", "url": "https://files.pythonhosted.org/packages/99/1a/29970f641852dd5fb5161e8f4bffd81ac3d2de3f5634bd1c1fbb85a83890/djangorestframework-sso-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "3fef66bff3f8ab29e893185a2e2b0be1", "sha256": "fbfba2db300b734657bddcc09f0325e7bbd77c1b35e6be0fb915c480f4a5ad4c" }, "downloads": -1, "filename": "djangorestframework-sso-0.0.6.tar.gz", "has_sig": false, "md5_digest": "3fef66bff3f8ab29e893185a2e2b0be1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10925, "upload_time": "2016-06-28T12:35:42", "url": "https://files.pythonhosted.org/packages/f1/5b/74f7a0f286a431e743831cdf0b88438a29bce2bcfc6d87f3e0efea65e3f7/djangorestframework-sso-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "cc140d8d4326522bc1c6b7850a786684", "sha256": "59e0d3d9919bcae04a97fb270680d9cf8e0be63423579ad77ae10c2ff15bfce9" }, "downloads": -1, "filename": "djangorestframework-sso-0.0.7.tar.gz", "has_sig": false, "md5_digest": "cc140d8d4326522bc1c6b7850a786684", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11001, "upload_time": "2016-06-28T14:10:38", "url": "https://files.pythonhosted.org/packages/0d/a2/a5fa3f5ebdef8134a2ad6de4ac211f616083141bcdb415797d7dacfd3c8f/djangorestframework-sso-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "af93cb08d7afe50adb0a7a4984e8f748", "sha256": "f6a5f51cef37e5d76a5a48bd3e7286ad661a7f4ebb11e1f26e6f288218c35c82" }, "downloads": -1, "filename": "djangorestframework-sso-0.0.8.tar.gz", "has_sig": false, "md5_digest": "af93cb08d7afe50adb0a7a4984e8f748", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11077, "upload_time": "2016-06-28T15:22:25", "url": "https://files.pythonhosted.org/packages/be/08/2c9ad6b87ecbaf30a6b69cd9143ff2b2125ba418ed841ea0d2205bb45c01/djangorestframework-sso-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "539121bff7aea0481e51acda3fafbea2", "sha256": "aa346a54f805e5af41384402c1e1ad775545d4f058104d0b776fdbb049bf263c" }, "downloads": -1, "filename": "djangorestframework-sso-0.0.9.tar.gz", "has_sig": false, "md5_digest": "539121bff7aea0481e51acda3fafbea2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11297, "upload_time": "2016-06-30T07:54:13", "url": "https://files.pythonhosted.org/packages/f7/c8/093cff204e6f7c2249a140a8ff2e92187eb59b034519b933e5b0f98d4744/djangorestframework-sso-0.0.9.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "49bda6cf05866bcc264466b2846fa545", "sha256": "4d648be7d0448fff5df8550549a4a71b9324611782923971173c9ce4d11d867a" }, "downloads": -1, "filename": "djangorestframework_sso-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "49bda6cf05866bcc264466b2846fa545", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15256, "upload_time": "2019-07-24T08:50:45", "url": "https://files.pythonhosted.org/packages/74/cb/5e015f22656557bb10cef50fcde5b573c2f06a4590083644c79ccca0eacc/djangorestframework_sso-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "513c1de1581e25fd7b27ea402eae1220", "sha256": "8dd76a77fd008fe7781c4a23ec10c026f56e33b7b4a9f1a3d7425a7d3f86f9cd" }, "downloads": -1, "filename": "djangorestframework-sso-0.1.0.tar.gz", "has_sig": false, "md5_digest": "513c1de1581e25fd7b27ea402eae1220", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11246, "upload_time": "2019-07-24T08:50:46", "url": "https://files.pythonhosted.org/packages/61/9a/25823cc59d2855eff69e5727738e330680e62730173c9e01c46a0aa946ed/djangorestframework-sso-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "02900f0ecd5fdee2a8b0b9840d1136a3", "sha256": "d16392f2dda1700f4340e0697aff96d9d719334756808441c0e8c50001f7434b" }, "downloads": -1, "filename": "djangorestframework_sso-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "02900f0ecd5fdee2a8b0b9840d1136a3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14969, "upload_time": "2019-08-13T07:27:41", "url": "https://files.pythonhosted.org/packages/d6/6e/b4e994a8700a86e1fefd0d18d0d8ba0c246c678f89bce766dc8f7ca015fa/djangorestframework_sso-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5998d1b00855e3eab980b99f792030a3", "sha256": "403b220139055680a41b04aa5d9566da3d5827608af8ea1b52f5aa6e8d605b66" }, "downloads": -1, "filename": "djangorestframework-sso-0.2.0.tar.gz", "has_sig": false, "md5_digest": "5998d1b00855e3eab980b99f792030a3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11010, "upload_time": "2019-08-13T07:27:43", "url": "https://files.pythonhosted.org/packages/5a/21/10a8a6ace39a0298f705ea3b143cf02eb904b6e854ac2a3810231962cb05/djangorestframework-sso-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "b6d7c0a7df08e5008d7629b6e4000ca0", "sha256": "bd6fc341a6e28cb7215e1f53dcb125a724d7b1c7d3fb2e1d1a0dcfd8ea0b5344" }, "downloads": -1, "filename": "djangorestframework_sso-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b6d7c0a7df08e5008d7629b6e4000ca0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15022, "upload_time": "2019-08-14T07:09:38", "url": "https://files.pythonhosted.org/packages/c9/da/c6f7ee7dda7c9d4725adc062b5947c440e0c96075cfa6d1676ad5644fb1c/djangorestframework_sso-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6bb44ebf7312e438f320f85d442f7522", "sha256": "fde7f06c020fe31f6d1c6a3e55621eda8b301018f037b5bacbbc8e4aca50d1b3" }, "downloads": -1, "filename": "djangorestframework-sso-0.2.1.tar.gz", "has_sig": false, "md5_digest": "6bb44ebf7312e438f320f85d442f7522", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11041, "upload_time": "2019-08-14T07:09:40", "url": "https://files.pythonhosted.org/packages/4e/4f/35c0f6875664587e53f8841be59e61d5276a71b4cd1e38d16e2913caa6c3/djangorestframework-sso-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "4ea74fa68177f3962d931e77f9efd848", "sha256": "6a9e69a3f0dc1a41a1023e71b959bc71a9827e5ff282dfec6f5a98030048da7a" }, "downloads": -1, "filename": "djangorestframework_sso-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "4ea74fa68177f3962d931e77f9efd848", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15571, "upload_time": "2019-08-14T07:20:02", "url": "https://files.pythonhosted.org/packages/96/5c/2277d0c082476b44ae5f21af49d41d9ba53a922944382e8d8886e6dac1dc/djangorestframework_sso-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9ae87a4b354f9d9ea5f9fb0645c6d1e5", "sha256": "893cdfba35e1e9e0a8f96aef3ee14f17778067622e3acb79c62c0e1d407333cb" }, "downloads": -1, "filename": "djangorestframework-sso-0.2.2.tar.gz", "has_sig": false, "md5_digest": "9ae87a4b354f9d9ea5f9fb0645c6d1e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11215, "upload_time": "2019-08-14T07:20:04", "url": "https://files.pythonhosted.org/packages/af/5b/48ac9c316fa49ab18243d1b0eaa85c0b0f93b689b3449abebe488ed13439/djangorestframework-sso-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "a5f9188e0728757ea5ae9634d0d9cc0e", "sha256": "89142871330b67535718ac365d27ddb5186ec48ba683493e053efd1e91656d0c" }, "downloads": -1, "filename": "djangorestframework_sso-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "a5f9188e0728757ea5ae9634d0d9cc0e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15595, "upload_time": "2019-10-09T10:50:49", "url": "https://files.pythonhosted.org/packages/f5/59/dd33734c2cbb25ea4503c556b7b69ddb41ee776a3724e96937c923b7d436/djangorestframework_sso-0.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d345f836aa5d27c29ec6ed30e416ba26", "sha256": "3c8b3fff0466f40e926e7c8c392d91507abb4f5e1841cd7e5cedf391d2773b14" }, "downloads": -1, "filename": "djangorestframework-sso-0.2.3.tar.gz", "has_sig": false, "md5_digest": "d345f836aa5d27c29ec6ed30e416ba26", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11471, "upload_time": "2019-10-09T10:50:51", "url": "https://files.pythonhosted.org/packages/35/0f/f207ae6144e9a7343996f2e414591fdb208551b49e02092fc0001c9c4457/djangorestframework-sso-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "01f9de1b059ec1ff3da4a870f79ec250", "sha256": "a5aefb95c0745f824d3f73b8e15843683258abe7b0a562c386bf196b8304e6f4" }, "downloads": -1, "filename": "djangorestframework_sso-0.2.4-py3-none-any.whl", "has_sig": false, "md5_digest": "01f9de1b059ec1ff3da4a870f79ec250", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15541, "upload_time": "2019-10-09T11:08:49", "url": "https://files.pythonhosted.org/packages/db/01/46f325d0ba94cab2302030934c0e5add090b7705b8eb340fde703181794d/djangorestframework_sso-0.2.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "31fc4b3077c5cbe345b0e2fd57bd26a7", "sha256": "c164631c5f971120dd10dac35df58d47fd29a890fa3e72bb06b1e4a3e9e8f398" }, "downloads": -1, "filename": "djangorestframework-sso-0.2.4.tar.gz", "has_sig": false, "md5_digest": "31fc4b3077c5cbe345b0e2fd57bd26a7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11416, "upload_time": "2019-10-09T11:08:51", "url": "https://files.pythonhosted.org/packages/9b/8a/5eeb3d1c5474cbf9952f7395065facad2eeabe52c458e55b8ae6c8f273ba/djangorestframework-sso-0.2.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "01f9de1b059ec1ff3da4a870f79ec250", "sha256": "a5aefb95c0745f824d3f73b8e15843683258abe7b0a562c386bf196b8304e6f4" }, "downloads": -1, "filename": "djangorestframework_sso-0.2.4-py3-none-any.whl", "has_sig": false, "md5_digest": "01f9de1b059ec1ff3da4a870f79ec250", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15541, "upload_time": "2019-10-09T11:08:49", "url": "https://files.pythonhosted.org/packages/db/01/46f325d0ba94cab2302030934c0e5add090b7705b8eb340fde703181794d/djangorestframework_sso-0.2.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "31fc4b3077c5cbe345b0e2fd57bd26a7", "sha256": "c164631c5f971120dd10dac35df58d47fd29a890fa3e72bb06b1e4a3e9e8f398" }, "downloads": -1, "filename": "djangorestframework-sso-0.2.4.tar.gz", "has_sig": false, "md5_digest": "31fc4b3077c5cbe345b0e2fd57bd26a7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11416, "upload_time": "2019-10-09T11:08:51", "url": "https://files.pythonhosted.org/packages/9b/8a/5eeb3d1c5474cbf9952f7395065facad2eeabe52c458e55b8ae6c8f273ba/djangorestframework-sso-0.2.4.tar.gz" } ] }