{ "info": { "author": "Sherman Liu", "author_email": "qingfeng0820@sina.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Topic :: Utilities" ], "description": "easyauth: A toolkit to set up web application with authentication and authorization functionalities based on Django\r\n====================================================================================================================\r\nDon't need any code for authentication and authorization checking, just use configuration to enable authorization\r\n\r\n.. image:: https://img.shields.io/travis/qingfeng0820/easyauth/master.svg\r\n :target: https://travis-ci.org/qingfeng0820/easyauth\r\n\r\n\r\n`\u4e2d\u6587README `_\r\n\r\nLicense\r\n-------\r\n\r\n`BSD License `_\r\n\r\n\r\nSource code\r\n-----------\r\n`Github `_\r\n\r\n\r\nDevelop environment\r\n-------------------\r\n- Python 2.7\r\n- pip\r\n- npm (can install nodejs which contains npm)\r\n\r\n\r\nInstallation\r\n------------\r\n\r\nfrom pypi\r\n\r\n.. code-block:: shell\r\n\r\n pip install easyauth\r\n\r\n\r\n\r\nSetup your own project via easyauth\r\n-----------------------------------\r\n\r\n1. Create your app by below command(it will create project under current folder):\r\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n\r\n.. code-block:: shell\r\n\r\n > make_project {your_app_name}\r\n\r\n2. Setup backend which based on Django\r\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n\r\n1). Change configurations of the easyauth and Django based project\r\n - You can keep the configuration as default if you just want to trial\r\n - Main configurations are in {your_app_name}/settings/production.py\r\n - {your_app_name}/settings/local.py is used for some special configuration only need enabled in development\r\n\r\n2). Change your User mode located in {your_app_name}/models.py\r\n - see below example code (don't need add serializer, view and permission classes for User model)\r\n\r\n.. code-block:: python\r\n\r\n from easyauth.models import AbstractUser\r\n\r\n\r\n class User(AbstractUser):\r\n # you can define additional fields\r\n {Other field} = models.CharField(...)\r\n # You can specify the some other field to be USERNAME_FIELD.\r\n # USERNAME_FIELD is unique field to identity an user for login\r\n # Default is phone\r\n USERNAME_FIELD = {Other field to stand for username}\r\n\r\n # You can specify the USER_DEPART_FIELD field if you user model is grouped by department or company\r\n # For with depart field case, the permitted user can only maintain the users in the same department.\r\n # Default value is None for USER_DEPART_FIELD.\r\n USER_DEPART_FIELD = \"company\"\r\n company = models.ForeignKey(Company, related_name='users', null=True)\r\n\r\n # Filter properties are defined in view classed for filtering.\r\n # But the User model related views are defined in easyauth, you cannot create or change filter properties\r\n # Thus there is another way to add filter properties like below in user model\r\n FILTER_FIELDS = ('company__name', ...)\r\n SEARCH_FIELDS = (...)\r\n ORDERING_FIELDS = ('company__name', ...)\r\n\r\n # PS: You can have no implementation of this class (just add 'pass' in this class) if you just want to trial.\r\n\r\n3). Create your own models, serializers and views\r\n - modify {your_app_name}/models.py to add your own models\r\n\r\n.. code-block:: python\r\n\r\n class DummyModel(models.Model):\r\n name = models.CharField(max_length=100, unique=True)\r\n created_time = models.DateTimeField(auto_now_add=True)\r\n\r\n class Meta:\r\n permissions = (\r\n (\"maintain_dummy_model\", _(\"Can maintain dummy model\")), # <=== define a permission in your model\r\n )\r\n ordering = ('id', )\r\n\r\n- create {your_app_name}/serializers.py to add your own serializers\r\n\r\n.. code-block:: python\r\n\r\n from rest_framework import serializers\r\n\r\n from {your_app_name} import models\r\n\r\n class DummyModelSerializer(serializers.ModelSerializer):\r\n\r\n class Meta:\r\n model = models.DummyModel\r\n fields = '__all__'\r\n depth = 1\r\n\r\n\r\n- create {your_app_name}/permissions.py to add your own permission classes\r\n\r\n.. code-block:: python\r\n\r\n from easyauth.permissions import DBBasedPermissionsAll\r\n\r\n\r\n class DummyModelMaintainPermission(DBBasedPermissionsAll):\r\n required_permission_names = [\"{your_app_name}.maintain_dummy_model\", ] # <=== permission check class for the defined permission in your model\r\n\r\n- create {your_app_name}/views.py to add your own views\r\n\r\n.. code-block:: python\r\n\r\n from rest_framework import viewsets, permissions\r\n\r\n from {your_app_name} import models, serializers\r\n from {your_app_name}.permissions import DummyModelMaintainPermission\r\n\r\n class DummyModelViewSet(viewsets.ModelViewSet):\r\n queryset = models.DummyModel.objects.all()\r\n serializer_class = serializers.DummyModelSerializer\r\n permission_classes = (DummyModelMaintainPermission, ) # <=== use the defined permission class\r\n # Or you can the common permission class DjangoModelPermissions instead, which provided by Rest framework lib\r\n # permission_classes = (permissions.DjangoModelPermissions, )\r\n\r\n- modify {your_app_name}/urls.py to add your API urls\r\n\r\n.. code-block:: python\r\n\r\n from django.conf.urls import url, include\r\n from rest_framework import routers\r\n\r\n from easyauth import urls as auth_urls\r\n from easyauth import admin_urls as user_admin_urls\r\n\r\n from {your_app_name} import views\r\n\r\n router = routers.DefaultRouter(trailing_slash=False)\r\n # app apis\r\n router.register(r'api/dummy_models', views.DummyModelViewSet, base_name='dummy_model') # <=== define your API url\r\n\r\n urlpatterns = router.urls\r\n\r\n urlpatterns += [\r\n # url(r'^admin/', admin.site.urls),\r\n # auth apis including login, password reset\r\n url(r'^api-auth/', include(auth_urls)), # <=== authentication APIs provided by easyauth\r\n # user crud apis - only used by administrator\r\n url(r'^api/', include(user_admin_urls)), # <=== user/group/permission admin APIs provided by easyauth\r\n ]\r\n\r\n4). Go to {your_app_name} folder to initiate database\r\n - run below commands:\r\n\r\n.. code-block:: shell\r\n\r\n {your_app_name}> python manage.py makemigrations\r\n {your_app_name}> python manage.py makemigrations {your_app_name}\r\n {your_app_name}> python manage.py migrate\r\n\r\n5). Then create a superuser\r\n - run below command:\r\n\r\n.. code-block:: shell\r\n\r\n {your_app_name}> python manage.py createsuperuser\r\n\r\n6). Start your backend for your development test\r\n - run below command:\r\n\r\n.. code-block:: shell\r\n\r\n {your_app_name}> python manage.py runserver 0.0.0.0:80\r\n\r\n7). Have a test\r\n - Maintain authentication and authorization test\r\n - User the created super user to login\r\n - Create roles/groups\r\n - Create users, and assign them proper roles or permissions\r\n - All APIs provided by easyauth\r\n - user group(role) admin APIs (super user or have related permissions)\r\n - /api/groups GET: Get all user groups (super user or have 'query_group' permission)\r\n - /api/groups POST: Create an user group (super user)\r\n - /api/groups/[group_id] GET: Get an user group (super user or have 'query_group' permission)\r\n - /api/groups/[group_id] PUT or PATCH: Modify an user group (super user)\r\n - /api/groups/[group_id] DELETE: Delete an user group (super user)\r\n - user admin APIs (super user or have related permissions, if department enabled for user model, user can only maintain users in the same department if he/she has related permissions)\r\n - /api/users GET: Get all users (super user or have 'query_user' permission)\r\n - /api/users POST: Create an user (super user or have 'create_user' permission)\r\n - /api/users/[user_id] GET: Get a specific user (super user or have 'query_user' permission)\r\n - /api/users/[user_id] PUT or PATCH: Modify a specific user (super user or have 'change_user' permission)\r\n - /api/users/[user_id] DELETE: Delete a specific user (super user or have 'delete_user' permission)\r\n - /api/users/[user_id]/reset/password PUT: Reset to default password for a specific user (super user or have 'change_user' permission)\r\n - query permission APIs (permissions are defined in models code)\r\n - /api/permissions GET: Get all permissions (super user or have 'query_permission' permission)\r\n - /api/permissions/[permission_id] GET: Get a specific permission (super user or have 'query_permission' permission)\r\n - authentication APIs\r\n - /api-auth/login POST: User login\r\n - /api-auth/logout POST (or GET if enabled): User logout\r\n - /api-auth/me PUT or PATCH: Modify current login user\r\n - /api-auth/me GET: Get current login user\r\n - /api-auth/password/change PUT: Change the current login user's password\r\n - /api-auth/register POST: Register User (This API can be disabled by configuration)\r\n - Your own APIs\r\n - ...\r\n\r\n\r\n3. Setup frontend if you need admin dashboard, which based Vue + Element-UI\r\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n1). Go to {your_app_name}/vue-ui folder, and run below command to install dependency libs\r\n - run below command:\r\n\r\n.. code-block:: shell\r\n\r\n {your_app_name}/vue-ui> npm install\r\n\r\n2). Configure your backend baseURL by changing {your_app_name}/vue-ui/src/components/config.js\r\n - see below code:\r\n\r\n.. code-block:: javascript\r\n\r\n var baseURL = 'http://localhost'; // <=== baseURL for production\r\n if (process.env.NODE_ENV == 'development') {\r\n baseURL = 'http://localhost'; // <=== baseURL for development\r\n }\r\n ...\r\n\r\n3). Change theme by alias in {your_app_name}/vue-ui/build/webpack.base.conf.js\r\n - Change the value of alias 'THEME'\r\n - Now support two themes\r\n - resolve('src/themes/default') // <=== default theme\r\n - resolve('src/themes/green') // <=== green theme\r\n\r\n4). Create your own vue pages to {your_app_name}/vue-ui/src/components/page/\r\n - Common pages are under {your_app_name}/vue-ui/src/components/common/\r\n\r\n5). Change the menu in left slider bar by changing {your_app_name}/vue-ui/src/components/menus.js\r\n - see below example code:\r\n\r\n.. code-block:: javascript\r\n\r\n import i18n from '../i18n/i18n'\r\n import permission from './common/permission'\r\n import Dashboard from '@/components/page/Dashboard'\r\n import UserAdmin from '@/components/page/UserAdmin'\r\n import RoleAdmin from '@/components/page/RoleAdmin' // RoleAdmin and UserAdmin are default pages, you can just use it.\r\n import YourSubMenuItem from '@/components/page/YourSubMenuItem'\r\n import YourSubSubMenuItem from '@/components/page/YourSubSubMenuItem'\r\n\r\n var menu = [\r\n {\r\n name: 'Dashboard',\r\n path: '/dashboard',\r\n component: Dashboard,\r\n icon: 'el-icon-lx-home',\r\n meta: {\r\n getTitle: function() {\r\n return i18n.t(\"page.homeTitle\")\r\n },\r\n },\r\n },\r\n {\r\n name: 'UserAdmin',\r\n path: '/userAdmin',\r\n component: UserAdmin,\r\n icon: 'el-icon-lx-people',\r\n meta: {\r\n getTitle: function() {\r\n return i18n.t(\"page.userAdminTitle\")\r\n },\r\n // must have all permissions listed below to access this menu item\r\n requiredPermissions: ['query_group', 'query_permission', 'add_user', 'change_user', 'delete_user'],\r\n },\r\n },\r\n {\r\n name: 'RoleAdmin',\r\n path: '/roleAdmin',\r\n component: RoleAdmin,\r\n icon: 'el-icon-lx-group',\r\n meta: {\r\n getTitle: function() {\r\n return i18n.t(\"page.roleAdminTitle\")\r\n },\r\n permissionCheck: function(user) {\r\n return permission.isSuperUser(user)\r\n }\r\n },\r\n },\r\n {\r\n name: 'YourFolderMenu',\r\n icon: 'xxx',\r\n meta: {\r\n getTitle: function() {\r\n return \"Your Folder Menu\"\r\n },\r\n notRequireAuth: true, // <=== this configuration item means this menu can access by anonymous user\r\n },\r\n subs: [\r\n {\r\n name: 'YourSubFolderMenu',\r\n meta: {\r\n getTitle: function() {\r\n return \"Your Sub Folder Menu\"\r\n },\r\n requiredPermissions: [...],\r\n },\r\n subs: [\r\n // only can support three levels menu\r\n {\r\n name: 'YourSubSubMenuItem',\r\n path: '/yourSubSubMenuItem',\r\n component: YourSubSubMenuItem,\r\n meta: {\r\n getTitle: function() {\r\n return \"Your Sub Sub Menu Item\"\r\n },\r\n },\r\n },\r\n ...\r\n\r\n ]\r\n },\r\n {\r\n name: 'YourSubMenuItem',\r\n path: '/yourSubMenuItem',\r\n component: YourSubMenuItem,\r\n meta: {\r\n getTitle: function() {\r\n return \"Your Sub Menu Item\"\r\n },\r\n requiredPermissions: ['maintain_dummy_model', ...], // <=== Use the defined permission in your model\r\n },\r\n },\r\n ...\r\n ]\r\n },\r\n ]\r\n\r\n\r\n- screen shot for above menu\r\n.. image:: img/ui.JPG\r\n\r\n6). Modify UserAdmin.vue page\r\n - If you have additional fields in your User model, you can change the UserAdmin.vue to support them\r\n - Add columns in for additional fields\r\n - Add form items in of editing user for additional fields\r\n - Change related javascript code in that page\r\n\r\n7). Build you pages\r\n - run below command:\r\n\r\n.. code-block:: shell\r\n\r\n {your_app_name}/vue-ui> npm run build\r\n\r\n8). Deploy build results to static folder\r\n - run below commands:\r\n\r\n.. code-block:: shell\r\n\r\n {your_app_name}> mkdir static\r\n {your_app_name}> cp vue-ui/build/* static/\r\n\r\n9). Access you pages\r\n - Visit http://localhost/static/index.html\r\n\r\n10). if you are focus on pages development, you can use use dev model instead of steps 7 - 9\r\n - run below command, then visit http://localhost:8080:\r\n\r\n.. code-block:: shell\r\n\r\n {your_app_name}/vue-ui> npm run build\r\n\r\n\r\nMore configurations\r\n-------------------\r\n\r\n\r\nLanguage configuration\r\n^^^^^^^^^^^^^^^^^^^^^^^^\r\n- Change to be Chinese\r\n - Change LANGUAGE_CODE = 'zh-hans' in {your app name}/settings/production.py (backend)\r\n - Change defaultLangCode: \"zh-hans\" in {your_app_name}/vue-ui/src/components/config.js (frontend)\r\n\r\n.. code-block:: javascript\r\n\r\n ...\r\n const config = {\r\n loginFieldName: \"phone\", // <=== should keep this value same as USERNAME_FIELD in your User model\r\n backendBaseURL: baseURL,\r\n requestTimeout: 10000,\r\n defaultLangCode: \"zh-hans\", // <=== Change here for frontend\r\n }\r\n ...\r\n\r\n\r\neasyauth Configuration\r\n^^^^^^^^^^^^^^^^^^^^^^^^\r\n\r\nChange EASYAUTH_CONF in {your_app_name}/settings/product.py if you need:\r\n\r\n.. code-block:: python\r\n\r\n EASYAUTH_CONF = {\r\n 'USER_DEFAULT_PWD_MAINTAIN_BY_ADMIN': \"12345678\",\r\n 'ACCOUNT_LOGOUT_ON_GET': False,\r\n 'DISABLE_REGISTER': False,\r\n 'LANG_PARAM': 'lang',\r\n }\r\n\r\n+----------------------------------------+------------+--------------------------------------------------------------+\r\n| Configuration Item | Type | Description |\r\n+========================================+============+==============================================================+\r\n| USER_DEFAULT_PWD_MAINTAIN_BY_ADMIN | string | Define the default password for maintaining by administrator.|\r\n| | | |\r\n| | | Default value is 123456 for absent |\r\n+----------------------------------------+------------+--------------------------------------------------------------+\r\n| ACCOUNT_LOGOUT_ON_GET | bool | Switch for enabling GET method for logout API. |\r\n| | | |\r\n| | | Default value is False for absent |\r\n+----------------------------------------+------------+--------------------------------------------------------------+\r\n| DISABLE_REGISTER | bool | Switch for disabling register API. |\r\n| | | |\r\n| | | Default value is False for absent |\r\n+----------------------------------------+------------+--------------------------------------------------------------+\r\n| LANG_PARAM | string | Set the language parameter name in http request. |\r\n| | | (Usually don't need to change it) |\r\n| | | |\r\n| | | Default value is lang, it will be used like |\r\n| | | http://localhost/api/users?lang=zh-hans |\r\n| | | |\r\n| | | Tips: Keep the value of lang_param in |\r\n| | | {your_app_name}/vue-ui/src/components/common/easyauth.js |\r\n| | | same with this configuration value. |\r\n+----------------------------------------+------------+--------------------------------------------------------------+\r\n\r\nMore examples please see the test app in this repo\r\n\r\n\r\n\r\n\r\n\r\n\r\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/qingfeng0820/easyauth", "keywords": "Authentication based on Django,Authorization based on Django,Python web application Auth", "license": "BSD", "maintainer": "Sherman Liu", "maintainer_email": "qingfeng0820@sina.com", "name": "easyauth", "package_url": "https://pypi.org/project/easyauth/", "platform": "all", "project_url": "https://pypi.org/project/easyauth/", "project_urls": { "Homepage": "https://github.com/qingfeng0820/easyauth" }, "release_url": "https://pypi.org/project/easyauth/0.1.3/", "requires_dist": [ "django (==1.9)", "djangorestframework (==3.7)", "django-cors-headers", "django-filter (==1.1.0)" ], "requires_python": "", "summary": "A toolkit to set up web application with authentication and authorization functionalities based on Django.", "version": "0.1.3" }, "last_serial": 4991265, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "819558d4074ef9b6ddac004d30751564", "sha256": "d7074ce9dac1b96cbd12e831bda8ea8152008dd053b9230a5b9310233307e35b" }, "downloads": -1, "filename": "easyauth-0.1.0-py2-none-any.whl", "has_sig": false, "md5_digest": "819558d4074ef9b6ddac004d30751564", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 11606, "upload_time": "2018-11-19T02:24:47", "url": "https://files.pythonhosted.org/packages/f8/c5/c175f2a245245199e65b07b82218ee62193e74da3e7d7442143c75fb2d32/easyauth-0.1.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3e044bde38c0d8ca3f146a6dd6321ea3", "sha256": "a5beab1503aa7bb4d3c2273284874a69d64cfb16e650c6bf71d5db649a6c72f8" }, "downloads": -1, "filename": "easyauth-0.1.0.tar.gz", "has_sig": false, "md5_digest": "3e044bde38c0d8ca3f146a6dd6321ea3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8843, "upload_time": "2018-11-19T02:24:50", "url": "https://files.pythonhosted.org/packages/37/67/4f413673293b6b6f9dd73ce02b236a3874c0886dc3675d385dd1bbe09344/easyauth-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "6cc4ed30176e8286b37e436570e48044", "sha256": "5aee8d6f626693041e6f380c9a0f502e1facb93c174938743600136ea562e450" }, "downloads": -1, "filename": "easyauth-0.1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "6cc4ed30176e8286b37e436570e48044", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 12843, "upload_time": "2018-11-19T15:33:48", "url": "https://files.pythonhosted.org/packages/c8/39/64054a67568619f79639bb8098d43d153544125d1f66e7c40cf2c1314807/easyauth-0.1.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "39376fbd1c0d6e7578eedac126f3e3f6", "sha256": "6739ca3e8acadeabed058f96537b091639a108b41dc7656b4a05509f1fbd390b" }, "downloads": -1, "filename": "easyauth-0.1.1.tar.gz", "has_sig": false, "md5_digest": "39376fbd1c0d6e7578eedac126f3e3f6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9170, "upload_time": "2018-11-19T15:33:50", "url": "https://files.pythonhosted.org/packages/fe/6c/4f088da8c1f0afec6de7708281b82af48af9060f562cd04bae77f6051b2d/easyauth-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "6859f1f2ddfac8a4f4d42626ba04d2cf", "sha256": "34066027817a57e1a45512467e5d70903130d36b580bbb7aad4dede0d1fe0842" }, "downloads": -1, "filename": "easyauth-0.1.2-py2-none-any.whl", "has_sig": false, "md5_digest": "6859f1f2ddfac8a4f4d42626ba04d2cf", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 315382, "upload_time": "2018-12-28T06:42:58", "url": "https://files.pythonhosted.org/packages/26/da/8103abe93718bcc67349db8204cde228d39ec8ce3cfbc9f18fa9a9ebe22c/easyauth-0.1.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0c742e80547984db6f42d2b17a46e37a", "sha256": "93fa1d26ad458291eadce99f85dbec2a7546dcd8bd84267c17b81e76de45bba3" }, "downloads": -1, "filename": "easyauth-0.1.2.tar.gz", "has_sig": false, "md5_digest": "0c742e80547984db6f42d2b17a46e37a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 288208, "upload_time": "2018-12-28T06:43:01", "url": "https://files.pythonhosted.org/packages/0e/2e/183622eef5c362288194f7cc019ba6805332c19bf023545c40d82898c591/easyauth-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "035bfcc667b0d3214e3d7068be13b11c", "sha256": "57fb6dc2e0e2ac56d66b5be1be648b494b3e16bae1cd10a1e42f35b515366b2e" }, "downloads": -1, "filename": "easyauth-0.1.3-py2-none-any.whl", "has_sig": false, "md5_digest": "035bfcc667b0d3214e3d7068be13b11c", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 314569, "upload_time": "2019-03-27T08:00:52", "url": "https://files.pythonhosted.org/packages/51/6d/af3fdaccf29b088ec3a9ff7d1a61771fa955e83e1ae914c8b98b9badba65/easyauth-0.1.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f6982078ed59790fb74b5b4516598c67", "sha256": "e06246ef020dd49d1888fec038a431f7ab84cebceeb21d3d21457f9171a383cf" }, "downloads": -1, "filename": "easyauth-0.1.3.tar.gz", "has_sig": false, "md5_digest": "f6982078ed59790fb74b5b4516598c67", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 287761, "upload_time": "2019-03-27T08:00:54", "url": "https://files.pythonhosted.org/packages/15/4b/31d4d66b6689c5fc935777aa600fc703725954f76803972b4db367beba29/easyauth-0.1.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "035bfcc667b0d3214e3d7068be13b11c", "sha256": "57fb6dc2e0e2ac56d66b5be1be648b494b3e16bae1cd10a1e42f35b515366b2e" }, "downloads": -1, "filename": "easyauth-0.1.3-py2-none-any.whl", "has_sig": false, "md5_digest": "035bfcc667b0d3214e3d7068be13b11c", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 314569, "upload_time": "2019-03-27T08:00:52", "url": "https://files.pythonhosted.org/packages/51/6d/af3fdaccf29b088ec3a9ff7d1a61771fa955e83e1ae914c8b98b9badba65/easyauth-0.1.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f6982078ed59790fb74b5b4516598c67", "sha256": "e06246ef020dd49d1888fec038a431f7ab84cebceeb21d3d21457f9171a383cf" }, "downloads": -1, "filename": "easyauth-0.1.3.tar.gz", "has_sig": false, "md5_digest": "f6982078ed59790fb74b5b4516598c67", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 287761, "upload_time": "2019-03-27T08:00:54", "url": "https://files.pythonhosted.org/packages/15/4b/31d4d66b6689c5fc935777aa600fc703725954f76803972b4db367beba29/easyauth-0.1.3.tar.gz" } ] }