{"id":15295845,"url":"https://github.com/natlee/django-simple-3rd-party-jwt","last_synced_at":"2026-01-05T13:54:04.010Z","repository":{"id":62821483,"uuid":"562733566","full_name":"NatLee/Django-Simple-3rd-Party-JWT","owner":"NatLee","description":"Combine 3rd party login and JWT in one Django application.","archived":false,"fork":false,"pushed_at":"2024-01-15T06:36:33.000Z","size":99,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-03-15T07:23:00.652Z","etag":null,"topics":["3rd-party-login","django","django-application","google-login","google-login-signin","jwt","jwt-authentication","login-system","microsoft-login"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/django-simple-third-party-jwt/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NatLee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-07T06:19:22.000Z","updated_at":"2024-08-06T07:40:48.481Z","dependencies_parsed_at":"2024-01-15T07:43:44.176Z","dependency_job_id":null,"html_url":"https://github.com/NatLee/Django-Simple-3rd-Party-JWT","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NatLee%2FDjango-Simple-3rd-Party-JWT","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NatLee%2FDjango-Simple-3rd-Party-JWT/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NatLee%2FDjango-Simple-3rd-Party-JWT/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NatLee%2FDjango-Simple-3rd-Party-JWT/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NatLee","download_url":"https://codeload.github.com/NatLee/Django-Simple-3rd-Party-JWT/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245394767,"owners_count":20608123,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["3rd-party-login","django","django-application","google-login","google-login-signin","jwt","jwt-authentication","login-system","microsoft-login"],"created_at":"2024-09-30T18:08:23.453Z","updated_at":"2026-01-05T13:54:03.976Z","avatar_url":"https://github.com/NatLee.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Django Simple 3rd Party JWT\n\n[![Test](https://github.com/NatLee/Django-Simple-3rd-Party-JWT/actions/workflows/test.yml/badge.svg)](https://github.com/NatLee/Django-Simple-3rd-Party-JWT/actions/workflows/test.yml)\n[![Release](https://github.com/NatLee/Django-Simple-3rd-Party-JWT/actions/workflows/release.yml/badge.svg)](https://github.com/NatLee/Django-Simple-3rd-Party-JWT/actions/workflows/release.yml)\n\n\n\u003cimg width=\"1363\" alt=\"image\" src=\"https://user-images.githubusercontent.com/10178964/222040924-8cb37622-b1ac-4343-bb2f-96e48aabfa87.png\"\u003e\n\n\nThis is a simple tool for 3rd party login with JWT.\n\n\u003e See Simple Version in another repo -\u003e [JWT 3rd Party Dashboard](https://github.com/NatLee/Django-Simple-3rd-Party-JWT-Dev-Dashboard).\n\n## Installation\n\n```bash\npip install django-simple-third-party-jwt\n```\n\nCheck it in [Pypi](https://pypi.org/project/django-simple-third-party-jwt/).\n\n## Quick Start\n\n### Backend\n\n1. Add `django_simple_third_party_jwt` to your `INSTALLED_APPS` in `settings.py` like this:\n\n```py\nINSTALLED_APPS = [\n...\n'django_simple_third_party_jwt',\n]\n```\n\n2. Add APP settings to your `settings.py` like this:\n\n```py\n\nfrom datetime import timedelta\n\n# -------------- START - CORS Setting --------------\nCORS_ALLOW_ALL_ORIGINS = True\nCORS_ALLOW_CREDENTIALS = True\nCSRF_TRUSTED_ORIGINS = [\n    \"http://*.127.0.0.1\",\n    \"http://localhost\",\n]\n# -------------- END - CORS Setting -----------------\n\n# -------------- Start - SimpleJWT Setting --------------\nSIMPLE_JWT = {\n    \"ACCESS_TOKEN_LIFETIME\": timedelta(minutes=3600),\n    \"REFRESH_TOKEN_LIFETIME\": timedelta(days=1),\n    \"ROTATE_REFRESH_TOKENS\": False,\n    \"BLACKLIST_AFTER_ROTATION\": False,\n    \"UPDATE_LAST_LOGIN\": False,\n    \"ALGORITHM\": \"HS256\",\n    \"SIGNING_KEY\": SECRET_KEY,\n    \"VERIFYING_KEY\": None,\n    \"AUDIENCE\": None,\n    \"ISSUER\": None,\n    \"JWK_URL\": None,\n    \"LEEWAY\": 0,\n    \"AUTH_HEADER_TYPES\": (\"Bearer\",),\n    \"AUTH_HEADER_NAME\": \"HTTP_AUTHORIZATION\",\n    \"USER_ID_FIELD\": \"id\",\n    \"USER_ID_CLAIM\": \"user_id\",\n    \"USER_AUTHENTICATION_RULE\": \"rest_framework_simplejwt.authentication.default_user_authentication_rule\",\n    \"AUTH_TOKEN_CLASSES\": (\"rest_framework_simplejwt.tokens.AccessToken\",),\n    \"TOKEN_TYPE_CLAIM\": \"token_type\",\n    \"TOKEN_USER_CLASS\": \"rest_framework_simplejwt.models.TokenUser\",\n    \"JTI_CLAIM\": \"jti\",\n    \"SLIDING_TOKEN_REFRESH_EXP_CLAIM\": \"refresh_exp\",\n    \"SLIDING_TOKEN_LIFETIME\": timedelta(minutes=5),\n    \"SLIDING_TOKEN_REFRESH_LIFETIME\": timedelta(days=1),\n}\n# -------------- END - SimpleJWT Setting --------------\n\n# -------------- START - Auth Setting --------------\n\nSECURE_REFERRER_POLICY = \"no-referrer-when-downgrade\"\n# SECURE_CROSS_ORIGIN_OPENER_POLICY = \"same-origin-allow-popups\"\nSECURE_CROSS_ORIGIN_OPENER_POLICY = None\n\nLOGIN_REDIRECT_URL = \"/\"\nVALID_REGISTER_DOMAINS = [\"gmail.com\", \"hotmail.com\"] # Only these domains can login.\n\n# API URL Prefix\nJWT_3RD_PREFIX = 'api'\n\n# ================== Google Auth ==================\n# Add this block if you want to login with Google.\n\nSOCIAL_GOOGLE_CLIENT_ID = \"376808175534-d6mefo6b1kqih3grjjose2euree2g3cs.apps.googleusercontent.com\"\n\n# ================== END - Google Auth ==================\n\n# ================== Microsoft Auth ==================\n# Add this block if you want to login with Microsoft.\n\n# ID\nSOCIAL_MICROSOFT_CLIENT_ID = '32346173-22bc-43b2-b6ed-f88f6a76e38c'\n# Secret\nSOCIAL_MICROSOFT_CLIENT_SECRET = 'K5z8Q~dIXDiFN5qjMjRjIx34cZOJ3Glkrg.dxcG9'\n\n# ================== END - Microsoft Auth ==================\n\n\n# --------------- END - Auth Setting -----------------\n```\n\n\u003e You can regist `SOCIAL_GOOGLE_CLIENT_ID` on Google Cloud Platform.\n\n  [Google Colud | API和服務 | 憑證](https://console.cloud.google.com/apis/credentials)\n\n  1. Create a new project and create a new OAuth 2.0 Client ID.\n    ![](https://i.imgur.com/7UKP3I7.png)\n\n  2. Add `http://localhost:8000` to `Authorized JavaScript origins` and `Authorized redirect URIs`.\n    ![](https://i.imgur.com/IoTRs4j.png)\n\n\u003e You can regist `SOCIAL_MICROSOFT_CLIENT_ID` on Microsoft Azure.\n\n[Microsoft Entra 識別碼 | 應用程式註冊](https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/RegisteredApps)\n\n  1. Create a new application.\n    ![](https://i.imgur.com/my5UtXv.png)\n  2. Add `http://localhost:8000/api/auth/microsoft/callback` to `Redirect URIs`\n    ![](https://i.imgur.com/lsaZgMM.png)\n  3. Get `Client ID` from `Overview` page.\n    ![](https://i.imgur.com/5oo3xnI.png)\n  4. Get `Client Secret` from `Certificates \u0026 secrets` page.\n    ![](https://i.imgur.com/3F5ge7l.png)\n\n3. Include the `django_simple_third_party_jwt` URL settings in your project `urls.py` like this:\n\n```py\nfrom django.conf import settings\nfrom django.urls import include\nurlpatterns += [\n    path(\"api/\", include(\"django_simple_third_party_jwt.urls\")),\n]\n```\n\nYou also need to include JWT settings in your `urls.py`.\n\n```py\n# --------------- JWT\nfrom rest_framework_simplejwt.views import (\n    TokenVerifyView, TokenObtainPairView, TokenRefreshView\n)\nurlpatterns += [\n    path(\"api/auth/token\", TokenObtainPairView.as_view(), name=\"token_get\"),\n    path(\"api/auth/token/refresh\", TokenRefreshView.as_view(), name=\"token_refresh\"),\n    path(\"api/auth/token/verify\", TokenVerifyView.as_view(), name=\"token_verify\"),\n]\n# ---------------------------------\n```\n\n4. Migrate and test on your server.\n\n- Migrate\n\n```bash\npython manage.py migrate django_simple_third_party_jwt\n```\n\n- Test\n\n```bash\npython manage.py runserver\n```\n\n### Frontend (Optional)\n\nHere just a demo frontend settings.\n\n#### Google Login\n\nYou need to check `{{ social_google_client_id }}` is the same with `Metadata` and your `Html` page.\n\n- Meta\n\n```html\n\u003cmeta name=\"google-signin-scope\" content=\"profile email\" /\u003e\n\u003cmeta name=\"google-signin-client_id\" content=\"{{ social_google_client_id }}\" /\u003e\n\u003cscript src=\"https://accounts.google.com/gsi/client\" async defer\u003e\u003c/script\u003e\n```\n\n- Html\n\n```html\n\u003cli\u003e\n    \u003cdiv id=\"g_id_onload\"\n            data-client_id=\"{{ social_google_client_id }}\"\n            data-callback=\"get_jwt_using_google_credential\" \u003c/div\u003e\n    \u003cdiv class=\"g_id_signin\" data-type=\"standard\" data-size=\"large\" data-theme=\"outline\"\n            data-text=\"sign_in_with\" data-shape=\"rectangular\" data-logo_alignment=\"left\"\u003e\n    \u003c/div\u003e\n\u003c/li\u003e\n```\n\n- Javascript\n\nYou can try this script to get credential token from Google and verify it with calling our custom 3rd party API.\n\n```html\n\u003cscript\u003e\n  function get_jwt_using_google_credential(data) {\n    const google_token_url = \"/api/auth/google/token\";\n    // const google_token_url = \"/api/auth/google/token/session\"; \u003c------ if you also need login as session, choose this one.\n    const credential = data.credential;\n    $.ajax({\n      method: \"POST\",\n      url: google_token_url,\n      data: { credential: credential },\n    }).done(function (data) {\n      const access_token = data.access;\n      const refresh_token = data.refresh_token;\n      localStorage.setItem(\"access\", access_token);\n      localStorage.setItem(\"refresh\", refresh_token);\n      console.log(\"Google Login\");\n      $.ajax({\n        type: \"POST\",\n        url: \"/api/auth/token/verify\",\n        data: { token: access_token },\n        headers: {\n          Authorization: \"Bearer\" + \" \" + access_token,\n        },\n        success: function (data) {\n          var json_string = JSON.stringify(data, null, 2);\n          if (json_string) {\n            console.log(\"Token verified successfully!\");\n          }\n        },\n        error: function (data) {\n          var result = \"please login \" + data.responseText;\n          console.log(result);\n        },\n      });\n    });\n  }\n\u003c/script\u003e\n```\n\n#### Microsoft Login\n\nSet `LOGIN_REDIRECT_URL` in `settings.py` and add the following code in your `Html` page.\n\n- Html\n\n```html\n\u003cbutton id=\"microsoft-login-button\" class=\"btn w-100\" onclick=\"location.href='/api/auth/microsoft/signin';\"\u003e\n  \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Microsoft_logo.svg/2048px-Microsoft_logo.svg.png\" alt=\"Microsoft logo\" style=\"width: 30px; height: 30px;\"\u003e\n  Login with Microsoft\n\u003c/button\u003e\n```\n\n\n## Example\n\nCheck [Example of dashboard](https://github.com/NatLee/Django-Simple-3rd-Party-JWT-Dev-Dashboard).\n\nOr you can use the following steps.\n\n### Run example backend\n\nYou can see the example in `./example/`\n\n```bash\ngit clone https://github.com/NatLee/Django-Simple-3rd-Party-JWT\ncd Django-Simple-3rd-Party-JWT/example/django_simple_third_party_jwt_example/\npip install -r requirements.txt\npython manage.py makemigrations \u0026\u0026 python manage.py migrate\npython manage.py runserver 0.0.0.0:8000\n```\n\nIf you need superuser, run:\n\n```bash\npython manage.py createsuperuser\n```\n\n### Visit example frontend\n\nOpen browser and visit `localhost:8000`.\n\nThere are several url routes available in this example.\n\n```\n\napi/auth/google/ \u003c---- Google Login\napi/auth/google/session \u003c------ Google Login with Django Session\n\napi/ auth/microsoft/signin \u003c----- Microsoft Login with Django Session\napi/ auth/microsoft/signout \u003c----- Microsoft Logout\napi/ auth/microsoft/callback \u003c----- Microsoft Login Callback\n\napi/__hidden_admin/\napi/__hidden_dev_dashboard/\n\napi/auth/token [name='token_get']\napi/auth/token/refresh [name='token_refresh']\napi/auth/token/verify [name='token_verify']\n\n^api/__hidden_swagger(?P\u003cformat\u003e\\.json|\\.yaml)$ [name='schema-json']\n^api/__hidden_swagger/$ [name='schema-swagger-ui']\n^api/__hidden_redoc/$ [name='schema-redoc']\n\n```\n\n- Dev Dashboard\n\nIn the first, visit testing dashboard`http://localhost:8000/api/__hidden_dev_dashboard/`.\n\n![dashboard-no-login](https://i.imgur.com/yZoHxso_d.webp?maxwidth=760\u0026fidelity=grand)\n\nAnd, you can find Google Login in the top right corner like below.\n\n![google-login-min](https://developers.google.com/static/identity/gsi/web/images/personalized-button-single.png)\n\nClick it.\n\n![google-login](https://developers.google.com/static/identity/gsi/web/images/new-one-tap-ui.png)\n\nWhen you login, you will see the following hint.\n\n![dashboard-login](https://i.imgur.com/jyO1409.png)\n\nIf you want to filter domains with Google Login, feel free to check `VALID_REGISTER_DOMAINS` in `settings.py`.\n\nOnce you login with Google, your account ID will be recorded in the database.\n\n\u003e See more login information in `social_account` table in database.\n\n| id  | provider |     unique_id      | user_id |\n| :-: | :------: | :----------------: | :-----: |\n|  1  |  google  | 100056159912345678 |    1    |\n\n- Swagger\n\nAlso can see all information of APIs in `http://localhost:8000/api/__hidden_swagger/`.\n\n![swagger](https://i.imgur.com/ODtUseP.png)\n\n## More\n\nCheck https://developers.google.com/identity/gsi/web/guides/overview with more information of Google Login API.\n\n## Misc tools\n\n### Install \u0026 re-install package\n\n* Linux\n\n```bash\nbash dev-reinstall.sh\n```\n\n* Windows\n\n```powershell\n./dev-reinstall.ps1\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnatlee%2Fdjango-simple-3rd-party-jwt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnatlee%2Fdjango-simple-3rd-party-jwt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnatlee%2Fdjango-simple-3rd-party-jwt/lists"}