{"id":74125,"date":"2024-08-20T16:42:57","date_gmt":"2024-08-20T13:12:57","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/"},"modified":"2024-08-20T16:42:57","modified_gmt":"2024-08-20T13:12:57","slug":"%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/","title":{"rendered":"\u0686\u06af\u0648\u0646\u0647 Auth \u0631\u0627 \u0628\u0627 \u0644\u0648\u0633\u06cc\u0627 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 React\/Next.js \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f &#8211; \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645"},"content":{"rendered":"<p><\/p>\n<div data-article-id=\"1965872\" id=\"article-body\">\n<p>\u0627\u06af\u0631\u0686\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06cc\u06a9\u06cc \u0627\u0632 \u0645\u062a\u062f\u0627\u0648\u0644\u200c\u062a\u0631\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u0631\u0627\u0647\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641\u06cc \u0628\u0631\u0627\u06cc \u0627\u0646\u062c\u0627\u0645 \u0622\u0646 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u06a9\u0627\u0631 \u0628\u0633\u06cc\u0627\u0631 \u0628\u06cc\u200c\u0627\u0647\u0645\u06cc\u062a \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u067e\u0633\u062a\u060c \u0645\u0646 \u062a\u062c\u0631\u0628\u0647 \u0634\u062e\u0635\u06cc \u062e\u0648\u062f \u0631\u0627 \u0627\u0632 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0644\u0648\u0633\u06cc\u0627 \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0645\u06cc\u200c\u06af\u0630\u0627\u0631\u0645 &#8211; \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0645\u062f\u0631\u0646\u060c \u0686\u0627\u0631\u0686\u0648\u0628-\u0622\u06af\u0646\u0648\u0633\u062a\u06cc\u06a9 \u06a9\u0647 \u062f\u0631 \u0645\u0627\u0647\u200c\u0647\u0627\u06cc \u0627\u062e\u06cc\u0631 \u0645\u0648\u0631\u062f \u0639\u0644\u0627\u0642\u0647 \u0632\u06cc\u0627\u062f\u06cc \u0627\u0632 \u0633\u0648\u06cc \u062c\u0627\u0645\u0639\u0647 \u0642\u0631\u0627\u0631 \u06af\u0631\u0641\u062a\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627\u060c \u0645\u0646 \u0646\u0634\u0627\u0646 \u062e\u0648\u0627\u0647\u0645 \u062f\u0627\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0646 \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 Next.js \u062e\u0648\u062f \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645\u06cc \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u06cc\u062f\u060c \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0628\u0647 \u0645\u0642\u062f\u0627\u0631 \u0645\u0646\u0627\u0633\u0628\u06cc \u0627\u0632 \u06a9\u062f \u0648 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f\u060c \u0627\u0645\u0627 \u0627\u06cc\u0646 \u0641\u0631\u0622\u06cc\u0646\u062f \u0628\u0647 \u062e\u0648\u062f\u06cc \u062e\u0648\u062f \u06a9\u0627\u0645\u0644\u0627\u064b \u0633\u0627\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u062b\u0627\u0646\u06cc\u0627\u064b\u060c \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u06cc\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0628\u0627 Wasp \u062a\u0646\u0647\u0627 \u062f\u0631 \u0686\u0646\u062f \u062e\u0637 \u06a9\u062f \u0628\u0647 \u0647\u0645\u06cc\u0646 \u0646\u062a\u06cc\u062c\u0647 \u0628\u0631\u0633\u06cc\u0645. Wasp \u06cc\u06a9 \u0641\u0631\u06cc\u0645\u0648\u0631\u06a9 \u06a9\u0627\u0645\u0644 \u067e\u0634\u062a\u0647\u200c\u0627\u06cc \u0628\u0627 \u0628\u0627\u062a\u0631\u06cc\u200c\u0647\u0627 \u0628\u0631\u0627\u06cc React &#038; Node.js \u0627\u0633\u062a \u06a9\u0647 \u0627\u0632 Lucia \u062f\u0631 \u0632\u06cc\u0631 \u0647\u0648\u062f \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0628\u0647 \u0637\u0648\u0631 \u06a9\u0627\u0645\u0644 \u0628\u0631 \u0631\u0648\u06cc \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0634\u0645\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u0634\u0648\u062f \u0648 100\u066a \u0645\u0646\u0628\u0639 \u0628\u0627\u0632 \u0648 \u0631\u0627\u06cc\u06af\u0627\u0646 \u0627\u0633\u062a.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb2qpg6praoxnbfreg2k5.png\" alt=\"Wasp Auth\" loading=\"lazy\" width=\"612\" height=\"680\" title=\"\"><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 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\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%DA%86%D8%B1%D8%A7_%D9%84%D9%88%D8%B3%DB%8C%D8%A7%D8%9F\" >\u0686\u0631\u0627 \u0644\u0648\u0633\u06cc\u0627\u061f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_Nextjs\" >\u0645\u0631\u062d\u0644\u0647 1: \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Next.js<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_2_%D9%84%D9%88%D8%B3%DB%8C%D8%A7_%D8%B1%D8%A7_%D9%86%D8%B5%D8%A8_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 2: \u0644\u0648\u0633\u06cc\u0627 \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\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_3_%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2_%D9%87%D9%88%DB%8C%D8%AA_%D8%B1%D8%A7_%D8%AA%D9%86%D8%B8%DB%8C%D9%85_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 3: \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \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\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_4_%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1_%D8%A8%D9%87_DB\" >\u0645\u0631\u062d\u0644\u0647 4: \u0627\u0641\u0632\u0648\u062f\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 DB<\/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\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_5_%D9%88%D8%B1%D9%88%D8%AF_%D9%88_%D8%AB%D8%A8%D8%AA_%D9%86%D8%A7%D9%85_%D8%B1%D8%A7_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 5: \u0648\u0631\u0648\u062f \u0648 \u062b\u0628\u062a \u0646\u0627\u0645 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \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-7\" href=\"https:\/\/nabfollower.com\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_6_%D9%85%D8%AD%D8%A7%D9%81%D8%B8%D8%AA_%D8%A7%D8%B2_%D9%85%D8%B3%DB%8C%D8%B1%D9%87%D8%A7\" >\u0645\u0631\u062d\u0644\u0647 6: \u0645\u062d\u0627\u0641\u0638\u062a \u0627\u0632 \u0645\u0633\u06cc\u0631\u0647\u0627<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_Wasp\" >\u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc Wasp<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%DB%8C%DA%A9_%D9%BE%D8%B1%D9%88%DA%98%D9%87_Wasp_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 1: \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 Wasp \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-10\" href=\"https:\/\/nabfollower.com\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_2_%D9%85%D9%88%D8%AC%D9%88%D8%AF%DB%8C%D8%AA_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1_%D8%B1%D8%A7_%D8%A8%D9%87_DB_%D8%AE%D9%88%D8%AF_%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 2: \u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0647 DB \u062e\u0648\u062f \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-11\" href=\"https:\/\/nabfollower.com\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_3_%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2_%D9%87%D9%88%DB%8C%D8%AA_%D8%B1%D8%A7_%D8%AA%D8%B9%D8%B1%DB%8C%D9%81_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 3: \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \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-12\" href=\"https:\/\/nabfollower.com\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_4_%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D9%88_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_GitHub_OAuth_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A7%D8%AC%D8%B1%D8%A7_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 4: \u0627\u0639\u062a\u0628\u0627\u0631\u0646\u0627\u0645\u0647 \u0648 \u0628\u0631\u0646\u0627\u0645\u0647 GitHub OAuth \u062e\u0648\u062f \u0631\u0627 \u0627\u062c\u0631\u0627 \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-13\" href=\"https:\/\/nabfollower.com\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_5_%D9%85%D8%B3%DB%8C%D8%B1%D9%87%D8%A7_%D9%88_%D8%B5%D9%81%D8%AD%D8%A7%D8%AA_%D8%B1%D8%A7_%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 5: \u0645\u0633\u06cc\u0631\u0647\u0627 \u0648 \u0635\u0641\u062d\u0627\u062a \u0631\u0627 \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-14\" href=\"https:\/\/nabfollower.com\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C_%DA%A9%D8%B1%D8%AF%D9%86_Wasp_Auth\" >\u0633\u0641\u0627\u0631\u0634\u06cc \u06a9\u0631\u062f\u0646 Wasp Auth<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/nabfollower.com\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%D8%A8%D8%AE%D8%B4_%D9%BE%D8%A7%D8%AF%D8%A7%D8%B4_%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86_%D9%88%D8%B1%D9%88%D8%AF_%D8%A8%D9%87_%D8%A7%DB%8C%D9%85%DB%8C%D9%84_%D8%B1%D9%85%D8%B2_%D8%B9%D8%A8%D9%88%D8%B1_%D8%A8%D8%A7_Wasp_%D9%88_%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C_%DA%A9%D8%B1%D8%AF%D9%86_Auth\" >\u0628\u062e\u0634 \u067e\u0627\u062f\u0627\u0634: \u0627\u0641\u0632\u0648\u062f\u0646 \u0648\u0631\u0648\u062f \u0628\u0647 \u0627\u06cc\u0645\u06cc\u0644 \/ \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0628\u0627 Wasp \u0648 \u0633\u0641\u0627\u0631\u0634\u06cc \u06a9\u0631\u062f\u0646 Auth<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/nabfollower.com\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%D8%A2%DB%8C%D8%A7_%D9%85%DB%8C_%D8%AA%D9%88%D8%A7%D9%86%DB%8C%D8%AF_%D8%AD%D9%85%D8%A7%DB%8C%D8%AA_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A8%D9%87_%D9%85%D8%A7_%D9%86%D8%B4%D8%A7%D9%86_%D8%AF%D9%87%DB%8C%D8%AF%D8%9F\" >\u0622\u06cc\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062d\u0645\u0627\u06cc\u062a \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0645\u0627 \u0646\u0634\u0627\u0646 \u062f\u0647\u06cc\u062f\u061f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/nabfollower.com\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-auth-%d8%b1%d8%a7-%d8%a8%d8%a7-%d9%84%d9%88%d8%b3%db%8c%d8%a7-%d8%a8%d9%87-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-react-next-js-%d8%ae%d9%88%d8%af-%d8%a7%d8%b6%d8%a7%d9%81\/#%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\" >\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%DA%86%D8%B1%D8%A7_%D9%84%D9%88%D8%B3%DB%8C%D8%A7%D8%9F\"><\/span>\n<p>  \u0686\u0631\u0627 \u0644\u0648\u0633\u06cc\u0627\u061f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u0646\u0648\u0628\u062a \u0628\u0647 \u0627\u0641\u0632\u0648\u062f\u0646 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0634\u0645\u0627 \u0645\u06cc \u0631\u0633\u062f\u060c \u0686\u0646\u062f\u06cc\u0646 \u0631\u0627\u0647 \u062d\u0644 \u0645\u062d\u0628\u0648\u0628 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c Clerk \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 \u067e\u0648\u0644\u06cc \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 NextAuth.js \u06cc\u06a9 \u0631\u0627\u0647 \u062d\u0644 \u0645\u0646\u0628\u0639 \u0628\u0627\u0632 \u062f\u0631 \u06a9\u0646\u0627\u0631 \u0644\u0648\u0633\u06cc\u0627 \u0627\u0633\u062a \u06a9\u0647 \u0627\u062e\u06cc\u0631\u0627\u064b \u0628\u0633\u06cc\u0627\u0631 \u0645\u062d\u0628\u0648\u0628 \u0634\u062f\u0647 \u0627\u0633\u062a. <\/p>\n<p>\u0627\u06cc\u0646 \u0627\u0628\u0632\u0627\u0631\u0647\u0627 \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\u06cc \u0642\u0648\u06cc \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f\u060c \u0627\u0645\u0627 \u062a\u0639\u0647\u062f \u0628\u0647 \u062e\u062f\u0645\u0627\u062a \u0634\u062e\u0635 \u062b\u0627\u0644\u062b &#8211; \u06a9\u0647 \u0646\u0647 \u062a\u0646\u0647\u0627 \u0644\u0627\u06cc\u0647 \u062f\u06cc\u06af\u0631\u06cc \u0627\u0632 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0628\u0644\u06a9\u0647 \u062f\u0627\u0631\u0627\u06cc \u0633\u0637\u0648\u062d \u067e\u0648\u0644\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0627\u06cc\u062f \u0645\u0631\u0627\u0642\u0628 \u0622\u0646\u0647\u0627 \u0628\u0627\u0634\u06cc\u062f &#8211; \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u06a9\u0648\u0686\u06a9 \u0647\u0632\u06cc\u0646\u0647\u200c\u0627\u06cc \u0628\u06cc\u0634 \u0627\u0632 \u062d\u062f \u0628\u0627\u0634\u062f. \u0631\u0627\u0647 \u062d\u0644 \u0647\u0627\u06cc \u062f\u0627\u062e\u0644\u06cc \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0645\u062a\u0645\u0631\u06a9\u0632 \u0646\u06af\u0647 \u0645\u06cc \u062f\u0627\u0631\u0646\u062f\u060c \u0627\u0645\u0627 \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u062e\u06cc \u0627\u0632 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u0630\u06a9\u0631 \u0634\u062f\u0647 \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u0648\u0627\u06af\u0630\u0627\u0631 \u0645\u06cc \u06a9\u0646\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0645\u0648\u0631\u062f \u0645\u0627\u060c \u0644\u0648\u0633\u06cc\u0627 \u062b\u0627\u0628\u062a \u06a9\u0631\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc\u0627\u0646\u0647 \u06a9\u0627\u0645\u0644\u06cc \u0627\u0633\u062a &#8211; \u0627\u06cc\u0646 \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 \u0634\u062e\u0635 \u062b\u0627\u0644\u062b \u0646\u06cc\u0633\u062a \u0648 \u0628\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u0646\u06cc\u0627\u0632 \u0646\u062f\u0627\u0631\u062f\u060c \u0627\u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u067e\u0627\u06cc\u0647 \u0628\u0633\u06cc\u0627\u0631 \u0645\u062d\u06a9\u0645\u06cc \u0631\u0627 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0633\u0627\u062e\u062a \u0622\u0646 \u0622\u0633\u0627\u0646 \u0627\u0633\u062a.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0647 \u06cc\u06a9 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645 \u062f\u0631 \u0645\u0648\u0631\u062f \u0646\u062d\u0648\u0647 \u0627\u062c\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u062e\u0648\u062f \u0628\u0627 Next.js \u0648 Lucia \u0628\u067e\u0631\u062f\u0627\u0632\u06cc\u0645.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_Nextjs\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 1: \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Next.js<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 Next.js \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npx create-next-app@latest my-nextjs-app\n<span class=\"nb\">cd <\/span>my-nextjs-app\nnpm <span class=\"nb\">install<\/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_%D9%84%D9%88%D8%B3%DB%8C%D8%A7_%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 2: \u0644\u0648\u0633\u06cc\u0627 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0639\u062f\u060c \u0644\u0648\u0633\u06cc\u0627 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npm <span class=\"nb\">install <\/span>lucia\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_3_%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2_%D9%87%D9%88%DB%8C%D8%AA_%D8%B1%D8%A7_%D8%AA%D9%86%D8%B8%DB%8C%D9%85_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 3: \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>auth<\/code> \u062f\u0631 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0641\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f \u0648 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0644\u0648\u0633\u06cc\u0627 \u0648\u0627\u0631\u062f \u0648 \u0645\u0642\u062f\u0627\u0631\u062f\u0647\u06cc \u0627\u0648\u0644\u06cc\u0647 \u0634\u0648\u062f. \u0627\u06cc\u0646 \u06cc\u06a9 \u062f\u0633\u062a\u0647 \u0622\u062f\u0627\u067e\u062a\u0648\u0631 \u0628\u0631\u0627\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u062f\u0627\u0631\u062f \u0648 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0647\u0645\u0647 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0627\u06cc\u0646\u062c\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644\u060c \u0645\u0627 \u0627\u0632 SQLite \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight jsx\"><code><span class=\"c1\">\/\/ lib\/auth.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Lucia<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">lucia<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">BetterSqlite3Adapter<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@lucia-auth\/adapter-sqlite<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">adapter<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">BetterSQLite3Adapter<\/span><span class=\"p\">(<\/span><span class=\"nx\">db<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ your adapter<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">lucia<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Lucia<\/span><span class=\"p\">(<\/span><span class=\"nx\">adapter<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">sessionCookie<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ this sets cookies with super long expiration<\/span>\n    <span class=\"c1\">\/\/ since Next.js doesn't allow Lucia to extend cookie expiration when rendering pages<\/span>\n    <span class=\"na\">expires<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">attributes<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"c1\">\/\/ set to `true` when using HTTPS<\/span>\n      <span class=\"na\">secure<\/span><span class=\"p\">:<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">NODE_ENV<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">production<\/span><span class=\"dl\">\"<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"c1\">\/\/ To get some good Typescript support, add this!<\/span>\n<span class=\"nx\">declare<\/span> <span class=\"nx\">module<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">lucia<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kr\">interface<\/span> <span class=\"nx\">Register<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nl\">Lucia<\/span><span class=\"p\">:<\/span> <span class=\"k\">typeof<\/span> <span class=\"nx\">lucia<\/span><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_4_%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1_%D8%A8%D9%87_DB\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 4: \u0627\u0641\u0632\u0648\u062f\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 DB<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 \u0634\u0627\u0645\u0644 \u0637\u0631\u062d\u0648\u0627\u0631\u0647 \u0647\u0627\u06cc \u0645\u0627 \u0628\u0627\u0634\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ lib\/db.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">sqlite<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">better-sqlite3<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">db<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">sqlite<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">main.db<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n\n<span class=\"nx\">db<\/span><span class=\"p\">.<\/span><span class=\"nf\">exec<\/span><span class=\"p\">(<\/span><span class=\"s2\">`CREATE TABLE IF NOT EXISTS user (\n    id TEXT NOT NULL PRIMARY KEY,\n    github_id INTEGER UNIQUE,\n    username TEXT NOT NULL\n)`<\/span><span class=\"p\">);<\/span>\n\n<span class=\"nx\">db<\/span><span class=\"p\">.<\/span><span class=\"nf\">exec<\/span><span class=\"p\">(<\/span><span class=\"s2\">`CREATE TABLE IF NOT EXISTS session (\n    id TEXT NOT NULL PRIMARY KEY,\n    expires_at INTEGER NOT NULL,\n    user_id TEXT NOT NULL,\n    FOREIGN KEY (user_id) REFERENCES user(id)\n)`<\/span><span class=\"p\">);<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kr\">interface<\/span> <span class=\"nx\">DatabaseUser<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">username<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">github_id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/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<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_5_%D9%88%D8%B1%D9%88%D8%AF_%D9%88_%D8%AB%D8%A8%D8%AA_%D9%86%D8%A7%D9%85_%D8%B1%D8%A7_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 5: \u0648\u0631\u0648\u062f \u0648 \u062b\u0628\u062a \u0646\u0627\u0645 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0631\u0627\u06cc \u062a\u062d\u0642\u0642 \u0627\u06cc\u0646 \u0627\u0645\u0631\u060c \u0627\u0628\u062a\u062f\u0627 \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 GitHub OAuth \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645. \u0627\u06cc\u0646 \u0646\u0633\u0628\u062a\u0627\u064b \u0633\u0627\u062f\u0647 \u0627\u0633\u062a\u060c \u0634\u0645\u0627 \u0622\u0646 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f\u060c \u0622\u062f\u0631\u0633\u200c\u0647\u0627\u06cc URL \u0648 ENV \u0644\u0627\u0632\u0645 \u0631\u0627 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f \u0648 \u0622\u0645\u0627\u062f\u0647 \u0647\u0633\u062a\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0646\u062d\u0648\u0647 \u0627\u0646\u062c\u0627\u0645 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0633\u0646\u0627\u062f GitHub \u0631\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/.env.local<\/span>\n<span class=\"nx\">GITHUB_CLIENT_ID<\/span><span class=\"o\">=<\/span><span class=\"nx\">your<\/span><span class=\"o\">-<\/span><span class=\"nx\">github<\/span><span class=\"o\">-<\/span><span class=\"nx\">client<\/span><span class=\"o\">-<\/span><span class=\"nx\">id<\/span>\n<span class=\"nx\">GITHUB_CLIENT_SECRET<\/span><span class=\"o\">=<\/span><span class=\"nx\">your<\/span><span class=\"o\">-<\/span><span class=\"nx\">github<\/span><span class=\"o\">-<\/span><span class=\"nx\">client<\/span><span class=\"o\">-<\/span><span class=\"nx\">secret<\/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>\u067e\u0633 \u0627\u0632 \u0622\u0646\u060c \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0642\u0627\u0628\u0644\u06cc\u062a \u0647\u0627\u06cc \u0648\u0631\u0648\u062f \u0648 \u062b\u0628\u062a \u0646\u0627\u0645 \u0628\u0647 \u0635\u0641\u062d\u0627\u062a \u0634\u0645\u0627\u0633\u062a\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0633\u0631\u06cc\u0639 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ login\/page.tsx<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">validateRequest<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@\/lib\/auth<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">redirect<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">next\/navigation<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">Page<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">user<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">validateRequest<\/span><span class=\"p\">();<\/span>\n  <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">user<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nf\">redirect<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n    <span class=\"p\"\/>\n      <span class=\"p\"><span class=\"nt\">h1<\/span><span class=\"p\">&gt;<\/span>Sign in<span class=\"p\"\/><span class=\"nt\">h1<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"p\"><span class=\"nt\">a<\/span> <span class=\"na\">href<\/span><span class=\"p\">=<\/span><span class=\"s\">\"\/login\/github\"<\/span><span class=\"p\">&gt;<\/span>Sign in with GitHub<span class=\"p\"\/><span class=\"nt\">a<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">&gt;<\/span>\n  <span class=\"p\">);<\/span>\n<span class=\"p\">}<\/span>\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<p>\u067e\u0633 \u0627\u0632 \u0627\u0641\u0632\u0648\u062f\u0646 \u0635\u0641\u062d\u0647\u060c \u0628\u0627\u06cc\u062f \u062a\u063a\u06cc\u06cc\u0631 \u0645\u0633\u06cc\u0631 \u0648\u0631\u0648\u062f \u0628\u0647 \u06af\u06cc\u062a \u0647\u0627\u0628 \u0648 \u062a\u0645\u0627\u0633\u06cc \u06a9\u0647 \u0642\u0631\u0627\u0631 \u0627\u0633\u062a \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0634\u0648\u062f \u0631\u0627 \u0646\u06cc\u0632 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645. \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0627\u0628\u062a\u062f\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u0633\u06cc\u0631 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0631\u0627 \u0628\u0627 URL \u0645\u062c\u0648\u0632 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ login\/github\/route.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">generateState<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">arctic<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">github<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/..\/..\/lib\/auth<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">cookies<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">next\/headers<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">GET<\/span><span class=\"p\">():<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"nx\">Response<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">state<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">generateState<\/span><span class=\"p\">();<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">url<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">github<\/span><span class=\"p\">.<\/span><span class=\"nf\">createAuthorizationURL<\/span><span class=\"p\">(<\/span><span class=\"nx\">state<\/span><span class=\"p\">);<\/span>\n\n  <span class=\"nf\">cookies<\/span><span class=\"p\">().<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">github_oauth_state<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">state<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">path<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">secure<\/span><span class=\"p\">:<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">NODE_ENV<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">production<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">httpOnly<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">maxAge<\/span><span class=\"p\">:<\/span> <span class=\"mi\">60<\/span> <span class=\"o\">*<\/span> <span class=\"mi\">10<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">sameSite<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">lax<\/span><span class=\"dl\">\"<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"k\">return<\/span> <span class=\"nx\">Response<\/span><span class=\"p\">.<\/span><span class=\"nf\">redirect<\/span><span class=\"p\">(<\/span><span class=\"nx\">url<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">}<\/span>\n<\/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<p>\u0648 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c callback (\u06a9\u0647 \u062f\u0631 \u0648\u0627\u0642\u0639 \u0647\u0645\u0627\u0646 \u0686\u06cc\u0632\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0627 \u062f\u0631 GitHub OAuth \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645):<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ login\/github\/callback\/route.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">github<\/span><span class=\"p\">,<\/span> <span class=\"nx\">lucia<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@\/lib\/auth<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">db<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@\/lib\/db<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">cookies<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">next\/headers<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">OAuth2RequestError<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">arctic<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">generateId<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">lucia<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"kd\">type<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">DatabaseUser<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@\/lib\/db<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">GET<\/span><span class=\"p\">(<\/span><span class=\"nx\">request<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Request<\/span><span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"nx\">Response<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">url<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">URL<\/span><span class=\"p\">(<\/span><span class=\"nx\">request<\/span><span class=\"p\">.<\/span><span class=\"nx\">url<\/span><span class=\"p\">);<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">code<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">url<\/span><span class=\"p\">.<\/span><span class=\"nx\">searchParams<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">code<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">state<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">url<\/span><span class=\"p\">.<\/span><span class=\"nx\">searchParams<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">state<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">storedState<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">cookies<\/span><span class=\"p\">().<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">github_oauth_state<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)?.<\/span><span class=\"nx\">value<\/span> <span class=\"o\">??<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n  <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">code<\/span> <span class=\"o\">||<\/span> <span class=\"o\">!<\/span><span class=\"nx\">state<\/span> <span class=\"o\">||<\/span> <span class=\"o\">!<\/span><span class=\"nx\">storedState<\/span> <span class=\"o\">||<\/span> <span class=\"nx\">state<\/span> <span class=\"o\">!==<\/span> <span class=\"nx\">storedState<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Response<\/span><span class=\"p\">(<\/span><span class=\"kc\">null<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">status<\/span><span class=\"p\">:<\/span> <span class=\"mi\">400<\/span>\n    <span class=\"p\">});<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">tokens<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">github<\/span><span class=\"p\">.<\/span><span class=\"nf\">validateAuthorizationCode<\/span><span class=\"p\">(<\/span><span class=\"nx\">code<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">githubUserResponse<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">fetch<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">https:\/\/api.github.com\/user<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">Authorization<\/span><span class=\"p\">:<\/span> <span class=\"s2\">`Bearer <\/span><span class=\"p\">${<\/span><span class=\"nx\">tokens<\/span><span class=\"p\">.<\/span><span class=\"nx\">accessToken<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">});<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"na\">githubUser<\/span><span class=\"p\">:<\/span> <span class=\"nx\">GitHubUser<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">githubUserResponse<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/span><span class=\"p\">();<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">existingUser<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">db<\/span><span class=\"p\">.<\/span><span class=\"nf\">prepare<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">SELECT * FROM user WHERE github_id = ?<\/span><span class=\"dl\">\"<\/span><span class=\"p\">).<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"nx\">githubUser<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">)<\/span> <span class=\"k\">as<\/span>\n      <span class=\"o\">|<\/span> <span class=\"nx\">DatabaseUser<\/span>\n      <span class=\"o\">|<\/span> <span class=\"kc\">undefined<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">existingUser<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">session<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">lucia<\/span><span class=\"p\">.<\/span><span class=\"nf\">createSession<\/span><span class=\"p\">(<\/span><span class=\"nx\">existingUser<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span> <span class=\"p\">{});<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">sessionCookie<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">lucia<\/span><span class=\"p\">.<\/span><span class=\"nf\">createSessionCookie<\/span><span class=\"p\">(<\/span><span class=\"nx\">session<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">);<\/span>\n      <span class=\"nf\">cookies<\/span><span class=\"p\">().<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"nx\">sessionCookie<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">,<\/span> <span class=\"nx\">sessionCookie<\/span><span class=\"p\">.<\/span><span class=\"nx\">value<\/span><span class=\"p\">,<\/span> <span class=\"nx\">sessionCookie<\/span><span class=\"p\">.<\/span><span class=\"nx\">attributes<\/span><span class=\"p\">);<\/span>\n      <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Response<\/span><span class=\"p\">(<\/span><span class=\"kc\">null<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">status<\/span><span class=\"p\">:<\/span> <span class=\"mi\">302<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n          <span class=\"na\">Location<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/<\/span><span class=\"dl\">\"<\/span>\n        <span class=\"p\">}<\/span>\n      <span class=\"p\">});<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">userId<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">generateId<\/span><span class=\"p\">(<\/span><span class=\"mi\">15<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">db<\/span><span class=\"p\">.<\/span><span class=\"nf\">prepare<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">INSERT INTO user (id, github_id, username) VALUES (?, ?, ?)<\/span><span class=\"dl\">\"<\/span><span class=\"p\">).<\/span><span class=\"nf\">run<\/span><span class=\"p\">(<\/span>\n      <span class=\"nx\">userId<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">githubUser<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">githubUser<\/span><span class=\"p\">.<\/span><span class=\"nx\">login<\/span>\n    <span class=\"p\">);<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">session<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">lucia<\/span><span class=\"p\">.<\/span><span class=\"nf\">createSession<\/span><span class=\"p\">(<\/span><span class=\"nx\">userId<\/span><span class=\"p\">,<\/span> <span class=\"p\">{});<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">sessionCookie<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">lucia<\/span><span class=\"p\">.<\/span><span class=\"nf\">createSessionCookie<\/span><span class=\"p\">(<\/span><span class=\"nx\">session<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">);<\/span>\n    <span class=\"nf\">cookies<\/span><span class=\"p\">().<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"nx\">sessionCookie<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">,<\/span> <span class=\"nx\">sessionCookie<\/span><span class=\"p\">.<\/span><span class=\"nx\">value<\/span><span class=\"p\">,<\/span> <span class=\"nx\">sessionCookie<\/span><span class=\"p\">.<\/span><span class=\"nx\">attributes<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Response<\/span><span class=\"p\">(<\/span><span class=\"kc\">null<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">status<\/span><span class=\"p\">:<\/span> <span class=\"mi\">302<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">Location<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/<\/span><span class=\"dl\">\"<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">});<\/span>\n  <span class=\"p\">}<\/span> <span class=\"k\">catch <\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span> <span class=\"k\">instanceof<\/span> <span class=\"nx\">OAuth2RequestError<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">e<\/span><span class=\"p\">.<\/span><span class=\"nx\">message<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">bad_verification_code<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"c1\">\/\/ invalid code<\/span>\n      <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Response<\/span><span class=\"p\">(<\/span><span class=\"kc\">null<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">status<\/span><span class=\"p\">:<\/span> <span class=\"mi\">400<\/span>\n      <span class=\"p\">});<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Response<\/span><span class=\"p\">(<\/span><span class=\"kc\">null<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">status<\/span><span class=\"p\">:<\/span> <span class=\"mi\">500<\/span>\n    <span class=\"p\">});<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"kr\">interface<\/span> <span class=\"nx\">GitHubUser<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">login<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<\/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<p>\u0646\u06a9\u062a\u0647 \u0645\u0647\u0645 \u062f\u06cc\u06af\u0631 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631\u060c \u0645\u0627 \u0628\u0647 GitHub OAuth \u0645\u06cc \u0631\u0648\u06cc\u0645\u060c \u0627\u0645\u0627\u060c \u0628\u0647 \u0637\u0648\u0631 \u06a9\u0644\u06cc\u060c \u0627\u06cc\u0646 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627 \u062d\u0627\u0648\u06cc \u062f\u0633\u062a\u0647 \u0627\u06cc \u0627\u0632 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0645\u062e\u062a\u0644\u0641 (\u0627\u0632 \u062c\u0645\u0644\u0647 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0633\u0627\u062f\u0647) \u0647\u0633\u062a\u0646\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f. \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u062f\u06cc\u06af\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ lib\/auth.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Lucia<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">lucia<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">BetterSqlite3Adapter<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@lucia-auth\/adapter-sqlite<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">db<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/db<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">cookies<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">next\/headers<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">cache<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">react<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">GitHub<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">arctic<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"kd\">type<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Session<\/span><span class=\"p\">,<\/span> <span class=\"nx\">User<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">lucia<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"kd\">type<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">DatabaseUser<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/db<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"c1\">\/\/ these two lines here might be important if you have node.js 18 or lower. <\/span>\n<span class=\"c1\">\/\/ you can check Lucia's documentation in more detail if that's the case <\/span>\n<span class=\"c1\">\/\/ (https:\/\/lucia-auth.com\/getting-started\/nextjs-app#polyfill)<\/span>\n<span class=\"c1\">\/\/ import { webcrypto } from \"crypto\";<\/span>\n<span class=\"c1\">\/\/ globalThis.crypto = webcrypto as Crypto;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">adapter<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">BetterSqlite3Adapter<\/span><span class=\"p\">(<\/span><span class=\"nx\">db<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">user<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">user<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">session<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">session<\/span><span class=\"dl\">\"<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">lucia<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Lucia<\/span><span class=\"p\">(<\/span><span class=\"nx\">adapter<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">sessionCookie<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">attributes<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">secure<\/span><span class=\"p\">:<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">NODE_ENV<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">production<\/span><span class=\"dl\">\"<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">},<\/span>\n  <span class=\"na\">getUserAttributes<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">attributes<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">githubId<\/span><span class=\"p\">:<\/span> <span class=\"nx\">attributes<\/span><span class=\"p\">.<\/span><span class=\"nx\">github_id<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">username<\/span><span class=\"p\">:<\/span> <span class=\"nx\">attributes<\/span><span class=\"p\">.<\/span><span class=\"nx\">username<\/span>\n    <span class=\"p\">};<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"kr\">declare<\/span> <span class=\"kr\">module<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">lucia<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kr\">interface<\/span> <span class=\"nx\">Register<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nl\">Lucia<\/span><span class=\"p\">:<\/span> <span class=\"k\">typeof<\/span> <span class=\"nx\">lucia<\/span><span class=\"p\">;<\/span>\n    <span class=\"nl\">DatabaseUserAttributes<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Omit<\/span><span class=\"o\"><span class=\"nx\">DatabaseUser<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">id<\/span><span class=\"dl\">\"<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">validateRequest<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">cache<\/span><span class=\"p\">(<\/span>\n  <span class=\"k\">async <\/span><span class=\"p\">():<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"p\">{<\/span> <span class=\"na\">user<\/span><span class=\"p\">:<\/span> <span class=\"nx\">User<\/span><span class=\"p\">;<\/span> <span class=\"nl\">session<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Session<\/span> <span class=\"p\">}<\/span> <span class=\"o\">|<\/span> <span class=\"p\">{<\/span> <span class=\"na\">user<\/span><span class=\"p\">:<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span> <span class=\"nl\">session<\/span><span class=\"p\">:<\/span> <span class=\"kc\">null<\/span> <span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">sessionId<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">cookies<\/span><span class=\"p\">().<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"nx\">lucia<\/span><span class=\"p\">.<\/span><span class=\"nx\">sessionCookieName<\/span><span class=\"p\">)?.<\/span><span class=\"nx\">value<\/span> <span class=\"o\">??<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">sessionId<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">return<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">user<\/span><span class=\"p\">:<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">session<\/span><span class=\"p\">:<\/span> <span class=\"kc\">null<\/span>\n      <span class=\"p\">};<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">result<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">lucia<\/span><span class=\"p\">.<\/span><span class=\"nf\">validateSession<\/span><span class=\"p\">(<\/span><span class=\"nx\">sessionId<\/span><span class=\"p\">);<\/span>\n    <span class=\"c1\">\/\/ next.js throws when you attempt to set cookie when rendering page<\/span>\n    <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">result<\/span><span class=\"p\">.<\/span><span class=\"nx\">session<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">result<\/span><span class=\"p\">.<\/span><span class=\"nx\">session<\/span><span class=\"p\">.<\/span><span class=\"nx\">fresh<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"nx\">sessionCookie<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">lucia<\/span><span class=\"p\">.<\/span><span class=\"nf\">createSessionCookie<\/span><span class=\"p\">(<\/span><span class=\"nx\">result<\/span><span class=\"p\">.<\/span><span class=\"nx\">session<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">);<\/span>\n        <span class=\"nf\">cookies<\/span><span class=\"p\">().<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"nx\">sessionCookie<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">,<\/span> <span class=\"nx\">sessionCookie<\/span><span class=\"p\">.<\/span><span class=\"nx\">value<\/span><span class=\"p\">,<\/span> <span class=\"nx\">sessionCookie<\/span><span class=\"p\">.<\/span><span class=\"nx\">attributes<\/span><span class=\"p\">);<\/span>\n      <span class=\"p\">}<\/span>\n      <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">result<\/span><span class=\"p\">.<\/span><span class=\"nx\">session<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"nx\">sessionCookie<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">lucia<\/span><span class=\"p\">.<\/span><span class=\"nf\">createBlankSessionCookie<\/span><span class=\"p\">();<\/span>\n        <span class=\"nf\">cookies<\/span><span class=\"p\">().<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"nx\">sessionCookie<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">,<\/span> <span class=\"nx\">sessionCookie<\/span><span class=\"p\">.<\/span><span class=\"nx\">value<\/span><span class=\"p\">,<\/span> <span class=\"nx\">sessionCookie<\/span><span class=\"p\">.<\/span><span class=\"nx\">attributes<\/span><span class=\"p\">);<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">{}<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nx\">result<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">);<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">github<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">GitHub<\/span><span class=\"p\">(<\/span><span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">GITHUB_CLIENT_ID<\/span><span class=\"o\">!<\/span><span class=\"p\">,<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">GITHUB_CLIENT_SECRET<\/span><span class=\"o\">!<\/span><span class=\"p\">);<\/span>\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_6_%D9%85%D8%AD%D8%A7%D9%81%D8%B8%D8%AA_%D8%A7%D8%B2_%D9%85%D8%B3%DB%8C%D8%B1%D9%87%D8%A7\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 6: \u0645\u062d\u0627\u0641\u0638\u062a \u0627\u0632 \u0645\u0633\u06cc\u0631\u0647\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u067e\u0633 \u0627\u0632 \u0627\u0641\u0632\u0648\u062f\u0646 \u0647\u0645\u0647 \u0627\u06cc\u0646 \u0645\u0648\u0627\u0631\u062f \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0628\u0647 \u062f\u0631\u0633\u062a\u06cc \u06a9\u0627\u0631 \u06a9\u0646\u062f\u060c \u0641\u0642\u0637 \u0628\u0627\u06cc\u062f \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u0645 \u06a9\u0647 \u0645\u0633\u06cc\u0631\u0647\u0627 \u0628\u0627 \u0628\u0631\u0631\u0633\u06cc \u0648\u0636\u0639\u06cc\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0645\u062d\u0627\u0641\u0638\u062a \u0645\u06cc \u0634\u0648\u0646\u062f &#8211; \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f\u060c \u0627\u06cc\u0646 \u0635\u0641\u062d\u0647 \u0633\u0627\u062f\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc\u060c \u0634\u0646\u0627\u0633\u0647 \u0648 \u062f\u06a9\u0645\u0647 \u0631\u0627 \u062f\u0631 \u0635\u0648\u0631\u062a \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u0633\u06cc\u0631 \u0645\u06cc \u062f\u0647\u062f. \u0628\u0647 \/login \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0641\u0631\u0645\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0628\u0627\u0644\u0627 \u0631\u0627 \u062a\u06a9\u0645\u06cc\u0644 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">lucia<\/span><span class=\"p\">,<\/span> <span class=\"nx\">validateRequest<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@\/lib\/auth<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">redirect<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">next\/navigation<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">cookies<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">next\/headers<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">Page<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">user<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">validateRequest<\/span><span class=\"p\">();<\/span>\n  <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">user<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nf\">redirect<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/login<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n    <span class=\"p\"\/>\n      <span class=\"p\"><span class=\"nt\">h1<\/span><span class=\"p\">&gt;<\/span>Hi, <span class=\"si\">{<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">username<\/span><span class=\"si\">}<\/span>!<span class=\"p\"\/><span class=\"nt\">h1<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"p\"><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>Your user ID is <span class=\"si\">{<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"si\">}<\/span>.<span class=\"p\"\/><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"p\"><span class=\"nt\">form<\/span> <span class=\"na\">action<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">logout<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\"><span class=\"nt\">button<\/span><span class=\"p\">&gt;<\/span>Sign out<span class=\"p\"\/><span class=\"nt\">button<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"p\"\/><span class=\"nt\">form<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">&gt;<\/span>\n  <span class=\"p\">);<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">logout<\/span><span class=\"p\">():<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"nx\">ActionResult<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"dl\">\"<\/span><span class=\"s2\">use server<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">session<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">validateRequest<\/span><span class=\"p\">();<\/span>\n  <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">session<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">error<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Unauthorized<\/span><span class=\"dl\">\"<\/span>\n    <span class=\"p\">};<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">await<\/span> <span class=\"nx\">lucia<\/span><span class=\"p\">.<\/span><span class=\"nf\">invalidateSession<\/span><span class=\"p\">(<\/span><span class=\"nx\">session<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">);<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">sessionCookie<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">lucia<\/span><span class=\"p\">.<\/span><span class=\"nf\">createBlankSessionCookie<\/span><span class=\"p\">();<\/span>\n  <span class=\"nf\">cookies<\/span><span class=\"p\">().<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"nx\">sessionCookie<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">,<\/span> <span class=\"nx\">sessionCookie<\/span><span class=\"p\">.<\/span><span class=\"nx\">value<\/span><span class=\"p\">,<\/span> <span class=\"nx\">sessionCookie<\/span><span class=\"p\">.<\/span><span class=\"nx\">attributes<\/span><span class=\"p\">);<\/span>\n  <span class=\"k\">return<\/span> <span class=\"nf\">redirect<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/login<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"kr\">interface<\/span> <span class=\"nx\">ActionResult<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">error<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/span><\/span><\/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<p>\u062a\u06a9\u0647 \u06a9\u06cc\u06a9\u060c \u0627\u06cc\u0646\u0637\u0648\u0631 \u0646\u06cc\u0633\u062a\u061f \u062e\u0648\u0628\u060c \u0646\u0647 \u0648\u0627\u0642\u0639\u0627. <\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0645\u0631\u0648\u0631 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0686\u0647 \u0645\u0631\u0627\u062d\u0644\u06cc \u0628\u0631\u0627\u06cc \u062a\u062d\u0642\u0642 \u0627\u06cc\u0646 \u0627\u0645\u0631 \u0636\u0631\u0648\u0631\u06cc \u0628\u0648\u062f:<\/p>\n<ul>\n<li>\u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0644\u0648\u0633\u06cc\u0627 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0627\u0641\u0632\u0648\u062f\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 DB<\/li>\n<li>\u0627\u0639\u062a\u0628\u0627\u0631 GitHub OAuth \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f \u0648 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637 \u062e\u0648\u062f \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0686\u0646\u062f \u062a\u0648\u0627\u0628\u0639 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u0648\u0631\u0648\u062f \u0648 \u062b\u0628\u062a \u0646\u0627\u0645 \u0631\u0627 \u0628\u0627 \u0627\u062c\u0632\u0627\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u06cc\u06a9 \u0645\u0633\u06cc\u0631 \u0645\u062d\u0627\u0641\u0638\u062a \u0634\u062f\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/practicaldev\/image\/fetch\/s--OJ2d4lka--\/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800\/https:\/\/media2.giphy.com\/media\/3ofSBnYbEPePeigIMg\/giphy.gif%3Fcid%3D7941fdc6x77sivlvr6hs2yu5aztvwjvhgugv6b718mjanr2h%26ep%3Dv1_gifs_search%26rid%3Dgiphy.gif%26ct%3Dg\" alt=\"https:\/\/media2.giphy.com\/media\/3ofSBnYbEPePeigIMg\/giphy.gif?cid=7941fdc6x77sivlvr6hs2yu5aztvwjvhgugv6b718mjanr2h&#038;ep=v1_gifs_search&#038;rid=giphyg.gif&#038;ct\" loading=\"lazy\" width=\"480\" height=\"360\" data-animated=\"true\" title=\"\"><\/p>\n<p>\u0635\u0627\u062f\u0642\u0627\u0646\u0647 \u0628\u06af\u0648\u06cc\u0645\u060c \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0633\u0639\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u062f \u0686\u06cc\u0632 \u062c\u0627\u0644\u0628\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <strong>\u0633\u0631\u06cc\u0639<\/strong>\u060c \u062a\u06a9\u0631\u0627\u0631 \u0627\u06cc\u0646 \u0645\u0631\u0627\u062d\u0644 \u0648 \u0627\u0634\u06a9\u0627\u0644 \u0632\u062f\u0627\u06cc\u06cc \u0686\u0646\u062f \u0645\u0634\u06a9\u0644 \u0645\u0646\u0637\u0642\u06cc \u0627\u06cc\u0646\u062c\u0627 \u0648 \u0622\u0646\u062c\u0627 \u06a9\u0647 \u0647\u0645\u06cc\u0634\u0647 \u0631\u062e \u0645\u06cc \u062f\u0647\u062f \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u06a9\u0645\u06cc \u0646\u0627\u0627\u0645\u06cc\u062f \u06a9\u0646\u0646\u062f\u0647 \u0628\u0627\u0634\u062f. \u0628\u0647 \u0632\u0648\u062f\u06cc\u060c \u0646\u06af\u0627\u0647\u06cc \u0628\u0647 \u0631\u0648\u06cc\u06a9\u0631\u062f Wasp \u0628\u0631\u0627\u06cc \u062d\u0644 \u0647\u0645\u0627\u0646 \u0645\u0634\u06a9\u0644 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u0634\u062a \u0648 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0645\u0642\u0627\u06cc\u0633\u0647 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0641\u0631\u0622\u06cc\u0646\u062f \u0627\u062c\u0631\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u0627\u0639\u062a\u0628\u0627\u0631 Wasp \u0686\u0642\u062f\u0631 \u0622\u0633\u0627\u0646\u200c\u062a\u0631 \u0627\u0633\u062a.<\/p>\n<p>\u062f\u0631 \u0635\u0648\u0631\u062a\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0644 \u06a9\u062f \u0627\u06cc\u0646 \u0642\u0633\u0645\u062a \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0644\u0648\u0633\u06cc\u0627 \u06cc\u06a9 \u0645\u062e\u0632\u0646 \u0646\u0645\u0648\u0646\u0647 \u062f\u0627\u0631\u062f (\u06a9\u0647 \u0645\u0646\u0628\u0639 \u0627\u06a9\u062b\u0631 \u06a9\u062f\u0647\u0627\u06cc \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a)\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u062f\u0631 \u0635\u0648\u0631\u062a \u062a\u0645\u0627\u06cc\u0644 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_Wasp\"><\/span>\n<p>  \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc Wasp<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062d\u0627\u0644\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0648\u0636\u0648\u0639 \u0628\u067e\u0631\u062f\u0627\u0632\u06cc\u0645 \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0628\u0627 Wasp \u0628\u0647 \u0647\u0645\u0627\u0646 \u0686\u06cc\u0632\u0647\u0627 \u0628\u0631\u0633\u06cc\u0645. \u0627\u06af\u0631\u0686\u0647 \u0647\u0646\u0648\u0632 \u0627\u0632 \u0644\u0648\u0633\u06cc\u0627 \u062f\u0631 \u067e\u0633\u200c\u0632\u0645\u06cc\u0646\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c Wasp \u062a\u0645\u0627\u0645 \u06a9\u0627\u0631\u0647\u0627\u06cc \u0633\u0646\u06af\u06cc\u0646 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0634\u0645\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u200c\u062f\u0647\u062f \u0648 \u0627\u06cc\u0646 \u0631\u0648\u0646\u062f \u0631\u0627 \u0628\u0633\u06cc\u0627\u0631 \u0633\u0631\u06cc\u0639\u200c\u062a\u0631 \u0648 \u0633\u0627\u062f\u0647\u200c\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0628\u06cc\u0627\u06cc\u06cc\u062f \u062a\u062c\u0631\u0628\u0647 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u062e\u0648\u062f\u0645\u0627\u0646 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0647 \u0622\u0646 \u0628\u067e\u0631\u062f\u0627\u0632\u06cc\u0645\u060c \u0627\u06af\u0631 \u0628\u06cc\u0634\u062a\u0631 \u06cc\u06a9 \u06cc\u0627\u062f\u06af\u06cc\u0631\u0646\u062f\u0647 \u0628\u0635\u0631\u06cc \u0647\u0633\u062a\u06cc\u062f\u060c \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u06cc\u06a9 \u0648\u06cc\u062f\u06cc\u0648\u06cc 1 \u062f\u0642\u06cc\u0642\u0647 \u0627\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u062a\u0623\u06cc\u06cc\u062f \u0627\u0639\u062a\u0628\u0627\u0631 \u0628\u0627 Wasp \u0631\u0627 \u0628\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc \u06af\u0630\u0627\u0631\u062f.<\/p>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=Qiro77q-ulI\" rel=\"nofollow noopener\" target=\"_blank\">https:\/\/www.youtube.com\/watch?v=Qiro77q-ulI<\/a><br \/>\n<\/iframe>\n<\/p>\n<p>\u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u0648\u06cc\u062f\u0626\u0648 \u0645\u0634\u0627\u0647\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f\u060c Wasp \u0686\u0627\u0631\u0686\u0648\u0628\u06cc \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627 \u0628\u0627 \u0645\u0632\u0627\u06cc\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0628\u0631\u0627\u06cc \u062a\u0633\u0647\u06cc\u0644 \u062a\u0648\u0633\u0639\u0647 \u0627\u0633\u062a. \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u06a9\u0627\u0631\u0647\u0627\u06cc \u062a\u06a9\u0631\u0627\u0631\u06cc \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u062f \u0648 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0628\u0631 \u0631\u0648\u06cc \u0627\u06cc\u062c\u0627\u062f \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u0645\u0646\u062d\u0635\u0631 \u0628\u0647 \u0641\u0631\u062f \u062a\u0645\u0631\u06a9\u0632 \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u062f\u0631\u0628\u0627\u0631\u0647 \u0641\u0627\u06cc\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Wasp \u0628\u06cc\u0634\u062a\u0631 \u0645\u06cc \u0622\u0645\u0648\u0632\u06cc\u0645 \u0648 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u06cc\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u062a\u0646\u0638\u06cc\u0645 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0631\u0627 \u0633\u0627\u062f\u0647 \u062a\u0631 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%DB%8C%DA%A9_%D9%BE%D8%B1%D9%88%DA%98%D9%87_Wasp_%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 1: \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 Wasp \u0627\u06cc\u062c\u0627\u062f \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>curl <span class=\"nt\">-sSL<\/span> https:\/\/get.wasp-lang.dev\/installer.sh | sh\nwasp new my-wasp-app\n<span class=\"nb\">cd <\/span>my-wasp-app\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_%D9%85%D9%88%D8%AC%D9%88%D8%AF%DB%8C%D8%AA_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1_%D8%B1%D8%A7_%D8%A8%D9%87_DB_%D8%AE%D9%88%D8%AF_%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 2: \u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0647 DB \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0647 \u0647\u0645\u06cc\u0646 \u0633\u0627\u062f\u06af\u06cc \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0631\u062f\u0646 <code>app.auth.userEntity<\/code> \u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u062f\u0631 <code>schema.prisma<\/code> \u0641\u0627\u06cc\u0644 \u0648 \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u062e\u06cc \u0627\u0632 \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"nx\">model<\/span> <span class=\"nx\">User<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">id<\/span> <span class=\"nx\">Int<\/span> <span class=\"p\">@<\/span><span class=\"nd\">id<\/span> <span class=\"p\">@<\/span><span class=\"nd\">default<\/span><span class=\"p\">(<\/span><span class=\"nf\">autoincrement<\/span><span class=\"p\">())<\/span>\n  <span class=\"nx\">email<\/span>   <span class=\"nb\">String<\/span>   <span class=\"p\">@<\/span><span class=\"nd\">unique<\/span>\n  <span class=\"nx\">name<\/span>    <span class=\"nb\">String<\/span><span class=\"p\">?<\/span>\n  <span class=\"c1\">\/\/ Add your own fields below<\/span>\n  <span class=\"c1\">\/\/ ...<\/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_3_%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2_%D9%87%D9%88%DB%8C%D8%AA_%D8%B1%D8%A7_%D8%AA%D8%B9%D8%B1%DB%8C%D9%81_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 3: \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u062f\u0631 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u0635\u0644\u06cc Wasp\u060c \u0627\u0631\u0627\u0626\u0647\u200c\u062f\u0647\u0646\u062f\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a\u06cc \u0631\u0627 \u06a9\u0647 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/main.wasp<\/span>\n<span class=\"nx\">app<\/span> <span class=\"nx\">myApp<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">wasp<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">version<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^0.14.0<\/span><span class=\"dl\">\"<\/span>\n  <span class=\"p\">},<\/span>\n  <span class=\"nx\">title<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">My App<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">auth<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nl\">userEntity<\/span><span class=\"p\">:<\/span> <span class=\"nx\">User<\/span><span class=\"p\">,<\/span>\n    <span class=\"nx\">methods<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"c1\">\/\/ 2. Enable Github Auth<\/span>\n      <span class=\"nl\">gitHub<\/span><span class=\"p\">:<\/span> <span class=\"p\">{}<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"nx\">onAuthFailedRedirectTo<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/login<\/span><span class=\"dl\">\"<\/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<p>\u0648 \u067e\u0633 \u0627\u0632 \u0622\u0646\u060c \u0641\u0642\u0637 \u062f\u0631 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u062e\u0648\u062f \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>wasp db migrate-dev\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_4_%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D9%88_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_GitHub_OAuth_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A7%D8%AC%D8%B1%D8%A7_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 4: \u0627\u0639\u062a\u0628\u0627\u0631\u0646\u0627\u0645\u0647 \u0648 \u0628\u0631\u0646\u0627\u0645\u0647 GitHub OAuth \u062e\u0648\u062f \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06cc\u0646 \u0628\u062e\u0634 \u0628\u0631\u0627\u06cc \u0647\u0631 \u062f\u0648 \u0686\u0627\u0631\u0686\u0648\u0628 \u0645\u0634\u0627\u0628\u0647 \u0627\u0633\u062a\u060c \u0628\u0631\u0627\u06cc \u0627\u0646\u062c\u0627\u0645 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u0633\u062a\u0646\u062f\u0627\u062a\u06cc \u0631\u0627 \u06a9\u0647 GitHub \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u06cc\u062f: \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 OAuth &#8211; GitHub Docs. \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 Wasp\u060c URL \u0647\u0627\u06cc \u067e\u0627\u0633\u062e \u0628\u0647 \u062a\u0645\u0627\u0633 \u0639\u0628\u0627\u0631\u062a\u0646\u062f \u0627\u0632: <\/p>\n<ul>\n<li>\u062f\u0631 \u062d\u06cc\u0646 \u062a\u0648\u0633\u0639\u0647: <code>http:\/\/localhost:3001\/auth\/github\/callback<\/code>\n<\/li>\n<li>\u067e\u0633 \u0627\u0632 \u0627\u0633\u062a\u0642\u0631\u0627\u0631: <code>https:\/\/your-server-url.com\/auth\/github\/callback<\/code>\n<\/li>\n<\/ul>\n<p>\u067e\u0633 \u0627\u0632 \u0622\u0646\u060c \u0627\u0633\u0631\u0627\u0631 \u062e\u0648\u062f \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0641\u0627\u06cc\u0644 env \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/.env.server<\/span>\n<span class=\"nx\">GITHUB_CLIENT_ID<\/span><span class=\"o\">=<\/span><span class=\"nx\">your<\/span><span class=\"o\">-<\/span><span class=\"nx\">github<\/span><span class=\"o\">-<\/span><span class=\"nx\">client<\/span><span class=\"o\">-<\/span><span class=\"nx\">id<\/span>\n<span class=\"nx\">GITHUB_CLIENT_SECRET<\/span><span class=\"o\">=<\/span><span class=\"nx\">your<\/span><span class=\"o\">-<\/span><span class=\"nx\">github<\/span><span class=\"o\">-<\/span><span class=\"nx\">client<\/span><span class=\"o\">-<\/span><span class=\"nx\">secret<\/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_5_%D9%85%D8%B3%DB%8C%D8%B1%D9%87%D8%A7_%D9%88_%D8%B5%D9%81%D8%AD%D8%A7%D8%AA_%D8%B1%D8%A7_%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 5: \u0645\u0633\u06cc\u0631\u0647\u0627 \u0648 \u0635\u0641\u062d\u0627\u062a \u0631\u0627 \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\u060c \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0628\u0647 \u0633\u0627\u062f\u06af\u06cc \u0645\u0642\u062f\u0627\u0631\u06cc \u0645\u0633\u06cc\u0631\u06cc\u0627\u0628\u06cc \u0648 \u0635\u0641\u062d\u0647 \u0644\u0627\u0632\u0645 \u0628\u0631\u0627\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645 &#8211; \u0627\u06cc\u0646 \u0641\u0631\u0622\u06cc\u0646\u062f \u0628\u0633\u06cc\u0627\u0631 \u0633\u0627\u062f\u0647 \u062a\u0631 \u0627\u0633\u062a \u0632\u06cc\u0631\u0627 Wasp \u0641\u0631\u0645 \u0647\u0627\u06cc \u0648\u0631\u0648\u062f \u0648 \u062b\u0628\u062a \u0646\u0627\u0645 \u0631\u0627 \u0627\u0632 \u067e\u06cc\u0634 \u0633\u0627\u062e\u062a\u0647 \u0627\u0633\u062a\u060c \u0645\u0627 \u0628\u0647 \u0633\u0627\u062f\u06af\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ main.wasp<\/span>\n\n<span class=\"nx\">route<\/span> <span class=\"nx\">SignupRoute<\/span> <span class=\"p\">{<\/span> <span class=\"nl\">path<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/signup<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">to<\/span><span class=\"p\">:<\/span> <span class=\"nx\">SignupPage<\/span> <span class=\"p\">}<\/span>\n<span class=\"nx\">page<\/span> <span class=\"nx\">SignupPage<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">component<\/span><span class=\"p\">:<\/span> <span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">SignupPage<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@src\/SignupPage<\/span><span class=\"dl\">\"<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"nx\">route<\/span> <span class=\"nx\">LoginRoute<\/span> <span class=\"p\">{<\/span> <span class=\"nl\">path<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/login<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">to<\/span><span class=\"p\">:<\/span> <span class=\"nx\">LoginPage<\/span> <span class=\"p\">}<\/span>\n<span class=\"nx\">page<\/span> <span class=\"nx\">LoginPage<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">component<\/span><span class=\"p\">:<\/span> <span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">LoginPage<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@src\/LoginPage<\/span><span class=\"dl\">\"<\/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<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ src\/LoginPage.jsx<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Link<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-router-dom<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">LoginForm<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">wasp\/client\/auth<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">LoginPage<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n    <span class=\"p\"><span class=\"nt\">div<\/span> <span class=\"na\">style<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">{<\/span> <span class=\"na\">maxWidth<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">400px<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">margin<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">0 auto<\/span><span class=\"dl\">'<\/span> <span class=\"p\">}<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"p\"><span class=\"nc\">LoginForm<\/span> <span class=\"p\">\/&gt;<\/span>\n      <span class=\"p\"><span class=\"nt\">br<\/span> <span class=\"p\">\/&gt;<\/span>\n      <span class=\"p\"><span class=\"nt\">span<\/span><span class=\"p\">&gt;<\/span>\n        I don't have an account yet (<span class=\"p\"><span class=\"nc\">Link<\/span> <span class=\"na\">to<\/span><span class=\"p\">=<\/span><span class=\"s\">\"\/signup\"<\/span><span class=\"p\">&gt;<\/span>go to signup<span class=\"p\"\/><span class=\"nc\">Link<\/span><span class=\"p\">&gt;<\/span>).\n      <span class=\"p\"\/><span class=\"nt\">span<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\"\/><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\n  <span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/span><\/span><\/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<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ src\/SignupPage.jsx<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Link<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-router-dom<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">SignupForm<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">wasp\/client\/auth<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">SignupPage<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n    <span class=\"p\"><span class=\"nt\">div<\/span> <span class=\"na\">style<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">{<\/span> <span class=\"na\">maxWidth<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">400px<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">margin<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">0 auto<\/span><span class=\"dl\">'<\/span> <span class=\"p\">}<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"p\"><span class=\"nc\">SignupForm<\/span> <span class=\"p\">\/&gt;<\/span>\n      <span class=\"p\"><span class=\"nt\">br<\/span> <span class=\"p\">\/&gt;<\/span>\n      <span class=\"p\"><span class=\"nt\">span<\/span><span class=\"p\">&gt;<\/span>\n        I already have an account (<span class=\"p\"><span class=\"nc\">Link<\/span> <span class=\"na\">to<\/span><span class=\"p\">=<\/span><span class=\"s\">\"\/login\"<\/span><span class=\"p\">&gt;<\/span>go to login<span class=\"p\"\/><span class=\"nc\">Link<\/span><span class=\"p\">&gt;<\/span>).\n      <span class=\"p\"\/><span class=\"nt\">span<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\"\/><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\n  <span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/span><\/span><\/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<p>\u0648 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u0628\u0631\u0627\u06cc \u0645\u062d\u0627\u0641\u0638\u062a \u0627\u0632 \u0645\u0633\u06cc\u0631\u0647\u0627\u060c \u0628\u0647 \u0633\u0627\u062f\u06af\u06cc \u062a\u063a\u06cc\u06cc\u0631 \u0622\u0646 \u0627\u0633\u062a <code>main.wasp<\/code> \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 <strong><code>authRequired: true<\/code><\/strong>  \u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0628\u0647 \u0633\u0627\u062f\u06af\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ main.wasp<\/span>\n<span class=\"nx\">page<\/span> <span class=\"nx\">MainPage<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">component<\/span><span class=\"p\">:<\/span> <span class=\"k\">import<\/span> <span class=\"nx\">Main<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@src\/pages\/Main<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">authRequired<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/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>\u0627\u06af\u0631 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644 \u0631\u0627 \u0639\u0645\u06cc\u0642\u200c\u062a\u0631 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0627\u06cc\u0646 \u0645\u062e\u0632\u0646 \u0631\u0627 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f: wasp\/examples\/todo-typescript \u062f\u0631 \u0632\u0645\u0627\u0646 \u0627\u0646\u062a\u0634\u0627\u0631 \u00b7 wasp-lang\/wasp (github.com).<br \/>\u0645\u06a9\u0627\u0646 \u0639\u0627\u0644\u06cc \u062f\u06cc\u06af\u0631 \u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0627\u0633\u0646\u0627\u062f \u0622\u0646\u0647\u0627 \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0628\u06cc\u0634\u062a\u0631 \u0645\u0648\u0627\u0631\u062f\u06cc \u0631\u0627 \u06a9\u0647 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u06af\u0641\u062a\u0645\u060c \u0648 \u062d\u062a\u06cc \u0628\u06cc\u0634\u062a\u0631 \u0631\u0627 \u067e\u0648\u0634\u0634 \u0645\u06cc\u200c\u062f\u0647\u062f (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c \u0642\u0644\u0627\u0628\u200c\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0648 \u0641\u0648\u0642\u200c\u0627\u0644\u0639\u0627\u062f\u0647\u200c\u0627\u06cc \u06a9\u0647 \u0628\u0627 Wasp v0.14 \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647\u200c\u0627\u0646\u062f)<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/practicaldev\/image\/fetch\/s--3pI_nb2u--\/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800\/https:\/\/media4.giphy.com\/media\/nDSlfqf0gn5g4\/giphy.gif%3Fcid%3D7941fdc6oxsddr7p8rjsuavcyq7ugiad8iqdu1ei25urcge4%26ep%3Dv1_gifs_search%26rid%3Dgiphy.gif%26ct%3Dg\" alt=\"https:\/\/media4.giphy.com\/media\/nDSlfqf0gn5g4\/giphy.gif?cid=7941fdc6oxsddr7p8rjsuavcyq7ugiad8iqdu1ei25urcge4&#038;ep=v1_gifs_search&#038;rid=giphy.gif&#038;ct=g\" loading=\"lazy\" width=\"500\" height=\"380\" data-animated=\"true\" title=\"\"><\/p>\n<p>\u062e\u06cc\u0644\u06cc \u0631\u0627\u062d\u062a \u062a\u0631\u060c \u0627\u06cc\u0646\u0637\u0648\u0631 \u0646\u06cc\u0633\u062a\u061f \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0645\u0631\u0627\u062d\u0644\u06cc \u0631\u0627 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u0646 \u0628\u0647 \u0627\u06cc\u0646\u062c\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0627\u062f\u06cc\u0645 \u0645\u0631\u0648\u0631 \u06a9\u0646\u06cc\u0645:<\/p>\n<ul>\n<li>\u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0645\u0648\u062c\u0648\u062f\u06cc\u062a User \u0631\u0627 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0631\u0627 \u062f\u0631 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u0635\u0644\u06cc Wasp \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0627\u0639\u062a\u0628\u0627\u0631 GitHub OAuth \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f \u0648 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637 \u062e\u0648\u062f \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0645\u0633\u06cc\u0631\u0647\u0627 \u0648 \u0635\u0641\u062d\u0627\u062a \u0631\u0627 \u0628\u0631\u0627\u06cc \u0648\u0631\u0648\u062f \u0648 \u062b\u0628\u062a \u0646\u0627\u0645 \u0628\u0627 \u0627\u062c\u0632\u0627\u06cc \u0627\u0632 \u067e\u06cc\u0634 \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0648 \u0622\u0633\u0627\u0646 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0627\u0632 \u0645\u0633\u06cc\u0631\u0647\u0627 \u0628\u0627 \u0645\u0634\u062e\u0635 \u06a9\u0631\u062f\u0646 \u0645\u062d\u0627\u0641\u0638\u062a \u06a9\u0646\u06cc\u062f <code>authRequired<\/code> \u062f\u0631 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0634\u0645\u0627<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C_%DA%A9%D8%B1%D8%AF%D9%86_Wasp_Auth\"><\/span>\n<p>  \u0633\u0641\u0627\u0631\u0634\u06cc \u06a9\u0631\u062f\u0646 Wasp Auth<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06af\u0631 \u0628\u0647 \u06a9\u0646\u062a\u0631\u0644 \u0648 \u0633\u0641\u0627\u0631\u0634\u06cc\u200c\u0633\u0627\u0632\u06cc \u0628\u06cc\u0634\u062a\u0631 \u0631\u0648\u06cc \u062c\u0631\u06cc\u0627\u0646 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f\u060c Wasp \u0642\u0644\u0627\u0628\u200c\u0647\u0627\u06cc Auth \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u062a\u062c\u0631\u0628\u0647 \u0631\u0627 \u0645\u0637\u0627\u0628\u0642 \u0628\u0627 \u0646\u06cc\u0627\u0632\u0647\u0627\u06cc \u062e\u0627\u0635 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0642\u0644\u0627\u0628\u200c\u0647\u0627 \u0634\u0645\u0627 \u0631\u0627 \u0642\u0627\u062f\u0631 \u0645\u06cc\u200c\u0633\u0627\u0632\u0646\u062f \u062a\u0627 \u06a9\u062f \u0633\u0641\u0627\u0631\u0634\u06cc \u0631\u0627 \u062f\u0631 \u0637\u0648\u0644 \u0645\u0631\u0627\u062d\u0644 \u0645\u062e\u062a\u0644\u0641 \u0641\u0631\u0622\u06cc\u0646\u062f \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f \u0648 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0647\u0631 \u0631\u0641\u062a\u0627\u0631 \u0633\u0641\u0627\u0631\u0634\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062f\u0642\u06cc\u0642 \u062a\u0631 \u062f\u0631 \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0642\u0644\u0627\u0628 \u0647\u0627\u06cc Auth \u0628\u0627 Wasp\u060c \u0628\u0647 \u0645\u0633\u062a\u0646\u062f\u0627\u062a Wasp \u0645\u0631\u0627\u062c\u0639\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A8%D8%AE%D8%B4_%D9%BE%D8%A7%D8%AF%D8%A7%D8%B4_%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86_%D9%88%D8%B1%D9%88%D8%AF_%D8%A8%D9%87_%D8%A7%DB%8C%D9%85%DB%8C%D9%84_%D8%B1%D9%85%D8%B2_%D8%B9%D8%A8%D9%88%D8%B1_%D8%A8%D8%A7_Wasp_%D9%88_%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C_%DA%A9%D8%B1%D8%AF%D9%86_Auth\"><\/span>\n<p>  \u0628\u062e\u0634 \u067e\u0627\u062f\u0627\u0634: \u0627\u0641\u0632\u0648\u062f\u0646 \u0648\u0631\u0648\u062f \u0628\u0647 \u0627\u06cc\u0645\u06cc\u0644 \/ \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0628\u0627 Wasp \u0648 \u0633\u0641\u0627\u0631\u0634\u06cc \u06a9\u0631\u062f\u0646 Auth<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u062d\u0627\u0644\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u062a\u0635\u0648\u0631 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u0645 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u06cc\u0645\u06cc\u0644 \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645 &#8211; \u0628\u0627 \u062a\u0645\u0627\u0645 \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\u06cc \u0645\u0639\u0645\u0648\u0644\u06cc \u06a9\u0647 \u0627\u0646\u062a\u0638\u0627\u0631 \u062f\u0627\u0631\u06cc\u0645 \u0627\u0632 \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 (\u0645\u0627\u0646\u0646\u062f \u0628\u0627\u0632\u0646\u0634\u0627\u0646\u06cc \u0631\u0645\u0632 \u0639\u0628\u0648\u0631\u060c \u062a\u0623\u06cc\u06cc\u062f \u0627\u06cc\u0645\u06cc\u0644\u060c \u0648 \u063a\u06cc\u0631\u0647) \u067e\u06cc\u0631\u0648\u06cc \u06a9\u0646\u062f. <\/p>\n<p>\u0628\u0627 Wasp\u060c \u062a\u0646\u0647\u0627 \u06a9\u0627\u0631\u06cc \u06a9\u0647 \u0645\u0627 \u0628\u0627\u06cc\u062f \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u0645 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0686\u0646\u062f \u062e\u0637 \u0628\u0647 \u0641\u0627\u06cc\u0644 main.wasp \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Wasp \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u06cc\u0645\u06cc\u0644\/\u0631\u0645\u0632 \u0639\u0628\u0648\u0631\u060c \u0628\u0627\u0639\u062b \u0645\u06cc\u200c\u0634\u0648\u062f \u06a9\u0647 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u06a9\u0627\u0631 \u06a9\u0646\u062f!<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/practicaldev\/image\/fetch\/s--hoN2Fp4m--\/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800\/https:\/\/wasp-lang.dev\/img\/auth-ui\/auth-demo-compiler.gif\" alt=\"https:\/\/wasp-lang.dev\/img\/auth-ui\/auth-demo-compiler.gif\" loading=\"lazy\" width=\"800\" height=\"462\" data-animated=\"true\" title=\"\"><\/p>\n<p>Wasp \u0628\u0642\u06cc\u0647 \u06a9\u0627\u0631\u0647\u0627 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u062f\u060c \u0647\u0645\u0686\u0646\u06cc\u0646 \u0627\u062c\u0632\u0627\u06cc \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u062c\u0631\u06cc\u0627\u0646 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0631\u0648\u0627\u0646 \u0648 \u0627\u06cc\u0645\u0646 \u0631\u0627 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/main.wasp<\/span>\n<span class=\"nx\">app<\/span> <span class=\"nx\">myApp<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">wasp<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">version<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">^0.14.0<\/span><span class=\"dl\">\"<\/span>\n  <span class=\"p\">},<\/span>\n  <span class=\"nx\">title<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">My App<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">auth<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ 1. Specify the User entity<\/span>\n    <span class=\"nl\">userEntity<\/span><span class=\"p\">:<\/span> <span class=\"nx\">User<\/span><span class=\"p\">,<\/span>\n    <span class=\"nx\">methods<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"c1\">\/\/ 2. Enable Github Auth<\/span>\n      <span class=\"nl\">gitHub<\/span><span class=\"p\">:<\/span> <span class=\"p\">{},<\/span>\n      <span class=\"nx\">email<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ 3. Specify the email from field<\/span>\n        <span class=\"nl\">fromField<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n          <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">My App Postman<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">email<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">hello@itsme.com<\/span><span class=\"dl\">\"<\/span>\n        <span class=\"p\">},<\/span>\n        <span class=\"c1\">\/\/ 4. Specify the email verification and password reset options<\/span>\n        <span class=\"nx\">emailVerification<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n          <span class=\"nl\">clientRoute<\/span><span class=\"p\">:<\/span> <span class=\"nx\">EmailVerificationRoute<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/this route\/page should be created<\/span>\n        <span class=\"p\">},<\/span>\n        <span class=\"nx\">passwordReset<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n          <span class=\"nl\">clientRoute<\/span><span class=\"p\">:<\/span> <span class=\"nx\">PasswordResetRoute<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/this route\/page should be created<\/span>\n        <span class=\"p\">},<\/span>\n        <span class=\"c1\">\/\/ Add an emailSender -- Dummy just logs to console for dev purposes<\/span>\n        <span class=\"c1\">\/\/ but there are a ton of supported providers :D<\/span>\n        <span class=\"nx\">emailSender<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n          <span class=\"nl\">provider<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Dummy<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">},<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"nx\">onAuthFailedRedirectTo<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/login<\/span><span class=\"dl\">\"<\/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<p>\u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f \u062f\u0631 Next.js \u0628\u0627 \u0644\u0648\u0633\u06cc\u0627 \u06a9\u0627\u0631 \u0628\u0633\u06cc\u0627\u0631 \u0628\u06cc\u0634\u062a\u0631\u06cc \u0631\u0627 \u0645\u06cc\u200c\u0637\u0644\u0628\u062f\u060c \u06a9\u0647 \u0634\u0627\u0645\u0644 \u0645\u062c\u0645\u0648\u0639\u0647\u200c\u0627\u06cc \u0627\u0632 \u0645\u0648\u0627\u0631\u062f \u0645\u062e\u062a\u0644\u0641 \u0627\u0632 \u0627\u0631\u0633\u0627\u0644 \u0627\u06cc\u0645\u06cc\u0644\u200c\u0647\u0627\u060c \u062a\u0648\u0644\u06cc\u062f \u0646\u0634\u0627\u0646\u0647\u200c\u0647\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u0648 \u0645\u0648\u0627\u0631\u062f \u062f\u06cc\u06af\u0631 \u0645\u06cc\u200c\u0634\u0648\u062f. \u0622\u0646\u0647\u0627 \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0648\u0636\u0648\u0639 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0627\u0634\u0627\u0631\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f\u060c \u0627\u0645\u0627 \u062f\u0648\u0628\u0627\u0631\u0647\u060c Wasp&#39;s Auth \u06a9\u0644 \u0641\u0631\u0622\u06cc\u0646\u062f \u0631\u0627 \u0622\u0633\u0627\u0646\u200c\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0648 \u0645\u062c\u0645\u0648\u0639\u0647\u200c\u0627\u06cc \u0627\u0632 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc\u200c\u0647\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0645\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0645\u062c\u0645\u0648\u0639\u0647\u200c\u0627\u06cc \u0627\u0632 \u0645\u0624\u0644\u0641\u0647\u200c\u0647\u0627\u06cc \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u062f\u06cc\u06af\u0631\u060c \u0622\u0645\u0627\u062f\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647\u060c \u0628\u0631\u0627\u06cc \u0633\u0647\u0648\u0644\u062a \u062c\u0632\u0626\u06cc\u0627\u062a UI (\u0645\u062b\u0644\u0627\u064b <code>VerifyEmailForm<\/code>\u060c <code>ForgotPasswordForm<\/code> \u0648 <code>ResetPasswordForm<\/code>).<\/p>\n<p>\u0646\u06a9\u062a\u0647 \u0627\u0635\u0644\u06cc \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u062a\u0641\u0627\u0648\u062a \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648 \u062a\u062c\u0631\u0628\u0647 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u0628\u0647 \u0645\u0646\u0638\u0648\u0631 \u0627\u062c\u0631\u0627\u06cc \u0633\u0646\u0627\u0631\u06cc\u0648\u0647\u0627\u06cc \u0645\u0634\u0627\u0628\u0647 \u0627\u0633\u062a. \u0628\u0631\u0627\u06cc \u067e\u0631\u0648\u0698\u0647 Next.js \u0628\u0627 \u0644\u0648\u0633\u06cc\u0627\u060c \u0627\u06af\u0631 \u0628\u0647 \u062a\u0646\u0647\u0627\u06cc\u06cc \u067e\u06cc\u0634 \u0628\u0631\u0648\u06cc\u062f\u060c \u062d\u062f\u0627\u0642\u0644 \u0686\u0646\u062f \u0633\u0627\u0639\u062a \u0631\u0627 \u0635\u0631\u0641 \u0627\u062c\u0631\u0627\u06cc \u0647\u0645\u0647 \u0686\u06cc\u0632 \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0631\u062f. \u0647\u0645\u06cc\u0646 \u062a\u062c\u0631\u0628\u0647 \u0628\u0627 Wasp \u0628\u06cc\u0634 \u0627\u0632 1 \u0633\u0627\u0639\u062a \u0637\u0648\u0644 \u0646\u0645\u06cc \u06a9\u0634\u062f. \u0628\u0627 \u0628\u0642\u06cc\u0647 \u0632\u0645\u0627\u0646 \u0647\u0627 \u0686\u0647 \u06a9\u0646\u06cc\u0645\u061f <strong>\u0645\u0648\u0627\u0631\u062f \u0645\u0647\u0645\u06cc \u06a9\u0647 \u06a9\u0633\u0628 \u0648 \u06a9\u0627\u0631 \u062e\u0627\u0635 \u0634\u0645\u0627 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f!<\/strong><\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A2%DB%8C%D8%A7_%D9%85%DB%8C_%D8%AA%D9%88%D8%A7%D9%86%DB%8C%D8%AF_%D8%AD%D9%85%D8%A7%DB%8C%D8%AA_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A8%D9%87_%D9%85%D8%A7_%D9%86%D8%B4%D8%A7%D9%86_%D8%AF%D9%87%DB%8C%D8%AF%D8%9F\"><\/span>\n<p>  \u0622\u06cc\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062d\u0645\u0627\u06cc\u062a \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0645\u0627 \u0646\u0634\u0627\u0646 \u062f\u0647\u06cc\u062f\u061f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/practicaldev\/image\/fetch\/s--flPg0LEd--\/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800\/https:\/\/media2.giphy.com\/media\/l0MYAs5E2oIDCq9So\/giphy.gif%3Fcid%3D7941fdc6l6i66eq1dc7i5rz05nkl4mgjltyv206syb0o304g%26ep%3Dv1_gifs_search%26rid%3Dgiphy.gif%26ct%3Dg\" alt=\"https:\/\/media2.giphy.com\/media\/l0MYAs5E2oIDCq9So\/giphy.gif?cid=7941fdc6l6i66eq1dc7i5rz05nkl4mgjltyv206syb0o304g&#038;ep=v1_gifs_search&#038;rid=g.\" loading=\"lazy\" width=\"500\" height=\"312\" data-animated=\"true\" title=\"\"><\/p>\n<p>\u0622\u06cc\u0627 \u0628\u0647 \u0645\u062d\u062a\u0648\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646 \u0639\u0644\u0627\u0642\u0647 \u062f\u0627\u0631\u06cc\u062f\u061f \u0628\u0631\u0627\u06cc \u062e\u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627 \u062b\u0628\u062a \u0646\u0627\u0645 \u06a9\u0646\u06cc\u062f \u0648 \u062f\u0631 GitHub \u0628\u0647 \u0645\u0627 \u06cc\u06a9 \u0633\u062a\u0627\u0631\u0647 \u0628\u062f\u0647\u06cc\u062f! \u0628\u0631\u0627\u06cc \u0627\u062f\u0627\u0645\u0647 \u067e\u0631\u0648\u0698\u0647 \u0647\u0627\u06cc\u0645\u0627\u0646 \u0628\u0647 \u062d\u0645\u0627\u06cc\u062a \u0634\u0645\u0627 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645 \ud83d\ude00<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\"><\/span>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/practicaldev\/image\/fetch\/s--X7nN25vG--\/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800\/https:\/\/media2.giphy.com\/media\/l1AsKaVNyNXHKUkUw\/giphy.gif%3Fcid%3D7941fdc6u6vp4j2gpjfuizupxlvfdzskl03ncci2e7jq17zr%26ep%3Dv1_gifs_search%26rid%3Dgiphy.gif%26ct%3Dg\" alt=\"https:\/\/media2.giphy.com\/media\/l1AsKaVNyNXHKUkUw\/giphy.gif?cid=7941fdc6u6vp4j2gpjfuizupxlvfdzskl03ncci2e7jq17zr&#038;ep=v1_gifs_search&#038;rid=g.\" loading=\"lazy\" width=\"480\" height=\"360\" data-animated=\"true\" title=\"\"><\/p>\n<p>\u0641\u06a9\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0645 \u0627\u06af\u0631 \u062a\u0648\u0633\u0639\u0647\u200c\u062f\u0647\u0646\u062f\u0647\u200c\u0627\u06cc \u0647\u0633\u062a\u06cc\u062f \u06a9\u0647 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0627\u0631\u0647\u0627 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f\u060c \u0627\u062d\u062a\u0645\u0627\u0644\u0627\u064b \u0628\u0647 \u062a\u0641\u0627\u0648\u062a \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u0647\u06cc \u062f\u0631 \u0633\u0637\u0648\u062d \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u0647\u0631 \u062f\u0648\u06cc \u0627\u06cc\u0646 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc\u200c\u0647\u0627 \u0627\u0634\u0627\u0631\u0647 \u06a9\u0631\u062f\u0647\u200c\u0627\u06cc\u062f. <\/p>\n<p>Wasp \u0628\u0627 \u06a9\u0627\u0647\u0634 \u062f\u06cc\u06af \u0628\u062e\u0627\u0631 \u0648 \u0627\u0646\u062a\u0632\u0627\u0639 \u0648\u0638\u0627\u06cc\u0641 \u062a\u06a9\u0631\u0627\u0631\u06cc\u060c \u0628\u0647 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u0627\u06cc\u0646 \u0627\u0645\u06a9\u0627\u0646 \u0631\u0627 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u0628\u0647 \u062c\u0627\u06cc \u06af\u0631\u0641\u062a\u0627\u0631 \u0634\u062f\u0646 \u062f\u0631 \u062c\u0632\u0626\u06cc\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a\u060c \u0628\u06cc\u0634\u062a\u0631 \u0628\u0631 \u0631\u0648\u06cc \u0633\u0627\u062e\u062a \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u0645\u0646\u062d\u0635\u0631 \u0628\u0647 \u0641\u0631\u062f \u062a\u0645\u0631\u06a9\u0632 \u06a9\u0646\u0646\u062f. \u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u0648\u06cc\u0698\u0647 \u0628\u0631\u0627\u06cc \u062a\u06cc\u0645 \u0647\u0627\u06cc \u06a9\u0648\u0686\u06a9 \u06cc\u0627 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u0641\u0631\u062f\u06cc \u06a9\u0647 \u0642\u0635\u062f \u062f\u0627\u0631\u0646\u062f \u0645\u062d\u0635\u0648\u0644\u0627\u062a \u0631\u0627 \u0628\u0647 \u0633\u0631\u0639\u062a \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u0646\u062f \u0645\u0641\u06cc\u062f \u0628\u0627\u0634\u062f.<\/p>\n<p>\u0627\u0644\u0628\u062a\u0647\u060c \u0628\u0647 \u0637\u0648\u0631 \u06a9\u0644\u06cc \u0648\u0642\u062a\u06cc \u0627\u0632 \u0627\u0646\u062a\u0632\u0627\u0639 \u0635\u062d\u0628\u062a \u0645\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0647\u0645\u06cc\u0634\u0647 \u0628\u0627 \u0627\u0632 \u062f\u0633\u062a \u062f\u0627\u062f\u0646 \u0638\u0631\u0627\u0641\u062a \u0627\u062c\u0631\u0627\u06cc \u0634\u062e\u0635\u06cc \u062a\u0631 \u0647\u0645\u0631\u0627\u0647 \u0627\u0633\u062a. \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f\u060c Wasp \u0645\u062c\u0645\u0648\u0639\u0647\u200c\u0627\u06cc \u0627\u0632 \u0645\u0648\u0627\u0631\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u062f\u0631 \u0627\u0637\u0631\u0627\u0641 \u0634\u0645\u0627 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u0627\u0632 \u0644\u0648\u0633\u06cc\u0627 \u062f\u0631 \u067e\u0633\u200c\u0632\u0645\u06cc\u0646\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0633\u0646\u0627\u0631\u06cc\u0648\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0639\u062f\u0645 \u062a\u0637\u0627\u0628\u0642 \u0627\u062c\u0631\u0627\u06cc \u0645\u062d\u062a\u0648\u0627 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f\u060c \u0628\u0633\u06cc\u0627\u0631 \u063a\u06cc\u0631\u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0627\u062a\u0641\u0627\u0642 \u0628\u06cc\u0641\u062a\u062f.<\/p>\n<p>\u0628\u0647 \u0637\u0648\u0631 \u062e\u0644\u0627\u0635\u0647\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0627\u062c\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u062e\u0648\u062f \u0628\u0627 Next.js \u0648 Lucia \u06a9\u0646\u062a\u0631\u0644 \u0648 \u0633\u0641\u0627\u0631\u0634\u06cc \u0633\u0627\u0632\u06cc \u06a9\u0627\u0645\u0644 \u0631\u0627 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u067e\u06cc\u0686\u06cc\u062f\u0647 \u0648 \u0648\u0642\u062a \u06af\u06cc\u0631 \u0628\u0627\u0634\u062f. \u0627\u0632 \u0633\u0648\u06cc \u062f\u06cc\u06af\u0631\u060c \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0627\u0647 \u062d\u0644\u06cc \u0645\u0627\u0646\u0646\u062f Wasp \u0641\u0631\u0622\u06cc\u0646\u062f \u0631\u0627 \u0633\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0637\u0648\u0644 \u06a9\u062f \u0631\u0627 \u06a9\u0627\u0647\u0634 \u0645\u06cc \u062f\u0647\u062f \u0648 \u0633\u0631\u0639\u062a \u062a\u0648\u0633\u0639\u0647 \u0631\u0627 \u0627\u0641\u0632\u0627\u06cc\u0634 \u0645\u06cc \u062f\u0647\u062f. <\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0627\u06af\u0631\u0686\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06cc\u06a9\u06cc \u0627\u0632 \u0645\u062a\u062f\u0627\u0648\u0644\u200c\u062a\u0631\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u0631\u0627\u0647\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641\u06cc \u0628\u0631\u0627\u06cc \u0627\u0646\u062c\u0627\u0645 \u0622\u0646 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u06a9\u0627\u0631 \u0628\u0633\u06cc\u0627\u0631 \u0628\u06cc\u200c\u0627\u0647\u0645\u06cc\u062a \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u067e\u0633\u062a\u060c \u0645\u0646 \u062a\u062c\u0631\u0628\u0647 \u0634\u062e\u0635\u06cc \u062e\u0648\u062f \u0631\u0627 \u0627\u0632 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0644\u0648\u0633\u06cc\u0627 \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0645\u06cc\u200c\u06af\u0630\u0627\u0631\u0645 &#8211; \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0645\u062f\u0631\u0646\u060c \u0686\u0627\u0631\u0686\u0648\u0628-\u0622\u06af\u0646\u0648\u0633\u062a\u06cc\u06a9 \u06a9\u0647 \u062f\u0631 \u0645\u0627\u0647\u200c\u0647\u0627\u06cc \u0627\u062e\u06cc\u0631 \u0645\u0648\u0631\u062f &hellip;<\/p>\n","protected":false},"author":2,"featured_media":74127,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/media.dev.to\/cdn-cgi\/image\/width=1000,height=500,fit=cover,gravity=auto,format=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ugqsevpzw1yh8g3ezr3.png","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-74125","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\/74125","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=74125"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/74125\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/74127"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=74125"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=74125"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=74125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}