{"id":65192,"date":"2024-06-05T03:14:46","date_gmt":"2024-06-04T23:44:46","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/add-login-with-passkeys-to-your-django-app-20a5\/"},"modified":"2024-06-05T03:14:46","modified_gmt":"2024-06-04T23:44:46","slug":"add-login-with-passkeys-to-your-django-app-20a5","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/add-login-with-passkeys-to-your-django-app-20a5\/","title":{"rendered":"&#8220;\u0648\u0631\u0648\u062f \u0628\u0627 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631&#8221; \u0631\u0627 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u0646\u06af\u0648 \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f"},"content":{"rendered":"<div data-article-id=\"1877271\" id=\"article-body\">\n<p>\u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631\u060c \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631\u060c \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631!  \u0647\u0645\u0647 \u062f\u0631 \u0645\u0648\u0631\u062f \u0622\u0646\u0647\u0627 \u0635\u062d\u0628\u062a \u0645\u06cc \u06a9\u0646\u0646\u062f.  \u0628\u0627 \u0627\u0646\u062a\u0634\u0627\u0631 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0622\u0645\u0627\u0632\u0648\u0646 \u062f\u0631 \u0633\u0627\u0644 \u06af\u0630\u0634\u062a\u0647 \u0648 \u062a\u0634\u0648\u06cc\u0642 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u062a\u0648\u0633\u0637 \u06af\u0648\u06af\u0644 \u0628\u0647 \u062a\u0628\u062f\u06cc\u0644 \u0622\u0646\u0647\u0627 \u0628\u0647 \u0631\u0648\u0634 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u067e\u06cc\u0634 \u0641\u0631\u0636\u060c \u0627\u06cc\u0646 \u0633\u0648\u0627\u0644 \u0645\u0637\u0631\u062d \u0645\u06cc \u0634\u0648\u062f: \u0686\u06af\u0648\u0646\u0647 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645\u061f<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/add-login-with-passkeys-to-your-django-app-20a5\/#%DA%A9%D9%84%DB%8C%D8%AF%D9%87%D8%A7%DB%8C_%D8%B9%D8%A8%D9%88%D8%B1_%DA%86%DA%AF%D9%88%D9%86%D9%87_%DA%A9%D8%A7%D8%B1_%D9%85%DB%8C_%DA%A9%D9%86%D9%86%D8%AF%D8%9F\" >\u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631 \u0686\u06af\u0648\u0646\u0647 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u0646\u062f\u061f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/add-login-with-passkeys-to-your-django-app-20a5\/#%DA%86%DA%AF%D9%88%D9%86%D9%87_%D8%A2%D9%86_%D8%B1%D8%A7_%D8%AF%D8%B1_%D8%A2%D9%86_%D8%A8%D8%B3%D8%A7%D8%B2%D9%85%D8%9F\" >\u0686\u06af\u0648\u0646\u0647 \u0622\u0646 \u0631\u0627 \u062f\u0631 \u0622\u0646 \u0628\u0633\u0627\u0632\u0645\u061f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/add-login-with-passkeys-to-your-django-app-20a5\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%DB%8C%DA%A9_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%AC%D9%86%DA%AF%D9%88_%D8%AC%D8%AF%DB%8C%D8%AF_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF_%D9%88_%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C_%D9%87%D8%A7%DB%8C_%D9%85%D9%88%D8%B1%D8%AF_%D9%86%DB%8C%D8%A7%D8%B2_%D8%B1%D8%A7_%D9%86%D8%B5%D8%A8_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 1: \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u0646\u06af\u0648 \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f \u0648 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/add-login-with-passkeys-to-your-django-app-20a5\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_2_%DB%8C%DA%A9_%D8%AD%D8%B3%D8%A7%D8%A8_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%DB%8C_%D8%AF%D8%B1_pangeacloud_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 2: \u06cc\u06a9 \u062d\u0633\u0627\u0628 \u06a9\u0627\u0631\u0628\u0631\u06cc \u062f\u0631 pangea.cloud \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/add-login-with-passkeys-to-your-django-app-20a5\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_3_%D8%A7%D8%AC%D8%B2%D8%A7%DB%8C_Pangea_Auth_%D8%B1%D8%A7_%D8%A8%D9%87_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%AC%D8%AF%DB%8C%D8%AF_%D8%AC%D9%86%DA%AF%D9%88_%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 3: \u0627\u062c\u0632\u0627\u06cc Pangea Auth \u0631\u0627 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u062f\u06cc\u062f \u062c\u0646\u06af\u0648 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/add-login-with-passkeys-to-your-django-app-20a5\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_4_Redirect_%D8%B1%D8%A7_%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D9%86%DB%8C%D8%AF_%D9%88_%DA%A9%D9%84%DB%8C%D8%AF%D9%87%D8%A7%DB%8C_%D8%B9%D8%A8%D9%88%D8%B1_%D8%B1%D8%A7_%D8%AF%D8%B1_%DA%A9%D9%86%D8%B3%D9%88%D9%84_Pangea_%D9%81%D8%B9%D8%A7%D9%84_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 4: Redirect \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631 \u0631\u0627 \u062f\u0631 \u06a9\u0646\u0633\u0648\u0644 Pangea \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%DA%A9%D9%84%DB%8C%D8%AF%D9%87%D8%A7%DB%8C_%D8%B9%D8%A8%D9%88%D8%B1_%DA%86%DA%AF%D9%88%D9%86%D9%87_%DA%A9%D8%A7%D8%B1_%D9%85%DB%8C_%DA%A9%D9%86%D9%86%D8%AF%D8%9F\"><\/span>\n<p>  \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631 \u0686\u06af\u0648\u0646\u0647 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u0646\u062f\u061f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06af\u0631 \u0641\u0642\u0637 \u0628\u0647 \u0627\u062c\u0631\u0627\u06cc \u0622\u0646\u0647\u0627 \u0639\u0644\u0627\u0642\u0647 \u062f\u0627\u0631\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0627\u06cc\u0646 \u0628\u062e\u0634 \u0635\u0631\u0641 \u0646\u0638\u0631 \u06a9\u0646\u06cc\u062f.  \u062a\u0648\u0647\u06cc\u0646 \u0646\u0634\u062f\u0647 \ud83d\ude09<\/p>\n<p>\u0627\u0639\u062a\u0628\u0627\u0631 \u0686\u0646\u062f \u062f\u0633\u062a\u06af\u0627\u0647\u06cc FIDO2 \u06a9\u0647 \u0627\u063a\u0644\u0628 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 &#8220;\u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631&#8221; \u0634\u0646\u0627\u062e\u062a\u0647 \u0645\u06cc \u0634\u0648\u062f \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062a\u0648\u0633\u0637 \u0627\u062a\u062d\u0627\u062f FIDO \u0645\u0639\u0631\u0641\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a.  \u0627\u06cc\u0646 \u06cc\u06a9 \u0631\u0648\u0634 \u0628\u0633\u06cc\u0627\u0631 \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u06a9\u0644\u06cc\u062f \u0639\u0645\u0648\u0645\u06cc \u0628\u0631\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u0647\u0648\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0628\u062f\u0648\u0646 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631\u060c \u0686\u0646\u062f \u0639\u0627\u0645\u0644\u06cc \u0648 \u063a\u06cc\u0631\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u06a9\u0633\u0628 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631 \u0645\u0648\u0631\u062f \u0646\u062d\u0648\u0647 \u0639\u0645\u0644\u06a9\u0631\u062f \u062f\u0642\u06cc\u0642 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631 \u0648 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a\u060c \u0645\u0642\u0627\u0644\u0647 Secure By Design Hub \u062f\u0631 \u0645\u0648\u0631\u062f \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%DA%86%DA%AF%D9%88%D9%86%D9%87_%D8%A2%D9%86_%D8%B1%D8%A7_%D8%AF%D8%B1_%D8%A2%D9%86_%D8%A8%D8%B3%D8%A7%D8%B2%D9%85%D8%9F\"><\/span>\n<p>  \u0686\u06af\u0648\u0646\u0647 \u0622\u0646 \u0631\u0627 \u062f\u0631 \u0622\u0646 \u0628\u0633\u0627\u0632\u0645\u061f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u0645 \u0627\u0632 \u0635\u0641\u062d\u0627\u062a \u0645\u06cc\u0632\u0628\u0627\u0646\u06cc \u0634\u062f\u0647 Pangea AuthN \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u06cc\u0645 \u0628\u0647 \u0633\u0631\u0639\u062a \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631 \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0628\u062f\u0648\u0646 \u0627\u06cc\u0646\u06a9\u0647 \u062a\u0645\u0627\u0645 \u0645\u0634\u06a9\u0644\u0627\u062a \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u0631\u0627 \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645.  \u0628\u0631\u0627\u06cc \u0627\u062b\u0628\u0627\u062a \u0627\u06cc\u0646\u06a9\u0647 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631 \u0628\u0647 \u0647\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u06cc \u062f\u0631 \u0686\u0646\u062f \u062f\u0642\u06cc\u0642\u0647 \u0622\u0633\u0627\u0646 \u0627\u0633\u062a\u060c \u0645\u06cc \u062e\u0648\u0627\u0647\u0645 \u0628\u0627 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u062f\u06cc\u062f \u062c\u0646\u06af\u0648 \u0634\u0631\u0648\u0639 \u06a9\u0646\u0645 \u0648 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631 \u0631\u0627 \u062a\u0646\u0647\u0627 \u062f\u0631 \u0686\u0646\u062f \u0645\u0631\u062d\u0644\u0647 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u0645.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%DB%8C%DA%A9_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%AC%D9%86%DA%AF%D9%88_%D8%AC%D8%AF%DB%8C%D8%AF_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF_%D9%88_%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C_%D9%87%D8%A7%DB%8C_%D9%85%D9%88%D8%B1%D8%AF_%D9%86%DB%8C%D8%A7%D8%B2_%D8%B1%D8%A7_%D9%86%D8%B5%D8%A8_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 1: \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u0646\u06af\u0648 \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f \u0648 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>python <span class=\"nt\">-m<\/span> pip <span class=\"nb\">install <\/span>django\ndjango-admin startproject mysite\n<span class=\"nb\">cd <\/span>mysite\npython manage.py startapp authme\npip <span class=\"nb\">install <\/span>python-dotenv pangea-django\npython manage.py migrate\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0631\u0648\u06cc\u0645 \u0628\u0647 <code>mysite\/mysite\/settings.py<\/code> \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u0627\u0632 \u0627\u06cc\u0646 \u0628\u0633\u062a\u0647 \u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u062f.<\/p>\n<p>\u0645\u0627 \u0628\u0627\u06cc\u062f \u0628\u062a\u0648\u0627\u0646\u06cc\u0645:<\/p>\n<ol>\n<li>\n<p>\u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc a <code>.env<\/code> \u0641\u0627\u06cc\u0644<\/p>\n<\/li>\n<li>\n<p>\u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 <code>pangea-django<\/code> \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631<\/p>\n<\/li>\n<li>\n<p>\u0635\u0641\u062d\u0627\u062a HTML \u0645\u0627 \u0631\u0627 \u0627\u0632 \u06cc\u06a9 \u0645\u06a9\u0627\u0646 \u0645\u0634\u062e\u0635 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u06a9\u0646\u06cc\u062f <code>templates<\/code> \u067e\u0648\u0634\u0647<\/p>\n<\/li>\n<\/ol>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"kn\">from<\/span> <span class=\"n\">dotenv<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">load_dotenv<\/span>\n<span class=\"kn\">import<\/span> <span class=\"n\">os<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">pathlib<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Path<\/span>\n\n<span class=\"nf\">load_dotenv<\/span><span class=\"p\">()<\/span>\n\n<span class=\"c1\"># Skip down to the middlware declaration. \n# Comment or remove the default django middleware. \n# Add Pangea's Auth Middleware\n<\/span>\n<span class=\"n\">MIDDLEWARE<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\n    <span class=\"sh\">\"<\/span><span class=\"s\">django.middleware.security.SecurityMiddleware<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n    <span class=\"sh\">\"<\/span><span class=\"s\">django.contrib.sessions.middleware.SessionMiddleware<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n    <span class=\"sh\">\"<\/span><span class=\"s\">django.middleware.common.CommonMiddleware<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n    <span class=\"sh\">\"<\/span><span class=\"s\">django.middleware.csrf.CsrfViewMiddleware<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n    <span class=\"c1\">#\"django.contrib.auth.middleware.AuthenticationMiddleware\",\n<\/span>    <span class=\"sh\">\"<\/span><span class=\"s\">pangea_django.PangeaAuthMiddleware<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n    <span class=\"sh\">\"<\/span><span class=\"s\">django.contrib.messages.middleware.MessageMiddleware<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n    <span class=\"sh\">\"<\/span><span class=\"s\">django.middleware.clickjacking.XFrameOptionsMiddleware<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">]<\/span>\n\n<span class=\"c1\"># Replace the default configuration with the templates below\n# templates folder is where we will keep our html\n<\/span>\n<span class=\"n\">TEMPLATES<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"sh\">\"<\/span><span class=\"s\">BACKEND<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">django.template.backends.django.DjangoTemplates<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"sh\">\"<\/span><span class=\"s\">DIRS<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"nf\">join<\/span><span class=\"p\">(<\/span><span class=\"n\">BASE_DIR<\/span><span class=\"p\">,<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">templates<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)],<\/span>\n        <span class=\"sh\">\"<\/span><span class=\"s\">APP_DIRS<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"bp\">True<\/span><span class=\"p\">,<\/span>\n        <span class=\"sh\">\"<\/span><span class=\"s\">OPTIONS<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n            <span class=\"sh\">\"<\/span><span class=\"s\">context_processors<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n                <span class=\"sh\">\"<\/span><span class=\"s\">django.template.context_processors.debug<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n                <span class=\"sh\">\"<\/span><span class=\"s\">django.template.context_processors.request<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n                <span class=\"sh\">\"<\/span><span class=\"s\">django.contrib.auth.context_processors.auth<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n                <span class=\"sh\">\"<\/span><span class=\"s\">django.contrib.messages.context_processors.messages<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n            <span class=\"p\">],<\/span>\n        <span class=\"p\">},<\/span>\n    <span class=\"p\">},<\/span>\n<span class=\"p\">]<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_2_%DB%8C%DA%A9_%D8%AD%D8%B3%D8%A7%D8%A8_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%DB%8C_%D8%AF%D8%B1_pangeacloud_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 2: \u06cc\u06a9 \u062d\u0633\u0627\u0628 \u06a9\u0627\u0631\u0628\u0631\u06cc \u062f\u0631 pangea.cloud \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0647 pangea.cloud \u0628\u0631\u0648\u06cc\u062f \u0648 \u06cc\u06a9 \u062d\u0633\u0627\u0628 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0631\u0627\u06cc\u06af\u0627\u0646 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.  \u0633\u067e\u0633 \u062f\u0631 \u06a9\u0646\u0633\u0648\u0644 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647\u060c \u0633\u0631\u0648\u06cc\u0633 &#8220;AuthN&#8221; \u0631\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f \u0648 \u062a\u0648\u06a9\u0646 \u0647\u0627\u06cc \u0632\u06cc\u0631 \u0631\u0627 \u0628\u06af\u06cc\u0631\u06cc\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u0646\u0634\u0627\u0646\u0647\u200c\u0647\u0627 \u062f\u0631 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc .env \u0634\u0645\u0627 \u0645\u0627\u0646\u0646\u062f \u0634\u06a9\u0644 \u0632\u06cc\u0631 \u062c\u0627\u06cc\u200c\u06af\u0630\u0627\u0631\u06cc \u0645\u06cc\u200c\u0634\u0648\u0646\u062f.  \u0627\u06cc\u0646 \u0646\u0634\u0627\u0646\u0647 \u0647\u0627 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0648 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>mysite\/.env<\/code> \u0641\u0627\u06cc\u0644 \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nv\">PANGEA_AUTHN_TOKEN<\/span><span class=\"o\">=<\/span><pangea_authn_token>\n<span class=\"nv\">PANGEA_DOMAIN<\/span><span class=\"o\">=<\/span><pangea_domain>\n<span class=\"nv\">PANGEA_HOSTED_LOGIN<\/span><span class=\"o\">=<\/span><pangea_hosted_login>\n<\/pangea_hosted_login><\/pangea_domain><\/pangea_authn_token><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_3_%D8%A7%D8%AC%D8%B2%D8%A7%DB%8C_Pangea_Auth_%D8%B1%D8%A7_%D8%A8%D9%87_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%AC%D8%AF%DB%8C%D8%AF_%D8%AC%D9%86%DA%AF%D9%88_%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 3: \u0627\u062c\u0632\u0627\u06cc Pangea Auth \u0631\u0627 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u062f\u06cc\u062f \u062c\u0646\u06af\u0648 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u0627 \u062e\u0648\u062f \u0631\u0627 \u0648\u06cc\u0631\u0627\u06cc\u0634 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>mysite\/authme\/views.py<\/code> \u0641\u0627\u06cc\u0644 \u0628\u0627 <code>pangea_django<\/code> \u0628\u0633\u062a\u0647 \u0627\u06cc \u06a9\u0647 \u0632\u0645\u06cc\u0646\u0647 \u0648 \u0648\u0636\u0639\u06cc\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0631\u0627 \u062f\u0631 \u0633\u0631\u0627\u0633\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062d\u0641\u0638 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u067e\u0633 \u0645\u0627 <code>authme\/views.py<\/code> \u0641\u0627\u06cc\u0644 \u0628\u0627\u06cc\u062f \u0628\u0647 \u0634\u06a9\u0644 \u0632\u06cc\u0631 \u0628\u0627\u0634\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"kn\">from<\/span> <span class=\"n\">django.shortcuts<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">render<\/span><span class=\"p\">,<\/span> <span class=\"n\">redirect<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">django.contrib.auth.decorators<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">login_required<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">pangea_django<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">PangeaAuthentication<\/span><span class=\"p\">,<\/span> <span class=\"n\">generate_state_param<\/span>\n<span class=\"kn\">import<\/span> <span class=\"n\">os<\/span>\n\n<span class=\"c1\"># Create your views here.\n<\/span>\n<span class=\"k\">def<\/span> <span class=\"nf\">landing<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">request<\/span><span class=\"p\">.<\/span><span class=\"n\">user<\/span><span class=\"p\">.<\/span><span class=\"n\">is_authenticated<\/span><span class=\"p\">:<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nf\">redirect<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">\/home<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">hosted_login<\/span> <span class=\"o\">=<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"nf\">getenv<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">PANGEA_HOSTED_LOGIN<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">redirect_url<\/span> <span class=\"o\">=<\/span> <span class=\"n\">hosted_login<\/span> <span class=\"o\">+<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">?state=<\/span><span class=\"sh\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nf\">generate_state_param<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"nf\">redirect<\/span><span class=\"p\">(<\/span><span class=\"n\">redirect_url<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">def<\/span> <span class=\"nf\">login_success<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">PangeaAuthentication<\/span><span class=\"p\">().<\/span><span class=\"nf\">authenticate<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"o\">=<\/span><span class=\"n\">request<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">user<\/span><span class=\"p\">:<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nf\">redirect<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">\/home<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nf\">redirect<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">\/<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n\n<span class=\"nd\">@login_required<\/span><span class=\"p\">(<\/span><span class=\"n\">login_url<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">\/<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">def<\/span> <span class=\"nf\">logout<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">PangeaAuthentication<\/span><span class=\"p\">().<\/span><span class=\"nf\">logout<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nf\">redirect<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">\/logout<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n\n<span class=\"nd\">@login_required<\/span><span class=\"p\">(<\/span><span class=\"n\">login_url<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">\/<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">def<\/span> <span class=\"nf\">home<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">context<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{}<\/span>\n    <span class=\"n\">context<\/span><span class=\"p\">[<\/span><span class=\"sh\">\"<\/span><span class=\"s\">user<\/span><span class=\"sh\">\"<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">request<\/span><span class=\"p\">.<\/span><span class=\"n\">user<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nf\">render<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"p\">,<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">home.html<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">context<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0639\u062f \u0628\u0627\u06cc\u062f \u0627\u06cc\u0646 \u0646\u0645\u0627\u0647\u0627 \u0631\u0627 \u0628\u0647 \u0645\u0633\u06cc\u0631\u0647\u0627 \u062a\u0631\u0633\u06cc\u0645 \u06a9\u0646\u06cc\u0645.  \u0645\u0627 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u062f\u0631 <code>mysite\/mysite\/urls.py<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"kn\">from<\/span> <span class=\"n\">django.urls<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">path<\/span>\n<span class=\"kn\">import<\/span> <span class=\"n\">authme<\/span>\n\n<span class=\"n\">urlpatterns<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\n    <span class=\"nf\">path<\/span><span class=\"p\">(<\/span><span class=\"sh\">''<\/span><span class=\"p\">,<\/span> <span class=\"n\">authme<\/span><span class=\"p\">.<\/span><span class=\"n\">views<\/span><span class=\"p\">.<\/span><span class=\"n\">landing<\/span><span class=\"p\">),<\/span>\n    <span class=\"nf\">path<\/span><span class=\"p\">(<\/span><span class=\"sh\">'<\/span><span class=\"s\">home<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span> <span class=\"n\">authme<\/span><span class=\"p\">.<\/span><span class=\"n\">views<\/span><span class=\"p\">.<\/span><span class=\"n\">home<\/span><span class=\"p\">),<\/span>\n    <span class=\"nf\">path<\/span><span class=\"p\">(<\/span><span class=\"sh\">'<\/span><span class=\"s\">login_success<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span> <span class=\"n\">authme<\/span><span class=\"p\">.<\/span><span class=\"n\">views<\/span><span class=\"p\">.<\/span><span class=\"n\">login_success<\/span><span class=\"p\">),<\/span>\n    <span class=\"nf\">path<\/span><span class=\"p\">(<\/span><span class=\"sh\">'<\/span><span class=\"s\">logout<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span> <span class=\"n\">authme<\/span><span class=\"p\">.<\/span><span class=\"n\">views<\/span><span class=\"p\">.<\/span><span class=\"n\">logout<\/span><span class=\"p\">),<\/span>\n<span class=\"p\">]<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627\u06cc\u062f \u0628\u062a\u0648\u0627\u0646\u062f \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f <code>mysite\/authme\/views.py<\/code> \u0627\u0632 \u062c\u0627\u0646\u0628 <code>mysite\/mysite\/urls.py<\/code>.  \u0627\u06cc\u0646 \u062e\u0637 \u0631\u0627 \u0628\u0647 <code>mysite\/authme\/__init__.py<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"kn\">from<\/span> <span class=\"n\">.<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">views<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u0645\u0627 \u0628\u0647 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645 \u062a\u0627 \u0627\u06cc\u0646 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0628\u0647 \u0622\u0646 \u0631\u0646\u062f\u0631 \u0634\u0648\u062f.  \u0631\u0648\u0634\u06cc \u06a9\u0647 \u0645\u0627 \u062f\u0631 \u062c\u0646\u06af\u0648 \u0635\u0641\u062d\u0627\u062a \u0645\u06cc \u0633\u0627\u0632\u06cc\u0645 \u0628\u0627 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u067e\u0648\u0634\u0647 templates \u0628\u0627 \u0635\u0641\u062d\u0627\u062a html \u0627\u0633\u062a.  \u0627\u0632 \u0622\u0646\u062c\u0627 \u06a9\u0647 <code>authme.view.home<\/code> \u062f\u0631 \u062d\u0627\u0644 \u0645\u0633\u06cc\u0631\u06cc\u0627\u0628\u06cc \u0628\u0647 <code><base url=\"\"\/>\/home<\/code>\u060c \u0628\u0627\u06cc\u062f \u0628\u0627 \u0635\u0641\u062d\u0647 \u062e\u0648\u062f \u062a\u0645\u0627\u0633 \u0628\u06af\u06cc\u0631\u06cc\u0645 <code>mysite\/templates\/home.html<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight xml\"><code><span class=\"cp\"\/>\n<span class=\"nt\"\/>\n<span class=\"nt\"\/>\n<span class=\"nt\"><meta\/> <span class=\"na\">charset=<\/span><span class=\"s\">\"UTF-8\"<\/span><span class=\"nt\">&gt;<\/span>\n<span class=\"nt\"><meta\/> <span class=\"na\">name=<\/span><span class=\"s\">\"viewport\"<\/span> <span class=\"na\">content=<\/span><span class=\"s\">\"width=device-width, initial-scale=1\"<\/span><span class=\"nt\">&gt;<\/span>\n<span class=\"nt\"\/>\nbody,h1,h2,h3,h4,h5,h6 {font-family: \"Lato\", sans-serif;}\nbody, html {\n  height: 100%;\n  color: #b47b00;\n  line-height: 1.8;\n  background-color: antiquewhite;\n}\ntable {\n  margin: 0px auto;\n  background-color: white;\n  padding: 25px;\n}\ntr {\n  font-family: Verdana, Tahoma, sans-serif;\n  font-size: 20px;\n  color: #rgb(158, 108, 0);\n}\ntd {\n  padding: 2px;\n}\n<span class=\"nt\"\/>\n<span class=\"nt\"\/>\n<span class=\"nt\"\/>\n  <span class=\"c\"><!-- Navbar (sit on top) --><\/span>\n  <span class=\"nt\"\/>\n  <span class=\"c\"><!-- Navbar (sit on top) --><\/span>\n  <span class=\"nt\"\/>\n    <span class=\"nt\"><table>\n        <span class=\"nt\"><tr>\n            <span class=\"nt\"\/><td>ID:<span class=\"nt\"\/><\/td>\n            <span class=\"nt\"\/><td>{{ user.id }}<span class=\"nt\"\/><\/td>\n        <span class=\"nt\"\/><\/tr><\/span>\n        <span class=\"nt\"><tr>\n            <span class=\"nt\"\/><td>Email:<span class=\"nt\"\/><\/td>\n            <span class=\"nt\"\/><td>{{ user.email }}<span class=\"nt\"\/><\/td>\n        <span class=\"nt\"\/><\/tr><\/span>\n        <span class=\"nt\"><tr>\n            <span class=\"nt\"\/><td>First Name:<span class=\"nt\"\/><\/td>\n            <span class=\"nt\"\/><td>{{ user.first_name }}<span class=\"nt\"\/><\/td>\n        <span class=\"nt\"\/><\/tr><\/span>\n        <span class=\"nt\"><tr>\n          <span class=\"nt\"\/><td>Last Name:<span class=\"nt\"\/><\/td>\n          <span class=\"nt\"\/><td>{{ user.last_name }}<span class=\"nt\"\/><\/td>\n        <span class=\"nt\"\/><\/tr><\/span>\n        <span class=\"nt\"><tr>\n          <span class=\"nt\"\/><td>Last Login:<span class=\"nt\"\/><\/td>\n          <span class=\"nt\"\/><td>{{ user.last_login }}<span class=\"nt\"\/><\/td>\n        <span class=\"nt\"\/><\/tr><\/span>\n    <span class=\"nt\"\/><\/table><\/span>\n<span class=\"nt\"\/>\n<span class=\"nt\"\/>\n<\/span><\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_4_Redirect_%D8%B1%D8%A7_%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D9%86%DB%8C%D8%AF_%D9%88_%DA%A9%D9%84%DB%8C%D8%AF%D9%87%D8%A7%DB%8C_%D8%B9%D8%A8%D9%88%D8%B1_%D8%B1%D8%A7_%D8%AF%D8%B1_%DA%A9%D9%86%D8%B3%D9%88%D9%84_Pangea_%D9%81%D8%B9%D8%A7%D9%84_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 4: Redirect \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631 \u0631\u0627 \u062f\u0631 \u06a9\u0646\u0633\u0648\u0644 Pangea \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0645\u0627 \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u0633\u06cc\u0631 \u0645\u062c\u0627\u0632 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645\u060c \u062a\u0627 \u0635\u0641\u062d\u0627\u062a \u0645\u06cc\u0632\u0628\u0627\u0646\u06cc \u0634\u062f\u0647 AuthN Pangea \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u0645\u0627 \u0631\u0627 \u0628\u0647 http:\/\/127.0.0.1:8000\/home \u0647\u062f\u0627\u06cc\u062a \u06a9\u0646\u0646\u062f\u060c \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0646\u062c\u0627\u0645 \u0634\u062f.<\/p>\n<p>\u067e\u0633 \u0627\u0628\u062a\u062f\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0647 \u0632\u06cc\u0631 \u0628\u0631\u0648\u06cc\u0645 <code>General &gt; Redirect (Callback) Settings<\/code> \u0648 http:\/\/127.0.0.1:8000\/home \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u0633\u06cc\u0631 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0622\u062e\u0631\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647 \u0641\u0631\u0627 \u0645\u06cc \u0631\u0633\u062f\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f Passkeys \u0631\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u0645!  \u0633\u0631 \u0628\u0647 <code>Single Sign On &gt; Passkeys<\/code> \u0648 \u0622\u0646 \u0631\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f.  \u0628\u0647 \u0635\u0648\u0631\u062a \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u06af\u0632\u06cc\u0646\u0647\u200c\u0647\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0645\u062c\u062f\u062f \u0628\u0631 \u0627\u0633\u0627\u0633 \u062a\u062c\u0631\u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0645\u0648\u0631\u062f \u0646\u0638\u0631\u062a\u0627\u0646 \u0641\u0639\u0627\u0644 \u0634\u0648\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u06cc\u06a9 \u0648\u06cc\u062f\u06cc\u0648\u06cc \u0633\u0631\u06cc\u0639 \u062f\u0631 \u0645\u0648\u0631\u062f \u0646\u062d\u0648\u0647 \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0622\u0646 \u062f\u0631 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f:<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u06cc\u0645!  \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u062f \u0631\u0627 \u062f\u0631 Github \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f \u0648 \u0646\u0633\u062e\u0647 \u06cc \u0646\u0645\u0627\u06cc\u0634\u06cc \u0631\u0627 \u062f\u0631 \u0632\u06cc\u0631 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<hr\/>\n<p>\u0627\u06af\u0631 \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 AuthN \u0628\u0647 \u0633\u0627\u06cc\u0631 \u0632\u0628\u0627\u0646 \u0647\u0627 \u06cc\u0627 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u0647\u0627 \u0647\u0633\u062a\u06cc\u062f\u060c \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0647\u0627 \u0631\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u06cc\u062f:<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631\u060c \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631\u060c \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631! \u0647\u0645\u0647 \u062f\u0631 \u0645\u0648\u0631\u062f \u0622\u0646\u0647\u0627 \u0635\u062d\u0628\u062a \u0645\u06cc \u06a9\u0646\u0646\u062f. \u0628\u0627 \u0627\u0646\u062a\u0634\u0627\u0631 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0622\u0645\u0627\u0632\u0648\u0646 \u062f\u0631 \u0633\u0627\u0644 \u06af\u0630\u0634\u062a\u0647 \u0648 \u062a\u0634\u0648\u06cc\u0642 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u062a\u0648\u0633\u0637 \u06af\u0648\u06af\u0644 \u0628\u0647 \u062a\u0628\u062f\u06cc\u0644 \u0622\u0646\u0647\u0627 \u0628\u0647 \u0631\u0648\u0634 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u067e\u06cc\u0634 \u0641\u0631\u0636\u060c \u0627\u06cc\u0646 \u0633\u0648\u0627\u0644 \u0645\u0637\u0631\u062d \u0645\u06cc \u0634\u0648\u062f: \u0686\u06af\u0648\u0646\u0647 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645\u061f \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0639\u0628\u0648\u0631 \u0686\u06af\u0648\u0646\u0647 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u0646\u062f\u061f \u0627\u06af\u0631 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":65193,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-65192","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/65192","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=65192"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/65192\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/65193"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=65192"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=65192"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=65192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}