{"id":94042,"date":"2025-01-22T04:17:27","date_gmt":"2025-01-22T00:47:27","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/"},"modified":"2025-01-22T04:17:27","modified_gmt":"2025-01-22T00:47:27","slug":"bluesky-oauth2-client-with-vanilla-javascript-1f6h","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/","title":{"rendered":"Bluesky OAuth2 Client\u060c \u0628\u0627 Vanilla JavaScript"},"content":{"rendered":"<div data-article-id=\"2231928\" id=\"article-body\">\n<p>\u0633\u0644\u0627\u0645\u060c \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f! ;^)<\/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 ' ><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D9%85%D9%82%D8%AF%D9%85%D9%87\" >\u0645\u0642\u062f\u0645\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D8%B3%D9%84%D8%A8_%D9%85%D8%B3%D8%A6%D9%88%D9%84%DB%8C%D8%AA\" >\u0633\u0644\u0628 \u0645\u0633\u0626\u0648\u0644\u06cc\u062a<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D9%85%D8%A7\" >\u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%DA%A9%D9%84%D9%85%D9%87_%E2%80%9COAuth%E2%80%9D\" >\u06a9\u0644\u0645\u0647 &#8220;OAuth&#8221;.<\/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\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D9%81%D8%B1%D8%A7%D8%AF%D8%A7%D8%AF%D9%87_%D9%85%D8%B4%D8%AA%D8%B1%DB%8C%E2%80%A6_%D8%A7%DB%8C%D9%86_%DA%86%DB%8C%D8%B3%D8%AA%D8%9F\" >\u0641\u0631\u0627\u062f\u0627\u062f\u0647 \u0645\u0634\u062a\u0631\u06cc&#8230; \u0627\u06cc\u0646 \u0686\u06cc\u0633\u062a\u061f<\/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\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D8%A8%DB%8C%D8%A7%DB%8C%DB%8C%D8%AF_%D8%A7%D8%B2_%E2%80%A6_%DB%8C%DA%A9_%D8%B2%D8%A8%D8%A7%D9%86_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D9%86%D9%88%DB%8C%D8%B3%DB%8C_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%DA%A9%D9%86%DB%8C%D9%85\" >\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0627\u0632 &#8230; \u06cc\u06a9 \u0632\u0628\u0627\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0648\u06cc\u0633\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D9%85%D8%A8%D8%A7%D9%86%DB%8C_%D8%B2%D9%85%DB%8C%D9%86%D9%87\" >\u0645\u0628\u0627\u0646\u06cc: \u0632\u0645\u06cc\u0646\u0647<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D8%AF%D8%B3%D8%AA%D9%87_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1\" >\u062f\u0633\u062a\u0647 \u06a9\u0627\u0631\u0628\u0631<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#DID_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1\" >DID \u06a9\u0627\u0631\u0628\u0631<\/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\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D8%B3%D9%86%D8%AF_DID_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1\" >\u0633\u0646\u062f DID \u06a9\u0627\u0631\u0628\u0631<\/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\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D8%A2%D8%AF%D8%B1%D8%B3_PDS\" >\u0622\u062f\u0631\u0633 PDS<\/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\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D9%81%D8%B1%D8%A7%D8%AF%D8%A7%D8%AF%D9%87_PDS\" >\u0641\u0631\u0627\u062f\u0627\u062f\u0647 PDS<\/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\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%DA%A9%D8%B4%D9%81_%D8%B3%D8%B1%D9%88%D8%B1_%D9%85%D8%AC%D9%88%D8%B2\" >\u06a9\u0634\u0641 \u0633\u0631\u0648\u0631 \u0645\u062c\u0648\u0632<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2_%D9%87%D9%88%DB%8C%D8%AA\" >\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D8%AF%D8%B1%D8%AE%D9%88%D8%A7%D8%B3%D8%AA_PAR\" >\u062f\u0631\u062e\u0648\u0627\u0633\u062a PAR<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2_%D9%87%D9%88%DB%8C%D8%AA_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1\" >\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D8%B5%D9%81%D8%AD%D9%87_%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2_%D9%87%D9%88%DB%8C%D8%AA_Bluesky_OAuth\" >\u0635\u0641\u062d\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a Bluesky OAuth<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D8%B5%D9%81%D8%AD%D9%87_%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1_%D9%85%D8%B3%DB%8C%D8%B1_%D8%AF%D8%A7%D8%AF\" >\u0635\u0641\u062d\u0647 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u0633\u06cc\u0631 \u062f\u0627\u062f<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D8%A8%D9%87_%D8%AA%D9%88%DA%A9%D9%86_%D9%87%D8%A7_%D9%88_%D8%A7%D9%85%D9%86%DB%8C%D8%AA_%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C_%D8%AF%D8%A7%D8%B4%D8%AA%D9%87_%D8%A8%D8%A7%D8%B4%DB%8C%D8%AF\" >\u0628\u0647 \u062a\u0648\u06a9\u0646 \u0647\u0627 \u0648 \u0627\u0645\u0646\u06cc\u062a \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#DPoP\" >DPoP<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1_access_token\" >\u06a9\u0627\u0631\u0628\u0631 access_token<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%D8%AA%D9%85%D8%A7%D8%B3_%D9%87%D8%A7%DB%8C_%D8%A8%D8%B9%D8%AF%DB%8C\" >\u062a\u0645\u0627\u0633 \u0647\u0627\u06cc \u0628\u0639\u062f\u06cc<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/nabfollower.com\/blog\/bluesky-oauth2-client-with-vanilla-javascript-1f6h\/#%DA%A9%D9%84%D9%85%D8%A7%D8%AA_%D9%BE%D8%A7%DB%8C%D8%A7%D9%86%DB%8C\" >\u06a9\u0644\u0645\u0627\u062a \u067e\u0627\u06cc\u0627\u0646\u06cc<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D9%82%D8%AF%D9%85%D9%87\"><\/span>\n<p>  \u0645\u0642\u062f\u0645\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06cc\u0646 \u067e\u0633\u062a \u062f\u0631 \u0645\u0648\u0631\u062f \u0627\u062f\u063a\u0627\u0645 \u0635\u062d\u0628\u062a \u0645\u06cc \u06a9\u0646\u062f <strong>\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a Bluesky<\/strong> (<strong><em>OAuth<\/em><\/strong>  + <strong><em>DPoP<\/em><\/strong>) \u062f\u0631 \u06cc\u06a9 &#8220;<em>\u0628\u062f\u0648\u0646 \u0633\u0631\u0648\u0631<\/em>&#8220;\u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0634\u062a\u0631\u06cc\u060c \u0641\u0642\u0637 \u0628\u0627 \u062d\u06a9\u0645\u0631\u0627\u0646\u06cc&#8221;<em>\u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0648\u0627\u0646\u06cc\u0644\u06cc<\/em>&#8220;.<br \/>\u0628\u0631\u0627\u06cc \u0634\u0645\u0627 \u062e\u0648\u0628\u0647\u061f \u0628\u0627\u0634\u0647&#8230; \u0628\u0631\u06cc\u0645!<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%B3%D9%84%D8%A8_%D9%85%D8%B3%D8%A6%D9%88%D9%84%DB%8C%D8%AA\"><\/span>\n<p>  \u0633\u0644\u0628 \u0645\u0633\u0626\u0648\u0644\u06cc\u062a<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06cc\u0646 \u067e\u0633\u062a \u0635\u0631\u0641\u0627 \u0628\u0631\u0627\u06cc \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0646 \u0627\u0633\u062a&#8221;<em>\u0686\u06af\u0648\u0646\u0647 \u0628\u0647<\/em>&#8220;. \u0627\u06cc\u0646 \u06cc\u06a9&#8221; \u0646\u06cc\u0633\u062a<em>\u0646\u0645\u0648\u0646\u0647 \u06a9\u0627\u0631<\/em>&#8220;\u061b \u0639\u0645\u062f\u062a\u0627\u064b \u0628\u0647 \u062f\u0644\u06cc\u0644 \u0645\u0646\u0642\u0636\u06cc \u0634\u062f\u0646 \u062a\u0648\u06a9\u0646 \u0647\u0627! ;^)<\/p>\n<p>\u062f\u0631 \u0635\u0648\u0631\u062a \u0645\u0634\u0627\u0647\u062f\u0647 \u0647\u0631\u06af\u0648\u0646\u0647 \u062e\u0637\u0627\u06cc\u06cc\u060c \u0644\u0637\u0641\u0627\u064b \u062f\u0631 \u062a\u0645\u0627\u0633 \u0628\u0627 \u0645\u0646 \u0628\u0631\u0627\u06cc \u0627\u0635\u0644\u0627\u062d \u0622\u0646 \u0634\u06a9 \u0646\u06a9\u0646\u06cc\u062f!<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D9%85%D8%A7\"><\/span>\n<p>  \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"%DA%A9%D9%84%D9%85%D9%87_%E2%80%9COAuth%E2%80%9D\"><\/span>\n<p>  \u06a9\u0644\u0645\u0647 &#8220;OAuth&#8221;.<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0641\u0631\u0636 \u06a9\u0646\u06cc\u062f \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u0645 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u062f\u0648\u0646 \u0633\u0631\u0648\u0631 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u06cc\u0645\u060c \u0628\u0631\u0627\u06cc \u0647\u0631 \u06a9\u0633\u06cc \u06a9\u0647 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u062f \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f\u060c <strong>\u0627\u0645\u0627<\/strong> \u0645\u0627 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645 \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u062e\u0648\u062f \u0631\u0627 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0646\u0646\u062f \u062a\u0627 \u0628\u0647 \u0622\u0646 \u062f\u0633\u062a\u0631\u0633\u06cc \u067e\u06cc\u062f\u0627 \u06a9\u0646\u0646\u062f.<\/p>\n<p>\u06cc\u06a9 \u06af\u0632\u06cc\u0646\u0647 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0627\u0632 \u06a9\u0627\u0631\u0628\u0631 \u0648\u0631\u0648\u062f\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062b\u0628\u062a \u0646\u0627\u0645 \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0646\u062f (<em>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u062d\u0633\u0627\u0628 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 &#8220;\u0627\u0639\u062a\u0628\u0627\u0631\u0646\u0627\u0645\u0647&#8221;\u061b \u0645\u0639\u0645\u0648\u0644\u0627<\/em>)\u060c \u062a\u0631\u06a9\u06cc\u0628\u06cc \u0627\u0632 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0628\u0627 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0628\u0631\u0627\u06cc \u0622\u0646 \u062d\u0633\u0627\u0628. \u0627\u0645\u0627 \u0631\u0627\u0647 \u062f\u06cc\u06af\u0631\u06cc \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0622\u0646\u0647\u0627 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 &#8220;<strong><em>\u0627\u0639\u062a\u0645\u0627\u062f<\/em><\/strong>&#8220;\u06cc\u06a9 \u0645\u0642\u0627\u0645 \u0634\u062e\u0635 \u062b\u0627\u0644\u062b.<\/p>\n<p>\u062f\u0631\u0633\u062a \u0645\u062b\u0644 <strong>\u06af\u0648\u06af\u0644<\/strong> \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u062f <strong>\u0628\u0644\u0648\u0627\u0633\u06a9\u06cc<\/strong> \u0647\u0645\u0686\u0646\u06cc\u0646 \u0631\u0627\u0647\u06cc \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 bluesky \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u062f\u0631 \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0644\u0627\u0632\u0645 \u0627\u0633\u062a \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u062a\u0648\u0633\u0637 \u0647\u062f\u0627\u06cc\u062a \u0645\u06cc \u0634\u0648\u062f <strong><code>OAuth2 Protocol<\/code><\/strong>.<\/p>\n<p>\u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631 \u0645\u0648\u0631\u062f \u0646\u062d\u0648\u0647 <strong>OAuth<\/strong> \u062f\u0631 \u062f\u0627\u062e\u0644 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f <strong>\u0628\u0644\u0648\u0627\u0633\u06a9\u06cc<\/strong> \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u06cc\u0627\u0641\u062a: <strong>OAuth &#8211; \u067e\u0631\u0648\u062a\u06a9\u0644 AT<\/strong>.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%81%D8%B1%D8%A7%D8%AF%D8%A7%D8%AF%D9%87_%D9%85%D8%B4%D8%AA%D8%B1%DB%8C%E2%80%A6_%D8%A7%DB%8C%D9%86_%DA%86%DB%8C%D8%B3%D8%AA%D8%9F\"><\/span>\n<p>  \u0641\u0631\u0627\u062f\u0627\u062f\u0647 \u0645\u0634\u062a\u0631\u06cc&#8230; \u0627\u06cc\u0646 \u0686\u06cc\u0633\u062a\u061f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0647 \u0645\u0646\u0638\u0648\u0631 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u062c\u062f\u06cc\u062f \u0645\u0627 (<em>\u0641\u0631\u0636 \u06a9\u0646\u06cc\u062f \u0627\u06cc\u0646 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0627\u0633\u062a<\/em>) \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0627\u0632 \u0627\u06cc\u0646 \u0645\u06a9\u0627\u0646\u06cc\u0633\u0645 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u062f <strong>\u0628\u0644\u0648\u0627\u0633\u06a9\u06cc<\/strong>\u060c \u062e\u062f\u0645\u0627\u062a\/\u0633\u0631\u0648\u0631\u0647\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a Bluesky <strong>\u0628\u0627\u06cc\u062f<\/strong> \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627 \u0631\u0627 \u0628\u0634\u0646\u0627\u0633\u06cc\u062f \u0686\u06af\u0648\u0646\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0622\u0646 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u0645\u061f<br \/>\u0622\u0633\u0627\u0646! \u062a\u0648\u0644\u06cc\u062f \u0627\u0644\u0641 <strong>&#8220;<em>\u0641\u0631\u0627\u062f\u0627\u062f\u0647 \u0645\u0634\u062a\u0631\u06cc<\/em>&#8220;\u0641\u0627\u06cc\u0644<\/strong>\u060c \u06a9\u0647 \u062a\u0645\u0627\u0645 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u0631\u0627 \u06a9\u0647 \u0633\u0631\u0648\u06cc\u0633 \u0647\u0627\/\u0633\u0631\u0648\u0631\u0647\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a Bluesky \u0628\u0631\u0627\u06cc \u0627\u0631\u0627\u0626\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u0646\u062f\u060c \u062f\u0631 \u062e\u0648\u062f \u0646\u06af\u0647 \u0645\u06cc \u062f\u0627\u0631\u062f.<\/p>\n<p>\u0628\u0627 \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644\u060c \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u0628\u0627\u0644\u0627 \u062f\u0631 \u0635\u0641\u062d\u0647 &#8220;\u067e\u0631\u0648\u062a\u06a9\u0644 OAuth&#8221; \u0628\u06cc\u0627\u0646 \u0634\u062f\u060c &#8220;<strong><em>\u062b\u0628\u062a \u062e\u0648\u062f\u06a9\u0627\u0631 \u0645\u0634\u062a\u0631\u06cc \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u0628\u0631\u062f\u0627\u062f\u0647 \u0645\u0634\u062a\u0631\u06cc<\/em><\/strong>&#8220;\u0631\u0648\u06cc\u06a9\u0631\u062f \u062f\u0646\u0628\u0627\u0644 \u0645\u06cc \u0634\u0648\u062f. \u0627\u06cc\u0646 \u0628\u062f\u0627\u0646 \u0645\u0639\u0646\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647&#8221; \u0646\u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f<em>\u062b\u0628\u062a \u0646\u0627\u0645 \u06a9\u0646\u06cc\u062f<\/em>&#8220;\u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u062f\u06cc\u062f \u0645\u0627 \u062f\u0631 \u0647\u0631 \u0633\u0631\u0648\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a\u060c \u06a9\u0627\u0641\u06cc \u0627\u0633\u062a \u06cc\u06a9 &#8220;<em>\u0641\u0631\u0627\u062f\u0627\u062f\u0647<\/em>&#8220;\u0641\u0627\u06cc\u0644 \u0628\u0647 \u0635\u0648\u0631\u062a \u062e\u0648\u062f\u06a9\u0627\u0631 \u06cc\u06a9&#8221;<strong>\u0645\u0634\u062a\u0631\u06cc OAuth Bluesky<\/strong>&#8220;.<\/p>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0639\u0645\u0644 \u06a9\u0646\u062f\u060c \u062a\u0646\u0647\u0627 \u0686\u06cc\u0632\u06cc \u06a9\u0647 \u062f\u0631 \u0633\u06cc\u0633\u062a\u0645 \u062e\u0648\u062f \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645 \u06cc\u06a9 &#8220;<strong><code>client-metadata.json<\/code><\/strong>&#8221; \u0631\u0627 \u0641\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f \u0648 \u0622\u0646 \u0631\u0627 \u062f\u0631 \u0632\u06cc\u0631 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f <strong><code>https:\/\/<\/code><\/strong>  \u067e\u0631\u0648\u062a\u06a9\u0644<\/p>\n<blockquote>\n<p><strong>\u062a\u0648\u062c\u0647<\/strong>: \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0627 \u0647\u0631 \u0646\u0627\u0645\u06cc \u06a9\u0647 \u0628\u062e\u0648\u0627\u0647\u06cc\u0645 \u0646\u0627\u0645\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u0645. \u062d\u062a\u06cc \u0628\u06cc\u0634\u062a\u0631\u060c \u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0622\u0646 \u0631\u0627 \u062f\u0631 \u0647\u0631 \u062c\u0627\u06cc\u06cc \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u0645. \u0627\u06cc\u0646 \u0641\u0642\u0637 \u06cc\u06a9 \u062a\u0648\u0635\u06cc\u0641 \u06a9\u0646\u0646\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<\/blockquote>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0645\u0627 \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645 <strong><code>JSON<\/code><\/strong>  \u0641\u0627\u06cc\u0644\u06cc \u06a9\u0647 \u0633\u0631\u0648\u0631\u0647\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a Bluesky \u0628\u0631\u0627\u06cc \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062e\u0648\u0627\u0647\u0646\u062f \u06a9\u0631\u062f. \u0628\u0631\u0627\u06cc \u0622\u0646\u0647\u0627\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0645\u0627 \u06cc\u06a9 &#8220;<em>\u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u0634\u062a\u0631\u06cc<\/em>\u062a\u0648\u0636\u06cc\u062d \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u0622\u0646 \u0641\u0627\u06cc\u0644 JSON.<\/p>\n<p>&#8220;<em>\u0641\u0627\u06cc\u0644 \u0641\u0631\u0627\u062f\u0627\u062f\u0647<\/em>&#8220;\u060c \u0628\u0631\u0627\u06cc \u0645\u0627&#8221;<em>\u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0634\u062a\u0631\u06cc<\/em>&#8220;\u060c <strong>\u0628\u0627\u06cc\u062f<\/strong> \u0627\u0632 \u0647\u0631 \u06a9\u062c\u0627\u06cc \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0627\u0634\u062f.<\/p>\n<blockquote>\n<p><strong>\u062a\u0648\u062c\u0647<\/strong>: \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 <strong>\u0645\u062b\u0627\u0644<\/strong>\u060c \u0645\u0627 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u062f\u0631 \u0627\u06cc\u0646 url \u0645\u0633\u062a\u0642\u0631 \u06a9\u0631\u062f\u0647 \u0627\u06cc\u0645: https:\/\/madrilenyer.neocities.org\/bsky\/oauth\/client-metadata.json. \u0627\u06af\u0631 \u0631\u0648\u06cc \u0622\u0646 \u0644\u06cc\u0646\u06a9 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f\u060c \u0645\u062d\u062a\u0648\u06cc\u0627\u062a \u0622\u0646 \u0631\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0631\u062f. \u0645\u0633\u062a\u0642\u06cc\u0645\u0627<\/p>\n<\/blockquote>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0628\u0631\u0627\u06cc \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0646 \u06cc\u06a9 \u0645\u062b\u0627\u0644\u060c \u0648 \u067e\u06cc\u0631\u0648\u06cc \u0627\u0632 \u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u0647\u0627\u06cc Bluesky \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0648 \u0627\u06cc\u0646\u062c\u0627\u060c \u0645\u0627 \u06cc\u06a9 &#8221; \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0631\u062f\u0647 \u0627\u06cc\u0645.<em>\u0641\u0627\u06cc\u0644 \u0641\u0631\u0627\u062f\u0627\u062f\u0647<\/em>&#8221; \u06a9\u0647 \u0634\u0628\u06cc\u0647 \u0627\u06cc\u0646 \u0627\u0633\u062a:<\/p>\n<p>client-metadata.json:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"client_id\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"https:\/\/madrilenyer.neocities.org\/bsky\/oauth\/client-metadata.json\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"application_type\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"web\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"grant_types\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"authorization_code\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"refresh_token\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"scope\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"atproto transition:generic transition:chat.bsky\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"response_types\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"code id_token\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"code\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"redirect_uris\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"https:\/\/madrilenyer.neocities.org\/bsky\/oauth\/callback\/\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"dpop_bound_access_tokens\"<\/span><span class=\"p\">:<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"token_endpoint_auth_method\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"none\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"client_name\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"Madrilenyer Example Browser App\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"client_uri\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"https:\/\/madrilenyer.neocities.org\/bsky\/\"<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\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>\u0627\u06cc\u0646 <strong>JSON<\/strong> \u0641\u0627\u06cc\u0644 &#8220;<em>\u062a\u0648\u0635\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u062f<\/em>&#8220;\u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u06cc \u06a9\u0647&#8221;<em>\u0645\u06cc \u062e\u0648\u0627\u0647\u062f \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u00ab\u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0634\u062a\u0631\u06cc\u00bb Bluesky OAuth \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u0634\u0648\u062f<\/em>&#8220;.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646\u060c \u0645\u0627 \u0622\u0645\u0627\u062f\u0647 \u0627\u06cc\u0645 \u062a\u0627 \u0627\u0632 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0646\u06cc\u0645 <strong>\u0628\u0644\u0648\u0627\u0633\u06a9\u06cc<\/strong>.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A8%DB%8C%D8%A7%DB%8C%DB%8C%D8%AF_%D8%A7%D8%B2_%E2%80%A6_%DB%8C%DA%A9_%D8%B2%D8%A8%D8%A7%D9%86_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D9%86%D9%88%DB%8C%D8%B3%DB%8C_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%DA%A9%D9%86%DB%8C%D9%85\"><\/span>\n<p>  \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0627\u0632 &#8230; \u06cc\u06a9 \u0632\u0628\u0627\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0648\u06cc\u0633\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0645\u0634\u06a9\u0644 \u0627\u06cc\u0646\u062c\u0627\u0633\u062a \u06a9\u0647 \u0686\u0646\u062f\u06cc\u0646 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0627\u0632 &#8220;<em>\u0646\u062d\u0648\u0647 \u0627\u0646\u062c\u0627\u0645<\/em>&#8220;\u0627\u06cc\u0646 \u0627\u062f\u063a\u0627\u0645 <strong>\u0627\u0645\u0627<\/strong> \u0628\u0627 \u0686\u0627\u0631\u0686\u0648\u0628 \u0647\u0627\u06cc \u0645\u062f\u0631\u0646 \u0628\u0686\u0647 \u0647\u0627 \u0627\u0632 <strong><code>@atproto.com<\/code><\/strong>  \u06cc\u06a9 \u0628\u0633\u062a\u0647 \u0641\u0648\u0642 \u0627\u0644\u0639\u0627\u062f\u0647 \u0631\u0627 \u062f\u0631 <strong>TypeScript<\/strong> \u0648 \u0628\u0631\u062e\u06cc \u0627\u0632 \u0628\u0686\u0647 \u0647\u0627 \u0631\u0627\u0647 \u062d\u0644 \u0647\u0627\u06cc\u06cc \u0628\u0627 \u0622\u0646 \u062f\u0627\u0631\u0646\u062f <strong>NodeJS<\/strong>.<\/p>\n<p>\u0627\u0645\u0627 \u0634\u062e\u0635\u0627 \u062a\u0631\u062c\u06cc\u062d \u0645\u06cc \u062f\u0647\u0645 &#8220;<em>\u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0648\u0627\u0646\u06cc\u0644\u06cc<\/em>&#8220;\u060c \u0627\u0648\u0644\u060c \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u062f\u0631\u06a9 \u0627\u0635\u0648\u0644 \u0627\u0648\u0644\u06cc\u0647 \u0645\u06a9\u0627\u0646\u06cc\u0633\u0645\u061b \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u06cc\u0627\u062f\u06af\u06cc\u0631\u06cc \u0622\u0646\u060c \u0642\u0628\u0644 \u0627\u0632 \u0634\u0631\u0648\u0639 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 &#8220;<em>\u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647<\/em>&#8221; \u06a9\u0647 \u062a\u0642\u0631\u06cc\u0628\u0627 \u0647\u0645\u0647 \u0631\u0627 \u067e\u0646\u0647\u0627\u0646 \u0645\u06cc \u06a9\u0646\u062f. \u0645\u0634\u06a9\u0644 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f <strong>\u0647\u06cc\u0686 \u0686\u06cc\u0632<\/strong> \u0627\u0648\u0646 \u0628\u06cc\u0631\u0648\u0646&#8230;<\/p>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u06cc\u0646 \u062f\u0644\u06cc\u0644\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0646 \u0627\u06cc\u0646 \u067e\u0633\u062a \u0631\u0627 \u0645\u06cc \u0646\u0648\u06cc\u0633\u0645.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%A8%D8%A7%D9%86%DB%8C_%D8%B2%D9%85%DB%8C%D9%86%D9%87\"><\/span>\n<p>  \u0645\u0628\u0627\u0646\u06cc: \u0632\u0645\u06cc\u0646\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0634\u0647 \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u0627 \u0627\u06cc\u0646\u062c\u0627 \u0647\u0633\u062a\u06cc\u0645.<br \/>\u0645\u0627 \u0633\u0639\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0628\u0647 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0648\u0631\u0648\u062f\u06cc \u0628\u06af\u0648\u06cc\u06cc\u0645 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627 \u062e\u0648\u062f \u0631\u0627 \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u06a9\u0646\u062f.<br \/>\u0648 \u0645\u0627 \u0628\u0647 \u0627\u0648 \u067e\u06cc\u0634\u0646\u0647\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 &#8220;<em>\u0628\u0627 Bluesky \u0648\u0627\u0631\u062f \u0634\u0648\u06cc\u062f<\/em>\u00ab\u060c \u0627\u0645\u0627&#8230; \u0686\u0647 \u06a9\u0646\u06cc\u0645 <strong>\u0648\u0627\u0642\u0639\u0627<\/strong> \u0646\u06cc\u0627\u0632\u061f<br \/>\u062d\u062f\u0627\u0642\u0644 \u062f\u0627\u062f\u0647 \u0627\u06cc \u0627\u0632 \u06a9\u0627\u0631\u0628\u0631 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0627\u0646\u062c\u0627\u0645 \u06cc\u06a9 \u0641\u0631\u0622\u06cc\u0646\u062f \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc \u0628\u0627 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0634\u062f\u0647 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645 \u0686\u0642\u062f\u0631 \u0627\u0633\u062a\u061f<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AF%D8%B3%D8%AA%D9%87_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1\"><\/span>\n<p>  \u062f\u0633\u062a\u0647 \u06a9\u0627\u0631\u0628\u0631<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u0648\u0644 \u0627\u0632 \u0647\u0645\u0647\u060c \u0645\u0627 \u0628\u0647 \u06cc\u06a9 &#8220;<strong>\u062f\u0633\u062a\u0647<\/strong>&#8220;.<br \/>\u062a\u0646\u0647\u0627 \u0686\u06cc\u0632\u06cc \u06a9\u0647 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645 <strong>\u0627\u0632 \u06a9\u0627\u0631\u0628\u0631<\/strong> \u0627\u0648\u0633\u062a <strong>\u062f\u0633\u062a\u0647<\/strong>.<\/p>\n<blockquote>\n<p><strong>\u062a\u0648\u062c\u0647<\/strong>: \u00ab\u062f\u0633\u062a\u0647 \u0628\u0644\u0648\u0633\u06a9\u06cc\u00bb \u062a\u0645\u0627\u0645 \u0645\u062a\u0646\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u00ab\u0646\u0634\u0627\u0646\u06cc \u0627\u06cc\u0646\u062a\u0631\u0646\u062a\u06cc \u0646\u0645\u0627\u06cc\u0647 \u0628\u0644\u0648\u0633\u06a9\u06cc\u00bb \u0634\u0645\u0627 \u0645\u06cc\u200c\u0622\u06cc\u062f. \u0634\u062e\u0635\u06cc\u062a \u0647\u0627\u06cc \u0628\u0639\u062f \u0627\u0632: &#8220;<strong><code>https:\/\/bsky.app\/profile\/_______________________<\/code><\/strong>&#8220;.<\/p>\n<\/blockquote>\n<p>\u0627\u06cc\u0646 \u0645\u0627 &#8220;<strong>Bluesky *\u062f\u0633\u062a\u0647<\/strong><em>&#8220;\u060c \u0645\u0627&#8221;<\/em><em>Bluesky *\u062d\u0633\u0627\u0628<\/em>**&#8221;\u061b \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c \u0645\u0627\u0644 \u0645\u0646 \u0627\u06cc\u0646 \u0627\u0633\u062a: <strong><code>madrilenyer.bsky.social<\/code><\/strong>.<\/p>\n<blockquote>\n<p><strong>\u062a\u0648\u062c\u0647<\/strong>: \u062c\u06cc (<em>\u0645\u062f\u06cc\u0631\u0639\u0627\u0645\u0644 Bluesky<\/em>) \u0645\u062f\u062a\u06cc \u067e\u06cc\u0634 \u067e\u0633\u062a\u06cc \u062f\u0631 \u0627\u06cc\u0646 \u0628\u0627\u0631\u0647 \u0646\u0648\u0634\u062a. \u062f\u0631 \u0635\u0648\u0631\u062a \u0646\u06cc\u0627\u0632\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0631\u0627\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631 \u0645\u0648\u0631\u062f \u062f\u0633\u062a\u0647 \u0647\u0627\u060c PDS \u0647\u0627\u060c \u062d\u0633\u0627\u0628 \u0647\u0627\u060c \u067e\u0631\u0648\u062a\u06a9\u0644 AT \u0628\u0647 Bluesky Docs \u0634\u06cc\u0631\u062c\u0647 \u0628\u0632\u0646\u06cc\u062f.<\/p>\n<\/blockquote>\n<h3><span class=\"ez-toc-section\" id=\"DID_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1\"><\/span>\n<p>  DID \u06a9\u0627\u0631\u0628\u0631<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0634\u0646\u0627\u0633\u06cc\u0645 &#8220;<strong>\u062f\u0633\u062a\u0647<\/strong>&#8220;\u060c \u0627\u0648\u0644\u06cc\u0646 \u0642\u062f\u0645 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u06cc\u062f <strong><code>did<\/code><\/strong>: \u06a9\u0627\u0631\u0628\u0631 &#8220;<em>\u0634\u0646\u0627\u0633\u0647 \u063a\u06cc\u0631\u0645\u062a\u0645\u0631\u06a9\u0632<\/em>&#8220;.<\/p>\n<blockquote>\n<p><strong>\u062a\u0648\u062c\u0647<\/strong>: \u062c\u0647\u0646\u0645 \u0686\u06cc\u0647<em>\u0627\u0646\u062c\u0627\u0645 \u062f\u0627\u062f<\/em>&#8220;\u0648 \u0686\u06af\u0648\u0646\u0647 \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f\u061f \u062e\u0628&#8230; <strong>\u0627\u06cc\u0646\u062c\u0627 \u0631\u0627 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f<\/strong> \u06cc\u0627 <strong>\u0627\u06cc\u0646\u062c\u0627<\/strong><\/p>\n<\/blockquote>\n<p>\u0628\u0631\u0627\u06cc \u062c\u0645\u0639 \u0622\u0648\u0631\u06cc \u06a9\u0627\u0631\u0628\u0631 &#8220;<em>\u0627\u0646\u062c\u0627\u0645 \u062f\u0627\u062f<\/em>&#8220;\u060c \u0645\u0627 \u0628\u0627\u06cc\u062f \u06cc\u06a9 API \u0631\u0627 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u06a9\u0646\u06cc\u0645 (<em>\u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u06af\u0641\u062a\u0645 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a<\/em>): DID \u0631\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u06cc\u062f<br \/>\u0641\u0642\u0637 \u0627\u06cc\u0646 \u0644\u06cc\u0646\u06a9 \u0631\u0627 \u062f\u0631 \u0645\u0631\u0648\u0631\u06af\u0631 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f \u0648 \u0645\u0646\u062a\u0638\u0631 \u0628\u0645\u0627\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u06af\u0631 \u0628\u0647 URL \u0646\u06af\u0627\u0647 \u06a9\u0646\u06cc\u062f\u060c \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647: [https:\/\/bsky.social\/xrpc\/com.atproto.identity.resolveHandle?handle=**madrilenyer.bsky.social**].<br \/>\u0627\u06cc\u0646 \u0628\u062f\u0627\u0646 \u0645\u0639\u0646\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0627 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0627\u06cc\u0646 URL \u0627\u0645\u0627 \u062a\u063a\u06cc\u06cc\u0631 &#8220;<em>\u062f\u0633\u062a\u0647<\/em>&#8220;\u060c \u0634\u0645\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0631\u062f&#8221;<em>\u0627\u0646\u062c\u0627\u0645 \u062f\u0627\u062f<\/em>&#8220;\u0627\u0632 \u0645\u0648\u0627\u0631\u062f \u0645\u0631\u0628\u0648\u0637\u0647&#8221;<em>\u062f\u0633\u062a\u0647<\/em>&#8220;.<\/p>\n<blockquote>\n<p><strong>\u062a\u0648\u062c\u0647<\/strong>: \u0645\u06cc\u062e\u0648\u0627\u06cc \u0645\u0627\u0644 \u062e\u0648\u062f\u062a \u0631\u0648 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u06cc\u061f ;^)<\/p>\n<\/blockquote>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0627\u06cc\u0646 \u062a\u0645\u0627\u0633 \u0645\u0627 \u0631\u0627 \u0628\u0647 \u0645\u0627 \u0646\u0634\u0627\u0646 \u062e\u0648\u0627\u0647\u062f \u062f\u0627\u062f <strong><code>did<\/code><\/strong>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"did\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"did:plc:tjc27aje4uwxtw5ab6wwm4km\"<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\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<blockquote>\n<p><strong>\u062a\u0648\u062c\u0647<\/strong>: \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0647 Bluesky \u0627\u0633\u062a: [<code>madrilenyer.bsky.social<\/code>]\n<\/blockquote>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code>    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"c1\">\/\/   Javascript<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">USER_HANDLE<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">madrilenyer.bsky.social<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">APP_CLIENT_ID<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">https:\/\/madrilenyer.neocities.org\/bsky\/oauth\/client-metadata.json<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">APP_CALLBACK_URL<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">https:\/\/madrilenyer.neocities.org\/bsky\/oauth\/callback\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"kd\">let<\/span> <span class=\"nx\">userDid<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"kd\">let<\/span> <span class=\"nx\">url<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">https:\/\/bsky.social\/xrpc\/com.atproto.identity.resolveHandle?handle=<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">USER_HANDLE<\/span><span class=\"p\">;<\/span>\n    <span class=\"nf\">fetch<\/span><span class=\"p\">(<\/span> <span class=\"nx\">url<\/span> <span class=\"p\">).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Process the HTTP Response<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/span><span class=\"p\">();<\/span>\n    <span class=\"p\">}).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span> <span class=\"nx\">data<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Process the HTTP Response Body<\/span>\n        <span class=\"c1\">\/\/ Here, we gather the \"did\" item in the received json.<\/span>\n        <span class=\"nx\">userDid<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">did<\/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=\"%D8%B3%D9%86%D8%AF_DID_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1\"><\/span>\n<p>  \u0633\u0646\u062f DID \u06a9\u0627\u0631\u0628\u0631<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u06cc\u06a9 \u0628\u0627\u0631 \u0628\u0627 <strong><code>did<\/code><\/strong>\u060c \u0648 \u0628\u0627 \u06a9\u0645\u06a9 <strong><code>PLC API<\/code><\/strong>\u060c \u06af\u0627\u0645 \u0628\u0639\u062f\u06cc \u0645\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0627\u0633\u062a <strong><code>user\/handle's DID Document<\/code><\/strong>.<br \/>\u0645\u0627 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0628\u0627 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u06cc\u06a9 EndPoint API \u062e\u0627\u0635 (<code>https:\/\/plc.directory\/<\/code>) \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0627\u0631\u0628\u0631 <strong>\u0627\u0646\u062c\u0627\u0645 \u062f\u0627\u062f<\/strong> (&#8220;<em>did:plc:tjc27aje4uwxtw5ab6wwm4km<\/em>&#8220;)\u061b \u0645\u0627\u0644 \u06a9\u0627\u0631\u0628\u0631 \u0646\u06cc\u0633\u062a <strong>\u062f\u0633\u062a\u0647<\/strong> (&#8220;<em>madrilenyer.bsky.social<\/em>&#8220;).<\/p>\n<blockquote>\n<p><strong>\u062a\u0648\u062c\u0647<\/strong>: \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0644\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f DID\u060c PLC \u0648 \u063a\u06cc\u0631\u0647 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0628\u0647 \u062f\u0633\u062a \u0622\u0648\u0631\u062f. \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062f\u0642\u06cc\u0642 \u062f\u0631 \u0645\u0648\u0631\u062f <strong><code>DID PLC<\/code><\/strong>  \u0627\u06cc\u0646\u062c\u0627<br \/><strong>\u062a\u0648\u062c\u0647<\/strong>: \u0627\u06cc\u0646 \u0646\u06cc\u0632 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u06a9\u0645\u06a9 \u06a9\u0646\u062f: did:plc Directory Server API (0.1)<\/p>\n<\/blockquote>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0628\u0627 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0622\u0646 URL\u060c \u0645\u0627 <strong><code>DID Document<\/code><\/strong>  (<em>\u062a\u0648\u0633\u0637 Bluesky \u062a\u0648\u0644\u06cc\u062f \u06cc\u0627 \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a<\/em>) \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0627\u06cc\u0646 \u0627\u0633\u062a (<em>\u0641\u0631\u0645\u062a \u0641\u0627\u06cc\u0644 JSON<\/em>):<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"@context\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"https:\/\/www.w3.org\/ns\/did\/v1\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"https:\/\/w3id.org\/security\/multikey\/v1\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"https:\/\/w3id.org\/security\/suites\/secp256k1-2019\/v1\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"id\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"did:plc:tjc27aje4uwxtw5ab6wwm4km\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"alsoKnownAs\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"at:\/\/madrilenyer.bsky.social\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"verificationMethod\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"w\">\n    <\/span><span class=\"p\">{<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"id\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"did:plc:tjc27aje4uwxtw5ab6wwm4km#atproto\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"type\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"Multikey\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"controller\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"did:plc:tjc27aje4uwxtw5ab6wwm4km\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"publicKeyMultibase\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"zQ3shQzL5vznqAdHiD6wvKRfH5xEaDXWpP3JTGQYAfhQo6Dz5\"<\/span><span class=\"w\">\n    <\/span><span class=\"p\">}<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"service\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"w\">\n    <\/span><span class=\"p\">{<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"id\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"#atproto_pds\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"type\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"AtprotoPersonalDataServer\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"serviceEndpoint\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"https:\/\/velvetfoot.us-east.host.bsky.network\"<\/span><span class=\"w\">\n    <\/span><span class=\"p\">}<\/span><span class=\"w\">\n  <\/span><span class=\"p\">]<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\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>\u06a9\u062f\u0646\u0648\u06cc\u0633\u06cc \u0622\u0646 \u062f\u0631 Vanilla JavaScript:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code>    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"c1\">\/\/   Javascript<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">userDidDocument<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">userPDSURL<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"kd\">let<\/span> <span class=\"nx\">url<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">https:\/\/plc.directory\/<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">USER_HANDLE<\/span><span class=\"p\">;<\/span>\n    <span class=\"nf\">fetch<\/span><span class=\"p\">(<\/span> <span class=\"nx\">url<\/span> <span class=\"p\">).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Process the HTTP Response<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/span><span class=\"p\">();<\/span>\n    <span class=\"p\">}).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span> <span class=\"nx\">data<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Process the HTTP Response Body<\/span>\n        <span class=\"nx\">userDidDocument<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">;<\/span>\n        <span class=\"nx\">userPDSURL<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">userDidDocument<\/span><span class=\"p\">.<\/span><span class=\"nx\">service<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">].<\/span><span class=\"nx\">serviceEndpoint<\/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=\"%D8%A2%D8%AF%D8%B1%D8%B3_PDS\"><\/span>\n<p>  \u0622\u062f\u0631\u0633 PDS<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u062f\u0631 \u0622\u0646 \u067e\u0627\u0633\u062e \u0645\u062a\u0648\u062c\u0647 \u0634\u0648\u06cc\u062f\u060c \u062f\u0631 &#8220;<em>\u0633\u0646\u062f \u0627\u0646\u062c\u0627\u0645 \u062f\u0627\u062f<\/em>\u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u0648\u06cc\u0698\u0647 \u062f\u0631 \u0632\u06cc\u0631 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f: <strong><code><did_document>.service.serviceEndpoint<\/did_document><\/code><\/strong>\u060c \u06a9\u0647 \u0628\u0647 \u06cc\u06a9 URL \u0627\u0634\u0627\u0631\u0647 \u0645\u06cc \u06a9\u0646\u062f: <strong><code>https:\/\/velvetfoot.us-east.host.bsky.network<\/code><\/strong><\/p>\n<p>\u0627\u06cc\u0646 \u0622\u062f\u0631\u0633 \u0622\u062f\u0631\u0633 \u0645\u0627\u0633\u062a <strong>\u0633\u0631\u0648\u0631 PDS<\/strong>.<\/p>\n<blockquote>\n<p><strong>\u062a\u0648\u062c\u0647<\/strong>: \u0628\u0627\u0632 \u0647\u0645 &#8230; &#8220;PDS Server&#8221; \u0686\u06cc\u0633\u062a\u061f \u062e\u0648\u0628&#8230; \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f <strong>\u0627\u06cc\u0646\u062c\u0627<\/strong>. \u0628\u0631\u0627\u06cc \u06a9\u0633\u0627\u0646\u06cc \u06a9\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0646\u062f <strong>\u0645\u0627\u0633\u062a\u0648\u062f\u0648\u0646<\/strong> \u062f\u0631\u0633\u062a \u0645\u062b\u0644 \u06cc\u06a9 &#8220;<em>\u0646\u0645\u0648\u0646\u0647<\/em>&#8220;.<\/p>\n<\/blockquote>\n<p>\u0627\u06af\u0631 \u0622\u0646 URL \u0631\u0627 \u062f\u0631 \u0645\u0631\u0648\u0631\u06af\u0631 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f (<em>\u0622\u062f\u0631\u0633 \u0633\u0631\u0648\u0631 PDS\u061b \u062f\u0648\u0628\u0627\u0631\u0647\u060c \u0628\u0631\u0627\u06cc \u0639\u0645\u0648\u0645 \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633 \u0627\u0633\u062a<\/em>\u060c \u062a\u0646\u0647\u0627 \u0686\u06cc\u0632\u06cc \u06a9\u0647 \u0645\u06cc \u0628\u06cc\u0646\u06cc\u062f \u0628\u0627\u06cc\u062f \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u0628\u0627\u0634\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>This is an AT Protocol Personal Data Server (PDS): https:\/\/github.com\/bluesky-social\/atproto\n\nMost API routes are under \/xrpc\/\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 &#8230; \u0627\u06cc\u0646 \u0628\u062f\u0627\u0646 \u0645\u0639\u0646\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0647\u0631 \u0632\u0645\u0627\u0646 \u06a9\u0647 \u0645\u0627 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0686\u06cc\u0632\u06cc \u0627\u0632 \u062e\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645 <strong>\u0633\u0631\u0648\u0631 PDS<\/strong>\u060c \u0628\u0627\u06cc\u062f \u06cc\u06a9 URL \u0628\u0633\u0627\u0632\u06cc\u0645 \u06a9\u0647 \u0628\u0627 \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>https:\/\/velvetfoot.us-east.host.bsky.network\/xrpc\/[whatever_follows]\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%81%D8%B1%D8%A7%D8%AF%D8%A7%D8%AF%D9%87_PDS\"><\/span>\n<p>  \u0641\u0631\u0627\u062f\u0627\u062f\u0647 PDS<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0686\u06cc\u0632 \u062f\u06cc\u06af\u0631\u06cc \u06a9\u0647 \u0628\u0627\u06cc\u062f \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0634\u0648\u062f \u0627\u06cc\u0646 \u0627\u0633\u062a <strong>\u0641\u0631\u0627\u062f\u0627\u062f\u0647 \u0633\u0631\u0648\u0631 PDS<\/strong>. \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u0648\u0644\u06cc\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0633\u0631\u0648\u0631 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u0647\u0645\u0647 \u0642\u0631\u0627\u0631 \u0645\u06cc \u062f\u0647\u062f \u0648 \u062f\u0631 \u0627\u06cc\u0646 URL \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0633\u062a: <code>https:\/\/velvetfoot.us-east.host.bsky.network\/.well-known\/oauth-protected-resource<\/code>.<\/p>\n<p>\u067e\u0627\u0633\u062e \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u0627\u0633\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"resource\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"https:\/\/velvetfoot.us-east.host.bsky.network\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"authorization_servers\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"https:\/\/bsky.social\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"scopes_supported\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"bearer_methods_supported\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"header\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"resource_documentation\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"https:\/\/atproto.com\"<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\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<blockquote>\n<p><strong>\u062a\u0648\u062c\u0647<\/strong>: \u062a\u063a\u06cc\u06cc\u0631 &#8220;<em>\u0646\u0627\u0645 \u0645\u06cc\u0632\u0628\u0627\u0646<\/em>&#8221; \u0628\u062e\u0634\u06cc \u0627\u0632 URL (<em><code>https:\/\/velvetfoot.us-east.host.bsky.network<\/code><\/em>) \u062a\u0648\u0633\u0637 \u06cc\u06a9 \u062c\u0647\u062a \u0645\u06cc\u0632\u0628\u0627\u0646 \u062f\u06cc\u06af\u0631 \u0633\u0631\u0648\u0631 PDS\u060c \u0646\u062a\u0627\u06cc\u062c \u0645\u0634\u0627\u0628\u0647\u06cc \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f.<\/p>\n<\/blockquote>\n<p>\u062f\u0631\u0633\u062a \u0645\u0627\u0646\u0646\u062f \u0642\u0628\u0644\u060c \u062f\u0631 \u0627\u06cc\u0646 JSON \u0646\u06cc\u0632 \u06cc\u06a9 \u0648\u0631\u0648\u062f\u06cc \u0648\u06cc\u0698\u0647 \u062f\u0631 \u0632\u06cc\u0631 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f: <strong><code><pds_metadata>.authorization_servers<\/pds_metadata><\/code><\/strong>\u060c \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u062a\u0646\u0647\u0627 \u0628\u0627 \u06cc\u06a9 \u0648\u0631\u0648\u062f\u06cc (<em>\u062f\u0631 \u0642\u0627\u0644\u0628 JSON\u060c \u06cc\u06a9 \u0622\u0631\u0627\u06cc\u0647 \u0627\u0633\u062a<\/em>) \u0648 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f\u060c \u0627\u06cc\u0646 \u0648\u0631\u0648\u062f\u06cc \u0646\u0634\u0627\u0646 \u062f\u0647\u0646\u062f\u0647 <strong>\u0633\u0631\u0648\u0631 \u0645\u062c\u0648\u0632<\/strong> \u0627\u06cc\u0646 PDS \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f\u060c PDS \u0645\u0627 \u0628\u0647 \u0622\u0646 \u0627\u0634\u0627\u0631\u0647 \u0645\u06cc \u06a9\u0646\u062f <strong>\u0627\u06cc\u0646 \u0633\u0631\u0648\u0631 \u0645\u062c\u0648\u0632<\/strong>: <strong><code>https:\/\/bsky.social<\/code><\/strong>.<\/p>\n<p>\u0627\u06cc\u0646 URL\u060c \u06cc\u06a9\u06cc \u0627\u0632 <strong>\u0633\u0631\u0648\u0631 \u0645\u062c\u0648\u0632<\/strong>\u060c \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0627\u0633\u062a \u0632\u06cc\u0631\u0627 <strong>\u0647\u0631<\/strong> <strong>\u0645\u062d\u0627\u0641\u0638\u062a \u0634\u062f\u0647 \u0627\u0633\u062a<\/strong> \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0647 \u0633\u0631\u0648\u0631 PDS \u0645\u0627\u060c \u0645\u062d\u0627\u0641\u0638\u062a \u0634\u062f\u0647 \u0628\u0627 OAuth2\u060c \u0628\u0647 \u06cc\u06a9 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f <strong>\u062a\u0648\u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631<\/strong>\u060c \u06a9\u0647 \u0641\u0642\u0637 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0628\u0647 \u062f\u0633\u062a \u0622\u0648\u0631\u062f <strong>\u0627\u0632<\/strong> \u0633\u0631\u0648\u0631 \u0645\u062c\u0648\u0632 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u0622\u0646 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0634\u062f\u06cc\u0645.<\/p>\n<p>\u0627\u06cc\u0646 \u0628\u062f\u0627\u0646 \u0645\u0639\u0646\u06cc \u0627\u0633\u062a \u06a9\u0647\u060c \u0627\u0648\u0644 \u0627\u0632 \u0647\u0645\u0647\u060c \u0645\u0627 \u0628\u0627\u06cc\u062f \u062e\u0648\u062f\u0645\u0627\u0646 \u0631\u0627 \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u0622\u0646 \u0633\u0631\u0648\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a\/\u0645\u062c\u0648\u0632 \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u062e\u0635 \u062b\u0627\u0644\u062b \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u0645 \u062a\u0627 &#8220;\u0645\u0627&#8221; \u0631\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u062f.<em>\u062a\u0648\u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631<\/em>&#8221; \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627 <em>\u0647\u0631 \u0627\u0642\u062f\u0627\u0645\u06cc<\/em> \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u062f.<\/p>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u062f\u0631 \u0635\u0648\u0631\u062a \u0648\u062c\u0648\u062f\u060c \u0646\u06af\u0627\u0647\u06cc \u0628\u0647 &#8220;\u0641\u0631\u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0633\u0631\u0648\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a\/\u0645\u062c\u0627\u0632\u0627\u062a&#8221; \u0628\u06cc\u0646\u062f\u0627\u0632\u06cc\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code>    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"c1\">\/\/   Javascript<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">userPDSMetadata<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">userAuthServerURL<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"kd\">let<\/span> <span class=\"nx\">url<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">userPDSURL<\/span> <span class=\"o\">+<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/.well-known\/oauth-protected-resource<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n    <span class=\"nf\">fetch<\/span><span class=\"p\">(<\/span> <span class=\"nx\">url<\/span> <span class=\"p\">).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Process the HTTP Response<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/span><span class=\"p\">();<\/span>\n    <span class=\"p\">}).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span> <span class=\"nx\">data<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Process the HTTP Response Body<\/span>\n        <span class=\"nx\">userPDSMetadata<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">;<\/span>\n        <span class=\"nx\">userAuthServerURL<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">userPDSMetadata<\/span><span class=\"p\">.<\/span><span class=\"nx\">authorization_servers<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/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=\"%DA%A9%D8%B4%D9%81_%D8%B3%D8%B1%D9%88%D8%B1_%D9%85%D8%AC%D9%88%D8%B2\"><\/span>\n<p>  \u06a9\u0634\u0641 \u0633\u0631\u0648\u0631 \u0645\u062c\u0648\u0632<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u06cc \u062c\u0645\u0639 \u0622\u0648\u0631\u06cc \u0627\u0628\u0631\u062f\u0627\u062f\u0647 \u0633\u0631\u0648\u0631 \u0645\u062c\u0648\u0632 \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0646\u06cc\u0632 \u0628\u062e\u0634\u06cc \u0627\u0632 \u067e\u0631\u0648\u062a\u06a9\u0644 OAuth2 \u0627\u0633\u062a (<em>\u0645\u0639\u0631\u0648\u0641 \u0628\u0647: &#8220;\u06a9\u0634\u0641&#8221;<\/em>) \u0648 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627: https:\/\/bsky.social\/.well-known\/oauth-authorization-server \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f<\/p>\n<p>\u0628\u0627\u0631 \u062f\u06cc\u06af\u0631\u060c \u0628\u0631\u0627\u06cc \u0639\u0645\u0648\u0645 \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0633\u062a\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u06af\u0631 \u0631\u0648\u06cc \u0622\u0646 URL \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u0645\u060c \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f. &#8220;<em>\u06a9\u0634\u0641<\/em>\u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0633\u0631\u0648\u0631 \u0645\u062c\u0648\u0632 \u0645\u0627:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"issuer\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"https:\/\/bsky.social\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"scopes_supported\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"atproto\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"transition:generic\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"transition:chat.bsky\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"subject_types_supported\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"public\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"response_types_supported\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"code\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"response_modes_supported\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"query\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"fragment\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"form_post\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"grant_types_supported\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"authorization_code\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"refresh_token\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"code_challenge_methods_supported\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"S256\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"ui_locales_supported\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"en-US\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"display_values_supported\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"page\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"popup\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"touch\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"authorization_response_iss_parameter_supported\"<\/span><span class=\"p\">:<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"request_object_signing_alg_values_supported\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"RS256\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"RS384\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"RS512\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"PS256\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"PS384\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"PS512\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"ES256\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"ES256K\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"ES384\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"ES512\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"none\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"request_object_encryption_alg_values_supported\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"request_object_encryption_enc_values_supported\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"request_parameter_supported\"<\/span><span class=\"p\">:<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"request_uri_parameter_supported\"<\/span><span class=\"p\">:<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"require_request_uri_registration\"<\/span><span class=\"p\">:<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"jwks_uri\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"https:\/\/bsky.social\/oauth\/jwks\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"authorization_endpoint\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"https:\/\/bsky.social\/oauth\/authorize\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"token_endpoint\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"https:\/\/bsky.social\/oauth\/token\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"token_endpoint_auth_methods_supported\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"none\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"private_key_jwt\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"token_endpoint_auth_signing_alg_values_supported\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"RS256\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"RS384\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"RS512\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"PS256\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"PS384\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"PS512\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"ES256\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"ES256K\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"ES384\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"ES512\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"revocation_endpoint\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"https:\/\/bsky.social\/oauth\/revoke\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"introspection_endpoint\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"https:\/\/bsky.social\/oauth\/introspect\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"pushed_authorization_request_endpoint\"<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"https:\/\/bsky.social\/oauth\/par\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"require_pushed_authorization_requests\"<\/span><span class=\"p\">:<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"dpop_signing_alg_values_supported\"<\/span><span class=\"p\">:[<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"RS256\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"RS384\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"RS512\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"PS256\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"PS384\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"PS512\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"ES256\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"ES256K\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"ES384\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"s2\">\"ES512\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"client_id_metadata_document_supported\"<\/span><span class=\"p\">:<\/span><span class=\"kc\">true<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\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>\u0628\u0631\u062e\u06cc \u0627\u0632 \u0648\u0631\u0648\u062f\u06cc\u200c\u0647\u0627 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646 \u0627\u0632 \u0622\u0646\u0647\u0627 \u0628\u0631\u0627\u06cc \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0645\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f<em>\u062a\u0648\u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631<\/em>\u00ab&#8230; \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u0645:<\/p>\n<ul>\n<li>\n<strong><code>authorization_endpoint<\/code><\/strong>: \u0628\u0631\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u062c\u0648\u0632 \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u062a\u0648\u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 \u0627\u06cc\u0646 URL \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645. \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f\u060c \u0627\u06cc\u0646 \u0648\u0631\u0648\u062f\u06cc \u0627\u06cc\u0646 \u0627\u0633\u062a: https:\/\/bsky.social\/oauth\/authorize\n<\/li>\n<li>\n<strong><code>token_endpoint<\/code><\/strong>: \u0627\u06cc\u0646 \u0646\u0634\u0627\u0646\u06cc \u0627\u06cc\u0646\u062a\u0631\u0646\u062a\u06cc \u0628\u0631\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0645\u0632 \u062f\u0633\u062a\u0631\u0633\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0627\u0633\u062a \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f\u060c \u0627\u06cc\u0646 \u0648\u0631\u0648\u062f\u06cc \u0627\u0633\u062a: https:\/\/bsky.social\/oauth\/token\n<\/li>\n<li>\n<strong><code>pushed_authorization_request_endpoint<\/code><\/strong>  (<em>\u062a\u0648\u0633\u0637 EndPoint<\/em>): \u0627\u0644\u0641&#8221;<em>\u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632<\/em>\u062a\u0645\u0627\u0645 \u062a\u0645\u0627\u0633\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0645\u062c\u0648\u0632 \u0628\u0631\u0627\u06cc \u0628\u0647 \u062f\u0633\u062a \u0622\u0648\u0631\u062f\u0646 \u062a\u0648\u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u200c\u0634\u0648\u062f\u060c \u0628\u0627\u06cc\u062f \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0634\u0648\u0646\u062f. <strong>RFC 9126<\/strong><br \/>\n\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f\u060c \u0627\u06cc\u0646 \u0648\u0631\u0648\u062f\u06cc: https:\/\/bsky.social\/oauth\/par\n<\/li>\n<\/ul>\n<p>\u0648 \u0627\u06cc\u0646\u062c\u0627 \u0628\u0647 \u067e\u0627\u06cc\u0627\u0646 \u0645\u06cc \u0631\u0633\u062f &#8220;<em>\u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0639\u0645\u0648\u0645<\/em>&#8221; \u0645\u0631\u0627\u062d\u0644 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627.<br \/>\u0627\u0632 \u0627\u06cc\u0646 \u067e\u0633 \u0628\u0627\u06cc\u062f \u0628\u0647 \u062a\u0648\u0633\u0639\u0647 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0627\u062f\u0627\u0645\u0647 \u062f\u0647\u06cc\u0645. &#8220;\u0628\u0647 \u062f\u0644\u06cc\u0644 \u062f\u06cc\u06af\u0631&#8221;<em>\u0627\u0646\u0648\u0627\u0639 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627<\/em>&#8220;\u0646\u06cc\u0627\u0632 \u0647\u0633\u062a\u0646\u062f\u060c \u0646\u0647 \u0628\u0647 \u0622\u0633\u0627\u0646\u06cc&#8221;<em>\u0627\u06cc\u0646\u062c\u0627 \u0631\u0627 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f<\/em>&#8220;.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code>    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"c1\">\/\/   Javascript<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">userAuthServerDiscovery<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">userAuthorizationEndPoint<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">userTokenEndPoint<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">userPAREndPoint<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"kd\">let<\/span> <span class=\"nx\">url<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">userAuthServerURL<\/span> <span class=\"o\">+<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/.well-known\/oauth-authorization-server<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n    <span class=\"nf\">fetch<\/span><span class=\"p\">(<\/span> <span class=\"nx\">url<\/span> <span class=\"p\">).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Process the HTTP Response<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/span><span class=\"p\">();<\/span>\n    <span class=\"p\">}).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span> <span class=\"nx\">data<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Process the HTTP Response Body<\/span>\n        <span class=\"nx\">userAuthServerDiscovery<\/span>   <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">;<\/span>\n        <span class=\"nx\">userAuthorizationEndPoint<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">userAuthServerDiscovery<\/span><span class=\"p\">.<\/span><span class=\"nx\">authorization_endpoint<\/span><span class=\"p\">;<\/span>\n        <span class=\"nx\">userTokenEndPoint<\/span>         <span class=\"o\">=<\/span> <span class=\"nx\">userAuthServerDiscovery<\/span><span class=\"p\">.<\/span><span class=\"nx\">token_endpoint<\/span><span class=\"p\">;<\/span>\n        <span class=\"nx\">userPAREndPoint<\/span>           <span class=\"o\">=<\/span> <span class=\"nx\">userAuthServerDiscovery<\/span><span class=\"p\">.<\/span><span class=\"nx\">pushed_authorization_request_endpoint<\/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<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2_%D9%87%D9%88%DB%8C%D8%AA\"><\/span>\n<p>  \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06a9\u0645\u06a9\u060c Bluesky \u06cc\u06a9 \u0648\u0631\u0648\u062f\u06cc \u062f\u0627\u0631\u062f \u06a9\u0647 \u062a\u0648\u0636\u06cc\u062d \u0645\u06cc \u062f\u0647\u062f &#8220;<em>\u0686\u06af\u0648\u0646\u0647 \u0628\u0647<\/em>&#8220;\u0647\u0645\u0647 \u0627\u06cc\u0646 \u0645\u0631\u0627\u062d\u0644 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f&#8230; \u0628\u0647 \u062c\u0632 \u0622\u062e\u0631\u06cc\u0646 \u0645\u0648\u0631\u062f. \u0628\u0639\u062f\u0627 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u06cc\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AF%D8%B1%D8%AE%D9%88%D8%A7%D8%B3%D8%AA_PAR\"><\/span>\n<p>  \u062f\u0631\u062e\u0648\u0627\u0633\u062a PAR<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647\u060c \u0645\u0627 \u0628\u0627\u06cc\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a <strong><code>PAR Authorization<\/code><\/strong>; \u0627\u06cc\u0646 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <strong><code>PKCE<\/code><\/strong>.<\/p>\n<p>\u062e\u0644\u0627\u0635\u0647: \u0628\u0631\u0627\u06cc \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u062a\u0648\u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631\u060c \u0628\u0627\u06cc\u062f:<\/p>\n<ol>\n<li>\u062a\u0645\u0627\u0633 \u0628\u06af\u06cc\u0631\u06cc\u062f &#8220;<code>token_endpoint<\/code>&#8220;.<\/li>\n<li>\u0627\u0645\u0627\u060c \u0642\u0628\u0644 \u0627\u0632 \u0622\u0646\u060c \u0628\u0627\u06cc\u062f \u0645\u062c\u0648\u0632 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u0645\u060c \u0628\u0627 \u062a\u0645\u0627\u0633 \u0628\u0627 &#8220;<code>authorization_endpoint<\/code>&#8220;.<\/li>\n<li>\u0648 \u0647\u0645\u0686\u0646\u06cc\u0646\u060c \u0642\u0628\u0644 \u0627\u0632 \u0645\u0631\u0627\u062d\u0644 \u0628\u0627\u0644\u0627\u060c \u0628\u0627\u06cc\u062f \u0628\u0647 \u0633\u0631\u0648\u0631 \u0628\u06af\u0648\u06cc\u06cc\u0645 \u06a9\u0647 \u0642\u0631\u0627\u0631 \u0627\u0633\u062a \u0622\u0646 \u0639\u0645\u0644\u06cc\u0627\u062a \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 &#8221; \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u0645.<strong><code>pushed_authorization_request_endpoint<\/code><\/strong>&#8220;\u060c <strong>\u062a\u0648\u0633\u0637 EndPoint<\/strong>.<\/li>\n<\/ol>\n<blockquote>\n<p><strong>\u062a\u0648\u062c\u0647<\/strong>: <strong>\u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0645\u062c\u0648\u0632 \u062a\u062d\u062a \u0641\u0634\u0627\u0631 OAuth 2.0<\/strong> \u0645\u0634\u062e\u0635\u0627\u062a \u0627\u06cc\u0646\u062c\u0627\u0633\u062a<\/p>\n<\/blockquote>\n<p>\u0628\u0647 \u0645\u0646\u0637\u0642\u0647 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u062e\u0648\u062f \u0628\u0631\u06af\u0631\u062f\u06cc\u0645\u060c \u0628\u0627\u06cc\u062f \u0633\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u0645:<\/p>\n<ul>\n<li>\n<strong>\u062f\u0648\u0644\u062a<\/strong>: \u0627\u0648\u0644\u060c \u0645\u0627 \u0628\u0647 \u06cc\u06a9 &#8220;\u062f\u0648\u0644\u062a&#8221; \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645. \u06cc\u06a9 \u0631\u0634\u062a\u0647 \u0628\u0627 <code>28<\/code> \u0634\u062e\u0635\u06cc\u062a \u0647\u0627\u06cc \u062a\u0635\u0627\u062f\u0641\u06cc \u0628\u0631\u0627\u06cc \u0627\u0647\u062f\u0627\u0641 \u0645\u0627\u060c \u0627\u06cc\u0646 \u0645\u0642\u062f\u0627\u0631 \u0628\u0627\u06cc\u062f: <strong><code>2e94cf77e8b0ba2209dc6dcb90018c8d044ac31cb526fc4823278585<\/code><\/strong>\n<\/li>\n<li>\n<strong>code_verifier<\/strong>: \u0628\u0639\u062f\u0627\u064b \u06cc\u06a9 &#8220;<code>code_verifier<\/code>&#8221; \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0627\u0633\u062a\u061b \u062f\u0631\u0633\u062a \u0645\u0627\u0646\u0646\u062f \u0642\u0628\u0644. \u0628\u0631\u0627\u06cc \u0627\u0647\u062f\u0627\u0641 \u0645\u0627\u060c \u0627\u06cc\u0646 \u0645\u0642\u062f\u0627\u0631 \u0628\u0627\u06cc\u062f: <strong><code>46148ae0fd74b698a5f78efc44a8f76f1fd778602b14b46a2318a814<\/code><\/strong>\n<\/li>\n<li>\n<strong>\u06a9\u062f_\u0686\u0627\u0644\u0634<\/strong>: \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u0627\u0632 &#8220;<code>code_verifier<\/code>&#8220;\u0645\u0627 \u0628\u0627\u06cc\u062f \u06cc\u06a9&#8221; \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u0645<strong><code>code_challenge<\/code><\/strong>\u0627\u0633\u0627\u0633\u0627\u064b \u0627\u06cc\u0646: <code>base64urlencode( sha256( code_verifier ) );<\/code><br \/>\n\u0628\u0631\u0627\u06cc \u0627\u0647\u062f\u0627\u0641 \u0645\u0627\u060c \u0627\u06cc\u0646 \u0645\u0642\u062f\u0627\u0631 \u0628\u0627\u06cc\u062f: <strong><code>URQ-2arwHpJzNwcFPng-_IE3gRGGBN0SVoFMN7wEiWI<\/code><\/strong>\n<\/li>\n<\/ul>\n<blockquote>\n<p><strong>\u062a\u0648\u062c\u0647<\/strong>: \u0645\u0627 \u0628\u0647 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u0646\u06cc\u0627\u0632 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u0634\u062a\u060c \u0627\u0645\u0627 \u0647\u0645\u0647 \u0622\u0646\u0647\u0627 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647 \u0628\u0647 \u062e\u0648\u0628\u06cc \u0634\u0646\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0627\u0646\u062f:<br \/>+ \u0686\u0646\u062f \u062b\u0627\u0628\u062a \u062b\u0627\u0628\u062a (<em>code_challenge_method\u060c \u0645\u062d\u062f\u0648\u062f\u0647<\/em>)<br \/>+ \u0628\u0631\u062e\u06cc \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0627\u0632 \u0645\u0627 <code>client-metadata.json<\/code> \u0641\u0627\u06cc\u0644 (<em>client_id\u060c redirect_uri\u060c login_hint<\/em>)<br \/>+ \u0648 \u0628\u0631\u062e\u06cc \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u062a\u0627\u0632\u0647 \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0647 (<em>\u06a9\u062f_\u0686\u0627\u0644\u0634\u060c \u062d\u0627\u0644\u062a<\/em>)<\/p>\n<\/blockquote>\n<p>\u0627\u06a9\u0646\u0648\u0646\u060c \u0628\u0627 \u062a\u0645\u0627\u0645 \u0622\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u060c \u06cc\u06a9 \u0631\u0627 \u0622\u0645\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <strong><code>POST<\/code><\/strong>  \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 URL \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u062f\u0631 <code>pushed_authorization_request_endpoint<\/code> \u06a9\u0644\u06cc\u062f (<em>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f: <code>https:\/\/bsky.social\/oauth\/par<\/code><\/em>) \u0628\u0627 \u0627\u06cc\u0646\u0647\u0627 <code>content-type<\/code>: <strong><code>application\/x-www-form-urlencoded<\/code><\/strong>\u0648 \u0627\u06cc\u0646 &#8220;<em>\u0628\u062f\u0646<\/em>&#8220;:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>response_type=code&amp;code_challenge_method=S256&amp;scope=atproto+transition%3Ageneric&amp;client_id=https%3A%2F%2Fmadrilenyer.neocities.org%2Fbsky%2Foauth%2Fclient-metadata.json&amp;redirect_uri=https%3A%2F%2Fmadrilenyer.neocities.org%2Fbsky%2Foauth%2Fcallback%2F&amp;code_challenge=URQ-2arwHpJzNwcFPng-_IE3gRGGBN0SVoFMN7wEiWI&amp;state=2e94cf77e8b0ba2209dc6dcb90018c8d044ac31cb526fc4823278585&amp;login_hint=madrilenyer.bsky.social\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>\u062a\u0642\u0633\u06cc\u0645 \u0634\u062f\u0647:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>  response_type=code\n    &amp;code_challenge_method=S256\n    &amp;scope=atproto+transition%3Ageneric\n    &amp;client_id=https%3A%2F%2Fmadrilenyer.neocities.org%2Fbsky%2Foauth%2Fclient-metadata.json\n    &amp;redirect_uri=https%3A%2F%2Fmadrilenyer.neocities.org%2Fbsky%2Foauth%2Fcallback%2F\n    &amp;code_challenge=URQ-2arwHpJzNwcFPng-_IE3gRGGBN0SVoFMN7wEiWI\n    &amp;state=2e94cf77e8b0ba2209dc6dcb90018c8d044ac31cb526fc4823278585\n    &amp;login_hint=madrilenyer.bsky.social\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>\u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0645\u0627 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <strong><code>state<\/code><\/strong>  \u0648 <strong><code>code_challenge<\/code><\/strong>; \u0646\u0647 <strong><code>code_challenge<\/code><\/strong>; \u0645\u0627 \u0627\u0632 \u0627\u06cc\u0646 \u0622\u062e\u0631\u06cc\u0646 \u0645\u0642\u062f\u0627\u0631 \u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0686\u06cc\u0632\u0647\u0627 \u0628\u0639\u062f\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u06cc\u06a9 \u0646\u0645\u0648\u0646\u0647 \u0627\u0632 \u067e\u0627\u0633\u062e \u0627\u0633\u062a (<strong><em><code>201 (Created)<\/code><\/em><\/strong>):<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"request_uri\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"urn:ietf:params:oauth:request_uri:req-df74117722b7f1e7d807d4244a8dae0a\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"expires_in\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"mi\">299<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\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>\u0645\u0627 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645 <code>request_uri<\/code> \u0645\u0648\u0631\u062f \u0628\u0631\u0627\u06cc \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u06cc<br \/>\u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u062f\u0631 \u0633\u0631\u0641\u0635\u0644 \u0647\u0627\u06cc \u067e\u0627\u0633\u062e \u0645\u06cc \u062a\u0648\u0627\u0646 \u0628\u0647 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u067e\u06cc \u0628\u0631\u062f: [<strong><code>DPoP-Nonce<\/code><\/strong>] \u0633\u0631\u0628\u0631\u06af\u061b \u0645\u0639\u0631\u0648\u0641 \u0628\u0647 &#8220;<strong><em>nonce<\/em><\/strong>\u0645\u0627 \u0628\u0639\u062f\u0627\u064b \u0628\u0647 \u0627\u0631\u0632\u0634 \u0622\u0646 \u0646\u06cc\u0627\u0632 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u0634\u062a.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code>    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"c1\">\/\/   Javascript<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">dpopNonce<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">userAuthServerRequestURI<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ The AuthServer Discovery Information<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">url<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">userAuthServerURL<\/span> <span class=\"o\">+<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/.well-known\/oauth-authorization-server<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n    <span class=\"nf\">fetch<\/span><span class=\"p\">(<\/span> <span class=\"nx\">url<\/span> <span class=\"p\">).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Process the HTTP Response<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/span><span class=\"p\">();<\/span>\n    <span class=\"p\">}).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span> <span class=\"nx\">data<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Process the HTTP Response Body<\/span>\n        <span class=\"nx\">userAuthServerDiscovery<\/span>   <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">;<\/span>\n        <span class=\"nx\">userAuthorizationEndPoint<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">userAuthServerDiscovery<\/span><span class=\"p\">.<\/span><span class=\"nx\">authorization_endpoint<\/span><span class=\"p\">;<\/span>\n        <span class=\"nx\">userTokenEndPoint<\/span>         <span class=\"o\">=<\/span> <span class=\"nx\">userAuthServerDiscovery<\/span><span class=\"p\">.<\/span><span class=\"nx\">token_endpoint<\/span><span class=\"p\">;<\/span>\n        <span class=\"nx\">userPAREndPoint<\/span>           <span class=\"o\">=<\/span> <span class=\"nx\">userAuthServerDiscovery<\/span><span class=\"p\">.<\/span><span class=\"nx\">pushed_authorization_request_endpoint<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">});<\/span>\n\n    <span class=\"c1\">\/\/ The state<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">stateArray<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Uint32Array<\/span><span class=\"p\">(<\/span><span class=\"mi\">28<\/span><span class=\"p\">);<\/span>\n    <span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">crypto<\/span><span class=\"p\">.<\/span><span class=\"nf\">getRandomValues<\/span><span class=\"p\">(<\/span><span class=\"nx\">stateArray<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">state<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">Array<\/span><span class=\"p\">.<\/span><span class=\"k\">from<\/span><span class=\"p\">(<\/span><span class=\"nx\">stateArray<\/span><span class=\"p\">,<\/span> <span class=\"nx\">dec<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">0<\/span><span class=\"dl\">'<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">dec<\/span><span class=\"p\">.<\/span><span class=\"nf\">toString<\/span><span class=\"p\">(<\/span><span class=\"mi\">16<\/span><span class=\"p\">)).<\/span><span class=\"nf\">substr<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">2<\/span><span class=\"p\">)).<\/span><span class=\"nf\">join<\/span><span class=\"p\">(<\/span><span class=\"dl\">''<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"c1\">\/\/ The code verifier<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">codeVerifierArray<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Uint32Array<\/span><span class=\"p\">(<\/span><span class=\"mi\">28<\/span><span class=\"p\">);<\/span>\n    <span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">crypto<\/span><span class=\"p\">.<\/span><span class=\"nf\">getRandomValues<\/span><span class=\"p\">(<\/span><span class=\"nx\">codeVerifierArray<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">codeVerifier<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">Array<\/span><span class=\"p\">.<\/span><span class=\"k\">from<\/span><span class=\"p\">(<\/span><span class=\"nx\">codeVerifierArray<\/span><span class=\"p\">,<\/span> <span class=\"nx\">dec<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">0<\/span><span class=\"dl\">'<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">dec<\/span><span class=\"p\">.<\/span><span class=\"nf\">toString<\/span><span class=\"p\">(<\/span><span class=\"mi\">16<\/span><span class=\"p\">)).<\/span><span class=\"nf\">substr<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">2<\/span><span class=\"p\">)).<\/span><span class=\"nf\">join<\/span><span class=\"p\">(<\/span><span class=\"dl\">''<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"c1\">\/\/ The code verifier challenge<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">hashedCodeVerifier<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">sha256<\/span><span class=\"p\">(<\/span><span class=\"nx\">codeVerifier<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">codeChallenge<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">base64urlencode<\/span><span class=\"p\">(<\/span><span class=\"nx\">hashedCodeVerifier<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"c1\">\/\/ Build up the URL.<\/span>\n    <span class=\"c1\">\/\/ Just, to make it simple! I know there are better ways to do this, BUT...<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">url<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">userPAREndPoint<\/span><span class=\"p\">;<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">body<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">response_type=code<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n    <span class=\"nx\">body<\/span> <span class=\"o\">+=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">&amp;code_challenge_method=S256<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n    <span class=\"nx\">body<\/span> <span class=\"o\">+=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">&amp;scope=<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nf\">encodeURIComponent<\/span><span class=\"p\">(<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">atproto transition:generic<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">);<\/span> <span class=\"c1\">\/\/ MUST match the scopes in the client-metadata.json<\/span>\n    <span class=\"nx\">body<\/span> <span class=\"o\">+=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">&amp;client_id=<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nf\">encodeURIComponent<\/span><span class=\"p\">(<\/span> <span class=\"nx\">APP_CLIENT_ID<\/span> <span class=\"p\">);<\/span>\n    <span class=\"nx\">body<\/span> <span class=\"o\">+=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">&amp;redirect_uri=<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nf\">encodeURIComponent<\/span><span class=\"p\">(<\/span> <span class=\"nx\">APP_CALLBACK_URL<\/span> <span class=\"p\">);<\/span>\n    <span class=\"nx\">body<\/span> <span class=\"o\">+=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">&amp;code_challenge=<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">codeChallenge<\/span><span class=\"p\">;<\/span>\n    <span class=\"nx\">body<\/span> <span class=\"o\">+=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">&amp;state=<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">state<\/span><span class=\"p\">;<\/span>\n    <span class=\"nx\">body<\/span> <span class=\"o\">+=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">login_hint=<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">USER_HANDLE<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ TuneUp and perform the call<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">fetchOptions<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">method<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">POST<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n            <span class=\"dl\">'<\/span><span class=\"s1\">Content-Type<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">application\/x-www-form-urlencoded<\/span><span class=\"dl\">\"<\/span>\n        <span class=\"p\">},<\/span>\n        <span class=\"na\">body<\/span><span class=\"p\">:<\/span> <span class=\"nx\">body<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"nf\">fetch<\/span><span class=\"p\">(<\/span> <span class=\"nx\">url<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fetchOptions<\/span> <span class=\"p\">).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Process the HTTP Response<\/span>\n        <span class=\"nx\">dpopNonce<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nx\">headers<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">dpop-nonce<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">);<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/span><span class=\"p\">();<\/span>\n    <span class=\"p\">}).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span> <span class=\"nx\">data<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Process the HTTP Response Body<\/span>\n        <span class=\"nx\">userAuthServerRequestURI<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">request_uri<\/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=\"%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2_%D9%87%D9%88%DB%8C%D8%AA_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1\"><\/span>\n<p>  \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0645\u0627 \u0628\u0647 \u0627\u0646\u062f\u0627\u0632\u0647 \u06a9\u0627\u0641\u06cc \u0628\u0631\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0632 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u0633\u0631\u0648\u0631 Bluesky &#8230; \u0686\u06af\u0648\u0646\u0647\u061f<\/p>\n<p>\u062e\u0648\u0628\u060c \u0645\u0627 \u0628\u0627\u06cc\u062f &#8220;<em>\u0633\u0627\u062e\u062a\u0646<\/em>\u06cc\u06a9 URL \u062c\u062f\u06cc\u062f \u0628\u0631\u0627\u06cc \u0647\u062f\u0627\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 \u0622\u0646.<br \/>\u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0627\u06cc\u0646 \u0627\u0633\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>[`authorization_endpoint`]?client_id=[client_id]&amp;request_uri=[`request_uri`]\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<blockquote>\n<p><strong>\u062a\u0648\u062c\u0647<\/strong>: \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc URL \u0628\u0627\u06cc\u062f \u06a9\u062f\u06af\u0630\u0627\u0631\u06cc \u0634\u0648\u0646\u062f. \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0627\u06cc\u0646 \u0631\u0645\u0632\u06af\u0630\u0627\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f\u060c \u0641\u06a9\u0631 \u0645\u06cc \u06a9\u0646\u0645 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f <code>encodeURIComponent<\/code><\/p>\n<\/blockquote>\n<p>\u062f\u0631 \u0645\u0648\u0631\u062f \u0645\u0627\u060c URL \u0645\u0627 \u0628\u0647 \u0627\u06cc\u0646 \u0634\u06a9\u0644 \u0627\u0633\u062a (<em>\u0627\u0631\u0632\u0634 \u0647\u0627 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u06cc\u06a9\u0633\u0627\u0646 \u0646\u0628\u0627\u0634\u0646\u062f<\/em>):<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>https:\/\/bsky.social\/oauth\/authorize?client_id=https%3A%2F%2Fmadrilenyer.neocities.org%2Fbsky%2Foauth%2Fclient-metadata.json&amp;request_uri%3Durn%3Aietf%3Aparams%3Aoauth%3Arequest_uri%3Areq-df74117722b7f1e7d807d4244a8dae0a\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>\u06a9\u062f\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647 \u062f\u0631 Vanilla Javascript \u0645\u0627:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code>    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"c1\">\/\/   Javascript<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n\n    <span class=\"c1\">\/\/ Buld up the URL.<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">url<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">userAuthorizationEndPoint<\/span><span class=\"p\">;<\/span>\n    <span class=\"nx\">url<\/span> <span class=\"o\">+=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">?client_id=<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nf\">encodeURIComponent<\/span><span class=\"p\">(<\/span> <span class=\"nx\">APP_CLIENT_ID<\/span> <span class=\"p\">);<\/span>\n    <span class=\"nx\">url<\/span> <span class=\"o\">+=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">&amp;request_uri=<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nf\">encodeURIComponent<\/span><span class=\"p\">(<\/span> <span class=\"nx\">userAuthServerRequestURI<\/span> <span class=\"p\">);<\/span>\n\n    <span class=\"c1\">\/\/ Redirect the user to the Bluesky Auth Page<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">location<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">url<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%B5%D9%81%D8%AD%D9%87_%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2_%D9%87%D9%88%DB%8C%D8%AA_Bluesky_OAuth\"><\/span>\n<p>  \u0635\u0641\u062d\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a Bluesky OAuth<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06cc\u0646 URL (<em>\u062e\u0648\u0628 &#8230; &#8220;\u0645\u0634\u0627\u0628\u0647&#8221;; \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0627\u0639\u062a\u0628\u0627\u0631 \u062d\u062f\u0648\u062f \u0686\u0646\u062f \u062f\u0642\u06cc\u0642\u0647 \u0627\u0633\u062a\u060c \u0627\u06af\u0631 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f\u060c \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0635\u0641\u062d\u0647 \u062e\u0637\u0627\u06cc\u06cc \u0631\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u06cc\u062f<\/em>) \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0647 \u0635\u0641\u062d\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a Bluesky \u0647\u062f\u0627\u06cc\u062a \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0635\u0641\u062d\u0647\u060c \u0633\u0631\u0648\u0631 \u0627\u0632 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f \u062a\u0627 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0648 \u062f\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a\u060c \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u062c\u0627\u0632\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0634\u0645\u0627 \u0631\u0627 \u0628\u062f\u0647\u062f.<code>acess_token<\/code>&#8220;\u0627\u062c\u0631\u0627 \u06a9\u0631\u062f\u0646&#8221;<code>things<\/code>&#8220;\u0628\u0647 \u0646\u0627\u0645 \u062a\u0648<\/p>\n<p>\u062f\u0631\u0633\u062a \u0645\u062b\u0644 \u06af\u0648\u06af\u0644\u060c \u0627\u06cc\u0646\u0637\u0648\u0631 \u0646\u06cc\u0633\u062a\u061f ;^)<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%B5%D9%81%D8%AD%D9%87_%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1_%D9%85%D8%B3%DB%8C%D8%B1_%D8%AF%D8%A7%D8%AF\"><\/span>\n<p>  \u0635\u0641\u062d\u0647 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u0633\u06cc\u0631 \u062f\u0627\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06af\u0631 \u062f\u0631 \u0622\u0646 \u0635\u0641\u062d\u0647 (<em>\u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f\u060c &#8220;\u0635\u0641\u062d\u0647 \u0645\u062c\u0648\u0632 Bluesky&#8221;<\/em>) \u06a9\u0627\u0631\u0628\u0631 <strong>\u0645\u0648\u0627\u0641\u0642 \u0627\u0633\u062a<\/strong> \u0648 <strong>\u0645\u06cc \u067e\u0630\u06cc\u0631\u062f<\/strong> \u0628\u0631\u0627\u06cc \u062f\u0627\u062f\u0646 \u0645\u062c\u0648\u0632 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 &#8220;<em>\u062a\u0648\u06a9\u0646 \u06a9\u0627\u0631\u0628\u0631<\/em>&#8220;\u060c \u0633\u067e\u0633 \u0633\u0631\u0648\u0631 \u0645\u0631\u0648\u0631\u06af\u0631 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0647 &#8220;\u0635\u0641\u062d\u0647 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u0633\u06cc\u0631\/\u0628\u0627\u0632\u062e\u0648\u0627\u0646\u06cc&#8221; \u0647\u062f\u0627\u06cc\u062a \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u06cc\u0627\u062f\u062a \u0628\u0627\u0634\u0647 \u06a9\u0647 &#8220;<code>redirect_uri<\/code>&#8220;\u067e\u0627\u0631\u0627\u0645\u062a\u0631 \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647&#8221;<code>PAR Request<\/code>\u0628\u0627\u0644\u0627&#8221;\u061f \u0628\u0644\u0647\u060c <strong>\u0622\u0646 \u067e\u0627\u0631\u0627\u0645\u062a\u0631<\/strong>; \u06cc\u06a9\u06cc \u0627\u0632 \u0645\u0648\u0627\u0631\u062f\u06cc \u06a9\u0647 \u062f\u0631 &#8220;<code>client-metadata.json<\/code>&#8221; \u0641\u0627\u06cc\u0644\u060c \u062f\u0631 \u0632\u06cc\u0631 <strong>\u0622\u0631\u0627\u06cc\u0647<\/strong> (<em>\u0628\u0644\u0647\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0686\u0646\u062f\u06cc\u0646 URL \u0628\u0631\u0627\u06cc \u067e\u0627\u0633\u062e \u0628\u0647 \u062a\u0645\u0627\u0633 \u0627\u0639\u0644\u0627\u0645 \u06a9\u0646\u06cc\u062f<\/em>) \u0628\u0627 \u06a9\u0644\u06cc\u062f \u0645\u0634\u062e\u0635 \u0645\u06cc \u0634\u0648\u062f: <strong><code>redirect_uris<\/code><\/strong>.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646\u060c \u062c\u0631\u06cc\u0627\u0646 \u0628\u0647 \u06a9\u0646\u062a\u0631\u0644 \u0645\u0627 \u0628\u0627\u0632 \u0645\u06cc \u06af\u0631\u062f\u062f. \u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 &#8220;<em>\u0635\u0641\u062d\u0647 \u0628\u0631\u06af\u0634\u062a \u0628\u0647 \u062a\u0645\u0627\u0633<\/em>&#8220;\u060c \u0645\u0627 \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0622\u0646 \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f <strong>\u0627\u06cc\u0646<\/strong>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>https:\/\/madrilenyer.neocities.org\/bsky\/oauth\/callback\/?iss=https%3A%2F%2Fbsky.social&amp;state=4e47aaac8cbd35ed1a2afff53ce6f4511898d7c2ef0e47b37d77110f&amp;code=cod-b17f75f356b83f35e99c4d7664ed30442a9c79c5c37ecf88261d77db799d0c0f\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>\u062a\u0642\u0633\u06cc\u0645 \u0634\u062f\u0647:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>https:\/\/madrilenyer.neocities.org\/bsky\/oauth\/callback\/\n    ?iss=https%3A%2F%2Fbsky.social\n    &amp;state=4e47aaac8cbd35ed1a2afff53ce6f4511898d7c2ef0e47b37d77110f\n    &amp;code=cod-b17f75f356b83f35e99c4d7664ed30442a9c79c5c37ecf88261d77db799d0c0f\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>\u0633\u0647 \u067e\u0627\u0631\u0627\u0645\u062a\u0631:<\/p>\n<ul>\n<li>\n<strong><code>iss<\/code><\/strong>: &#8220;<em>\u0627\u062e\u062a\u06cc\u0627\u0631<\/em>&#8220;\u061b \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f\u060c URL \u0633\u0631\u0648\u0631 \u0645\u062c\u0648\u0632 Bluesky<\/li>\n<li>\n<strong><code>state<\/code><\/strong>: &#8220;<em><code>state<\/code><\/em>&#8220;\u067e\u0627\u0631\u0627\u0645\u062a\u0631\u06cc \u06a9\u0647 \u0642\u0628\u0644\u0627 \u062f\u0631 \u0642\u0633\u0645\u062a \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>PAR Request<\/code>\u060c \u0648<\/li>\n<li>\n<strong><code>code<\/code><\/strong>: \u0627\u0644\u0641 (<em>\u06cc\u06a9\u0628\u0627\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647<\/em>) \u06a9\u062f\u06cc \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0631\u0627\u06cc \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0631\u0645\u0632 \u062f\u0633\u062a\u0631\u0633\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0627\u0632 \u0633\u0631\u0648\u0631 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f.\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code>    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"c1\">\/\/   Javascript<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">receivedIss<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">receivedState<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">receivedCode<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Let's retrieve the values from the URL.<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"c1\">\/\/ Retrieve the URL.<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">thisURL<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">URL<\/span><span class=\"p\">(<\/span><span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">location<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"c1\">\/\/ Retrieve the \"search\" part from the url<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">parsedSearch<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">URLSearchParams<\/span><span class=\"p\">(<\/span><span class=\"nx\">thisURL<\/span><span class=\"p\">.<\/span><span class=\"nx\">search<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"c1\">\/\/ Retrieve the data.<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">receivedIss<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">parsedSearch<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">iss<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">receivedState<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">parsedSearch<\/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\">let<\/span> <span class=\"nx\">receivedCode<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">parsedSearch<\/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\n    <span class=\"c1\">\/\/ We should include here some checks (the 'iss', the 'state'...), BUT...<\/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<h2><span class=\"ez-toc-section\" id=\"%D8%A8%D9%87_%D8%AA%D9%88%DA%A9%D9%86_%D9%87%D8%A7_%D9%88_%D8%A7%D9%85%D9%86%DB%8C%D8%AA_%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C_%D8%AF%D8%A7%D8%B4%D8%AA%D9%87_%D8%A8%D8%A7%D8%B4%DB%8C%D8%AF\"><\/span>\n<p>  \u0628\u0647 \u062a\u0648\u06a9\u0646 \u0647\u0627 \u0648 \u0627\u0645\u0646\u06cc\u062a \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u0645\u0627 \u0647\u0646\u0648\u0632 \u06cc\u06a9 \u0645\u0634\u06a9\u0644 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f\u061b \u0628\u0631\u0627\u06cc \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0631\u0645\u0632 \u062f\u0633\u062a\u0631\u0633\u06cc \u06a9\u0627\u0631\u0628\u0631\u060c \u0633\u0631\u0648\u0631 \u0627\u0632 \u0645\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u062f \u06a9\u0647 <em>\u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc<\/em> \u06a9\u0647 \u0645\u0627 \u06a9\u0633\u06cc \u0647\u0633\u062a\u06cc\u0645 \u06a9\u0647 \u062a\u0648\u06a9\u0646 \u0631\u0627 \u0627\u062f\u0627\u0631\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f. \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0686\u06af\u0648\u0646\u0647 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u062f\u061f<\/p>\n<p>\u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f &#8220;<em>\u062c\u062f\u06cc\u062f<\/em>\u0645\u0634\u062e\u0635\u0627\u062a\u060c \u062a\u062d\u062a \u067e\u0631\u0648\u062a\u06a9\u0644 OAuth\u060c \u0628\u0647 \u0646\u0627\u0645:<strong>\u0627\u062b\u0628\u0627\u062a \u0645\u0627\u0644\u06a9\u06cc\u062a (DPoP)<\/strong>&#8220;.<\/p>\n<blockquote>\n<p>\u062a\u0648\u062c\u0647: \u0645\u0634\u062e\u0635\u0627\u062a DPoP \u0627\u06cc\u0646\u062c\u0627\u0633\u062a<br \/>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0648\u0636\u06cc\u062d\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f DPoP \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f<br \/>Bluesky docs \u0646\u06cc\u0632 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f \u062f\u0627\u0631\u062f&#8230; \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627.<\/p>\n<\/blockquote>\n<h3><span class=\"ez-toc-section\" id=\"DPoP\"><\/span>\n<p>  DPoP<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06cc\u062f\u0647 \u0627\u0632 <strong><code>DPoP<\/code><\/strong>  \u062f\u0627\u062f\u0647 \u0647\u0627 \u0628\u0647 &#8220;<em>\u0645\u0642\u06cc\u062f \u06a9\u0631\u062f\u0646<\/em>&#8220;\u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0634\u062a\u0631\u06cc \u0628\u0647 \u0646\u0634\u0627\u0646\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u06a9\u0627\u0631\u0628\u0631\u061b \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u06af\u0648\u06cc\u06cc\u0645\u060c&#8221;<em>\u0627\u06cc\u0646 \u0646\u0634\u0627\u0646\u0647 \u062a\u0648\u0633\u0637 \u0627\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0634\u062f<\/em>&#8220;\u060c \u0648 \u0647\u06cc\u0686 \u06a9\u0633 \u062f\u06cc\u06af\u0631\u06cc. \u0627\u06cc\u0646 \u0641\u0642\u0637 \u06cc\u06a9\u06cc \u062f\u06cc\u06af\u0631 \u0627\u0632 \u0645\u0648\u0627\u0631\u062f \u0627\u0636\u0627\u0641\u06cc \u0627\u0633\u062a <strong>\u0633\u0637\u062d \u0627\u0645\u0646\u06cc\u062a<\/strong>\u060c \u0628\u0631\u0627\u06cc \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u06a9\u0633\u06cc \u0631\u0645\u0632 \u0631\u0627 \u0628\u06af\u06cc\u0631\u062f \u0648 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u06cc\u06af\u0631\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u062f.<\/p>\n<p>\u0645\u0634\u06a9\u0644 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0631\u0627\u06cc \u067e\u06cc\u0648\u0646\u062f \u062f\u0627\u062f\u0646 \u0647\u0631 \u062f\u0648 \u062f\u0627\u062f\u0647 (<em>\u062a\u0648\u06a9\u0646 \u0648 &#8220;\u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0634\u062a\u0631\u06cc&#8221;<\/em>\u060c \u0628\u0627\u06cc\u062f \u0627\u0632 \u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645. \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0686\u0646\u06cc\u0646 \u06a9\u0644\u06cc\u062f\u06cc \u0631\u0627 \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u062f \u0648 \u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645. \u0645\u0624\u0644\u0641\u0647 \u06a9\u0644\u06cc\u062f\u06cc \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647 &#8230; \u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f &#8220;<em>\u0647\u06cc\u0686<\/em>\u0627\u06cc\u0646\u062c\u0627 \u0645\u06cc \u0622\u06cc\u062f!<\/p>\n<blockquote>\n<p><strong>\u062a\u0648\u062c\u0647<\/strong>: \u06cc\u06a9 DPoP-Proof \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0627\u0633\u062a <strong>\u0647\u0631 \u0628\u0627\u0631<\/strong> \u0645\u0627 \u0628\u0627\u06cc\u062f \u06cc\u06a9 EndPoint \u0645\u062d\u0627\u0641\u0638\u062a \u0634\u062f\u0647 \u0628\u0627 OAuth \u0631\u0627 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u06a9\u0646\u06cc\u0645. \u0647\u0631 DPoP-Proof \u0634\u0627\u0645\u0644 \u062e\u0648\u0627\u0647\u062f \u0634\u062f <strong>URL \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc<\/strong>\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0627\u06cc\u062f \u0628\u0631\u0627\u06cc \u0647\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u060c DPoP-Proofs \u062c\u062f\u06cc\u062f (\u062f\u0648\u0628\u0627\u0631\u0647) \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645.<\/p>\n<\/blockquote>\n<h3><span class=\"ez-toc-section\" id=\"%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1_access_token\"><\/span>\n<p>  \u06a9\u0627\u0631\u0628\u0631 <code>access_token<\/code><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u0648\u0644\u06cc\u0646 \u0686\u06cc\u0632\u06cc \u06a9\u0647 \u0645\u0627 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645 \u0627\u06cc\u0646 \u0627\u0633\u062a <em>\u0686\u0646\u062f-\u06af\u0627\u0645-\u067e\u06cc\u0634-\u062f\u0631\u06cc\u0627\u0641\u062a \u0634\u062f\u0647 \u0627\u0633\u062a<\/em> <strong><code>dpop_nonce<\/code><\/strong>  \u062f\u0627\u062f\u0647 \u0647\u0627 \u062f\u0631 \u0637\u0648\u0644 \u062a\u0645\u0627\u0633 \u0628\u0627 \u0647\u062f\u0631 \u0622\u0645\u062f <strong><code>PAR EndPoint<\/code><\/strong>\u060c \u0648 \u0645\u0627 \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.<\/p>\n<p>\u0686\u06cc\u0632 \u062f\u06cc\u06af\u0631\u06cc \u06a9\u0647 \u0645\u0627 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0628\u06af\u0648\u06cc\u06cc\u0645 &#8220;<em>\u0645\u0627 \u06a9\u06cc \u0647\u0633\u062a\u06cc\u0645<\/em>&#8220;\u060c \u0628\u0647&#8221;<em>\u067e\u06cc\u0648\u0646\u062f<\/em>&#8220;\u06a9\u0627\u0631\u0628\u0631 <code>access_token<\/code> \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc \u0622\u06cc\u0646\u062f\u0647 \u0645\u0627 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0628\u0627\u06cc\u062f \u06cc\u06a9 DPoP-Prook \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645. \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646\u06a9\u0647 &#8220;<em>\u0639\u0628\u0648\u0631 \u06a9\u0646\u062f<\/em>\u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u0645\u0627 \u062f\u0631 \u0633\u0631\u0648\u0631.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u0648\u0644\u06cc\u0646 \u0622\u0632\u0645\u0627\u06cc\u0634\u060c \u0645\u0627 \u0647\u0646\u0648\u0632 \u062a\u0648\u06a9\u0646 \u0631\u0627 \u0646\u062f\u0627\u0631\u06cc\u0645\u060c \u0627\u0645\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u06cc\u06a9 DPoP-Proof \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0686\u06cc\u0632\u06cc \u06a9\u0647 \u0645\u0627 \u0631\u0627 \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0686\u06af\u0648\u0646\u0647\u061f<br \/>\u062e\u0648\u0628\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0627\u0632 \u0627\u06cc\u0646 \u0633\u0647 \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645:<\/p>\n<ul>\n<li>\n<code>userTokenEndPoint<\/code>(**): \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc \u0631\u0645\u0632 \u0633\u0631\u0648\u0631<\/li>\n<li>\n<code>client_id<\/code>: \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u06af\u0648\u06cc\u06cc\u0645\u060c &#8220;<code>APP_CLIENT_ID<\/code>&#8220;\u060c \u0648<\/li>\n<li>\n<code>dpopNonce<\/code>: \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f DPoP-Proof \u0628\u0627 \u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc<\/li>\n<\/ul>\n<p>\u0645\u0627 \u062f\u0648\u0628\u0627\u0631\u0647 \u06cc\u06a9 URL \u0627\u06cc\u062c\u0627\u062f \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code>    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"c1\">\/\/   Javascript<\/span>\n    <span class=\"c1\">\/\/<\/span>\n    <span class=\"c1\">\/\/   (maybe some steps are wrong 'typed')...<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">userAccessToken<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Build up the URL.<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">url<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">userTokenEndPoint<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ The body of the call<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">body<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">URLSearchParams<\/span><span class=\"p\">({<\/span>\n        <span class=\"c1\">\/\/ Fixed values<\/span>\n        <span class=\"dl\">'<\/span><span class=\"s1\">grant_type<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">authorization_code<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"c1\">\/\/ Constant values<\/span>\n        <span class=\"dl\">'<\/span><span class=\"s1\">client_id<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"nf\">encodeURIComponent<\/span><span class=\"p\">(<\/span> <span class=\"nx\">APP_CLIENT_ID<\/span> <span class=\"p\">),<\/span>\n        <span class=\"dl\">'<\/span><span class=\"s1\">redirect_uri<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"nf\">encodeURIComponent<\/span><span class=\"p\">(<\/span> <span class=\"nx\">APP_CALLBACK_URL<\/span> <span class=\"p\">),<\/span>\n        <span class=\"c1\">\/\/ Variable values<\/span>\n        <span class=\"dl\">'<\/span><span class=\"s1\">code<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"nx\">receivedCode<\/span><span class=\"p\">,<\/span>\n        <span class=\"dl\">'<\/span><span class=\"s1\">code_verifier<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"nx\">codeVerifier<\/span>\n    <span class=\"p\">});<\/span>\n\n    <span class=\"c1\">\/\/ Create the crypto key.<\/span>\n    <span class=\"c1\">\/\/ Must save it, 'cause we'll reuse it later.<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">keyOptions<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">ECDSA<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">namedCurve<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">P-256<\/span><span class=\"dl\">\"<\/span>\n    <span class=\"p\">};<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">keyPurposes<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">sign<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">verify<\/span><span class=\"dl\">\"<\/span><span class=\"p\">];<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">key<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">crypto<\/span><span class=\"p\">.<\/span><span class=\"nx\">subtle<\/span><span class=\"p\">.<\/span><span class=\"nf\">generateKey<\/span><span class=\"p\">(<\/span><span class=\"nx\">keyOptions<\/span><span class=\"p\">,<\/span> <span class=\"kc\">false<\/span><span class=\"p\">,<\/span> <span class=\"nx\">keyPurposes<\/span><span class=\"p\">).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span><span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">eckey<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nx\">eckey<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">});<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">jwk<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">crypto<\/span><span class=\"p\">.<\/span><span class=\"nx\">subtle<\/span><span class=\"p\">.<\/span><span class=\"nf\">exportKey<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">jwk<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">key<\/span><span class=\"p\">.<\/span><span class=\"nx\">publicKey<\/span><span class=\"p\">).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span><span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">keydata<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nx\">keydata<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">});<\/span>\n    <span class=\"k\">delete<\/span> <span class=\"nx\">jwk<\/span><span class=\"p\">.<\/span><span class=\"nx\">ext<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">delete<\/span> <span class=\"nx\">jwk<\/span><span class=\"p\">.<\/span><span class=\"nx\">key_ops<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Create the DPoP-Proof 'body' for this request.<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">uuid<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">self<\/span><span class=\"p\">.<\/span><span class=\"nx\">crypto<\/span><span class=\"p\">.<\/span><span class=\"nf\">randomUUID<\/span><span class=\"p\">();<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">dpop_proof_header<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">typ<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">dpop+jwt<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">alg<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">ES256<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">jwk<\/span><span class=\"p\">:<\/span> <span class=\"nx\">jwk<\/span>\n    <span class=\"p\">};<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">dpop_proof_payload<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">iss<\/span><span class=\"p\">:<\/span> <span class=\"nx\">APP_CLIENT_ID<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ Added<\/span>\n        <span class=\"na\">jti<\/span><span class=\"p\">:<\/span> <span class=\"nx\">uuid<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">htm<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">POST<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">htu<\/span><span class=\"p\">:<\/span> <span class=\"nx\">url<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">iat<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nf\">floor<\/span><span class=\"p\">(<\/span><span class=\"nb\">Date<\/span><span class=\"p\">.<\/span><span class=\"nf\">now<\/span><span class=\"p\">()<\/span> <span class=\"o\">\/<\/span> <span class=\"mi\">1000<\/span><span class=\"p\">),<\/span>\n        <span class=\"na\">nonce<\/span><span class=\"p\">:<\/span> <span class=\"nx\">dpopNonce<\/span>\n    <span class=\"p\">};<\/span>\n\n    <span class=\"c1\">\/\/ Crypt and sign the DPoP-Proof header+body<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">h<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nf\">stringify<\/span><span class=\"p\">(<\/span><span class=\"nx\">dpop_proof_header<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">p<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nf\">stringify<\/span><span class=\"p\">(<\/span><span class=\"nx\">dpop_proof_payload<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">partialToken<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\n        <span class=\"nx\">Base64<\/span><span class=\"p\">.<\/span><span class=\"nc\">ToBase64Url<\/span><span class=\"p\">(<\/span><span class=\"nx\">Base64<\/span><span class=\"p\">.<\/span><span class=\"nf\">utf8ToUint8Array<\/span><span class=\"p\">(<\/span><span class=\"nx\">h<\/span><span class=\"p\">)),<\/span>\n        <span class=\"nx\">Base64<\/span><span class=\"p\">.<\/span><span class=\"nc\">ToBase64Url<\/span><span class=\"p\">(<\/span><span class=\"nx\">Base64<\/span><span class=\"p\">.<\/span><span class=\"nf\">utf8ToUint8Array<\/span><span class=\"p\">(<\/span><span class=\"nx\">p<\/span><span class=\"p\">)),<\/span>\n    <span class=\"p\">].<\/span><span class=\"nf\">join<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">.<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">messageAsUint8Array<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">Base64<\/span><span class=\"p\">.<\/span><span class=\"nf\">utf8ToUint8Array<\/span><span class=\"p\">(<\/span><span class=\"nx\">partialToken<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"kd\">let<\/span> <span class=\"nx\">signOptions<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">ECDSA<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">hash<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">SHA-256<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">},<\/span>\n    <span class=\"p\">};<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">signatureAsBase64<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">crypto<\/span><span class=\"p\">.<\/span><span class=\"nx\">subtle<\/span><span class=\"p\">.<\/span><span class=\"nf\">sign<\/span><span class=\"p\">(<\/span><span class=\"nx\">signOptions<\/span><span class=\"p\">,<\/span> <span class=\"nx\">key<\/span><span class=\"p\">.<\/span><span class=\"nx\">privateKey<\/span><span class=\"p\">,<\/span> <span class=\"nx\">dpop_proof_payload<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">.<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span><span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">signature<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nx\">Base64<\/span><span class=\"p\">.<\/span><span class=\"nc\">ToBase64Url<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">Uint8Array<\/span><span class=\"p\">(<\/span><span class=\"nx\">signature<\/span><span class=\"p\">));<\/span>\n    <span class=\"p\">});<\/span>\n\n    <span class=\"c1\">\/\/ The DPoP-Proof<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">dpopProof<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">`<\/span><span class=\"p\">${<\/span><span class=\"nx\">partialToken<\/span><span class=\"p\">}<\/span><span class=\"s2\">.<\/span><span class=\"p\">${<\/span><span class=\"nx\">signatureAsBase64<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ TuneUp the call<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">headers<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n        <span class=\"dl\">'<\/span><span class=\"s1\">DPOP<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"nx\">dpopProof<\/span><span class=\"p\">,<\/span>\n        <span class=\"dl\">'<\/span><span class=\"s1\">Content-Type<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">application\/x-www-form-urlencoded<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"dl\">'<\/span><span class=\"s1\">DPoP-Nonce<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"nx\">dpopNonce<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">fetchOptions<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">method<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">POST<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"nx\">headers<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">body<\/span><span class=\"p\">:<\/span> <span class=\"nx\">body<\/span><span class=\"p\">.<\/span><span class=\"nf\">toString<\/span><span class=\"p\">()<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"c1\">\/\/ Finally, perform the call<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">url<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">userTokenEndPoint<\/span><span class=\"p\">;<\/span>\n    <span class=\"nf\">fetch<\/span><span class=\"p\">(<\/span> <span class=\"nx\">url<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fetchOptions<\/span> <span class=\"p\">).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Process the HTTP Response<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/span><span class=\"p\">();<\/span>\n    <span class=\"p\">}).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span> <span class=\"nx\">data<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Process the HTTP Response Body<\/span>\n        <span class=\"nx\">authServerResponse<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">;<\/span>\n        <span class=\"nx\">userAccessToken<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">access_token<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">});<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647\u060c \u0645\u062a\u063a\u06cc\u0631 &#8220;authServerResponse&#8221; (<em>\u067e\u0627\u0633\u062e \u0627\u0632 \u0633\u0631\u0648\u0631 \u0645\u062c\u0648\u0632<\/em>) \u0628\u0627\u06cc\u062f \u0628\u0647 \u0634\u06a9\u0644 \u0632\u06cc\u0631 \u0628\u0627\u0634\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"w\">    <\/span><span class=\"p\">{<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"access_token\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NksifQ.eyJhdWQiOiJkaWQ6d2ViOnZlbHZldGZvb3QudXMtZWFzdC5ob3N0LmJza3kubmV0d29yayIsImlhdCI6MTczNzQ5ODM4NCwiZXhwIjoxNzM3NTAxOTg0LCJzdWIiOiJkaWQ6cGxjOnRqYzI3YWplNHV3eHR3NWFiNnd3bTRrbSIsImp0aSI6InRvay1jYzM0YTYzZjgwNWJjMWQ1MTdhNDNmNzU5YWU3ZjJiNCIsImNuZiI6eyJqa3QiOiJVVW1YVXAwMUxySkctak1WQnJHSG1DZy1FR3UyemRncFBMWjhGZDhYMFlNIn0sImNsaWVudF9pZCI6Imh0dHBzOi8vbWFkcmlsZW55ZXIubmVvY2l0aWVzLm9yZy9ic2t5L29hdXRoL2NsaWVudC1tZXRhZGF0YS5qc29uIiwic2NvcGUiOiJhdHByb3RvIHRyYW5zaXRpb246Z2VuZXJpYyIsImlzcyI6Imh0dHBzOi8vYnNreS5zb2NpYWwifQ.OoKiX0LIofSvCqCsZHKtSa7TrOAdWOlTPapu2EGrSxWeF8qkklaM8HXgtmEPTs1BEGIkol91zz32lE1jI72i9Q\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"token_type\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"DPoP\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"refresh_token\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"ref-5c3ecf03caded355cde56b394dae9d9922fda73434dc02642fcb3e1a5fe2e149\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"scope\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"atproto transition:generic\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"expires_in\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"mi\">3599<\/span><span class=\"p\">,<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"sub\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"did:plc:tjc27aje4uwxtw5ab6wwm4km\"<\/span><span class=\"w\">\n    <\/span><span class=\"p\">}<\/span><span class=\"w\">\n     <\/span><span class=\"err\">*\/<\/span><span class=\"w\">\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<blockquote>\n<p><strong>\u062a\u0648\u062c\u0647<\/strong>: \u0628\u0647 &#8220;<em>\u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u06cc\u062f<\/em>&#8220;\u0686\u0637\u0648\u0631\u0647&#8221;<code>access_token<\/code>&#8220;\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0647 <strong>JWT<\/strong><\/p>\n<\/blockquote>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0627 \u0645\u06cc \u0631\u0648\u06cc\u0645!<\/p>\n<p>\u0645\u0627 \u0646\u0634\u0627\u0646\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0628\u0631\u0627\u06cc \u0628\u0631\u0642\u0631\u0627\u0631\u06cc \u062a\u0645\u0627\u0633 \u0628\u0627 Bluesky EndPoints \u0645\u062d\u0627\u0641\u0638\u062a \u0634\u062f\u0647 \u0631\u0627 \u062f\u0627\u0631\u06cc\u0645.<em>\u0627\u0632 \u0637\u0631\u0641<\/em>&#8221; \u0627\u0632 \u06a9\u0627\u0631\u0628\u0631.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AA%D9%85%D8%A7%D8%B3_%D9%87%D8%A7%DB%8C_%D8%A8%D8%B9%D8%AF%DB%8C\"><\/span>\n<p>  \u062a\u0645\u0627\u0633 \u0647\u0627\u06cc \u0628\u0639\u062f\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u0632 \u0627\u06cc\u0646 \u0646\u0642\u0637\u0647 \u0628\u0647 \u0628\u0639\u062f\u060c \u062a\u0645\u0627\u0645 DPoP-Proof\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0627\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u0634\u0648\u0646\u062f (<em>\u0628\u0631\u0627\u06cc \u062a\u0645\u0627\u0633 \u0647\u0627\u06cc \u0628\u0639\u062f\u06cc<\/em>) <strong>\u0628\u0627\u06cc\u062f<\/strong> \u0634\u0627\u0645\u0644 \u0646\u0647 \u062a\u0646\u0647\u0627 &#8220;<em>dpop-nonce<\/em>&#8220;\u067e\u0627\u0631\u0627\u0645\u062a\u0631\u060c \u0628\u0644\u06a9\u0647 &#8220;<strong><code>atHash<\/code><\/strong>&#8220;\u060c access_token \u0647\u0634 \u0634\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code>    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"c1\">\/\/   Javascript<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n\n    <span class=\"c1\">\/\/ For subsequent calls, we must include the<\/span>\n    <span class=\"c1\">\/\/ hash of the access token in the DPoP-Proof payload.<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n\n    <span class=\"c1\">\/\/ Let's calculate the hash<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">encodedAccessToken<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">TextEncoder<\/span><span class=\"p\">().<\/span><span class=\"nf\">encode<\/span><span class=\"p\">(<\/span><span class=\"nx\">userAccessToken<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">atHash<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">crypto<\/span><span class=\"p\">.<\/span><span class=\"nx\">subtle<\/span><span class=\"p\">.<\/span><span class=\"nf\">digest<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">SHA-256<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">encodedAccessToken<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">.<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span><span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">hash<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>        \n        <span class=\"kd\">let<\/span> <span class=\"nx\">base<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">Base64<\/span><span class=\"p\">.<\/span><span class=\"nc\">ToBase64Url<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">Uint8Array<\/span><span class=\"p\">(<\/span><span class=\"nx\">hash<\/span><span class=\"p\">));<\/span>\n        <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">noPadding<\/span><span class=\"p\">){<\/span>\n            <span class=\"nx\">base<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">base<\/span><span class=\"p\">.<\/span><span class=\"nf\">replace<\/span><span class=\"p\">(<\/span><span class=\"sr\">\/<\/span><span class=\"se\">\\=<\/span><span class=\"sr\">+$\/<\/span><span class=\"p\">,<\/span> <span class=\"dl\">''<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>    \n        <span class=\"k\">return<\/span> <span class=\"nx\">base<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">});<\/span>\n\n    <span class=\"c1\">\/\/ Regenerate the UUID.<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">uuid<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">self<\/span><span class=\"p\">.<\/span><span class=\"nx\">crypto<\/span><span class=\"p\">.<\/span><span class=\"nf\">randomUUID<\/span><span class=\"p\">();<\/span>\n\n    <span class=\"c1\">\/\/ Add the hash in the DPoP-Proof payload.<\/span>\n    <span class=\"c1\">\/\/ The \"url\" is a new one.<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">dpop_proof_payload<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n\n        <span class=\"c1\">\/\/ This parameter LINKs the user access token<\/span>\n        <span class=\"c1\">\/\/ to the call &amp; the application, thru the crypto key<\/span>\n        <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n        <span class=\"na\">ath<\/span><span class=\"p\">:<\/span> <span class=\"nx\">atHash<\/span><span class=\"p\">,<\/span>\n\n        <span class=\"c1\">\/\/ The method can be \"GET\" or whatever.<\/span>\n        <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n        <span class=\"na\">htm<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">POST<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n\n        <span class=\"c1\">\/\/ The \"url\" should be distinct.<\/span>\n        <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n        <span class=\"na\">htu<\/span><span class=\"p\">:<\/span> <span class=\"nx\">url<\/span><span class=\"p\">,<\/span>\n\n        <span class=\"c1\">\/\/ The \"time stamp\" is \"now\" (UNIX like)<\/span>\n        <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n        <span class=\"na\">iat<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nf\">floor<\/span><span class=\"p\">(<\/span><span class=\"nb\">Date<\/span><span class=\"p\">.<\/span><span class=\"nf\">now<\/span><span class=\"p\">()<\/span> <span class=\"o\">\/<\/span> <span class=\"mi\">1000<\/span><span class=\"p\">),<\/span>\n\n        <span class=\"c1\">\/\/ The brand new uuid.<\/span>\n        <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n        <span class=\"na\">jti<\/span><span class=\"p\">:<\/span> <span class=\"nx\">uuid<\/span><span class=\"p\">,<\/span>\n\n        <span class=\"c1\">\/\/ The rest of the parameters should be the same<\/span>\n        <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n        <span class=\"na\">iss<\/span><span class=\"p\">:<\/span> <span class=\"nx\">APP_CLIENT_ID<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">nonce<\/span><span class=\"p\">:<\/span> <span class=\"nx\">dpopNonce<\/span>\n\n    <span class=\"p\">};<\/span>\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0627 \u0627\u06cc\u0646 DPoP-Proof \u062c\u062f\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u06cc\u06a9 &#8221; \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645<em>\u0633\u0631\u0635\u0641\u062d\u0647 \u0647\u0627<\/em>&#8221; \u0627\u0639\u062a\u0631\u0627\u0636 \u0628\u0647 \u0627\u0646\u062c\u0627\u0645 \u062a\u0645\u0627\u0633.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code>    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n    <span class=\"c1\">\/\/   Javascript<\/span>\n    <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n\n    <span class=\"kd\">let<\/span> <span class=\"nx\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"dl\">'<\/span><span class=\"s1\">Content-Type<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"nx\">whichever<\/span><span class=\"p\">],<\/span>\n        <span class=\"dl\">'<\/span><span class=\"s1\">Accept<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">application\/json<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n\n        <span class=\"c1\">\/\/ The \"Authorization\" header now is<\/span>\n        <span class=\"c1\">\/\/ not a \"Bearer\" but a \"DPoP\". <\/span>\n        <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n        <span class=\"dl\">'<\/span><span class=\"s1\">Authorization<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"s2\">`DPoP <\/span><span class=\"p\">${<\/span><span class=\"nx\">userAccessToken<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">,<\/span>\n\n        <span class=\"c1\">\/\/ The \"DPoP-Proof\" must be included also<\/span>\n        <span class=\"c1\">\/\/ in a proper header.<\/span>\n        <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n        <span class=\"dl\">'<\/span><span class=\"s1\">DPoP<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"nx\">dpopProof<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">fetchOptions<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">method<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">POST<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>     <span class=\"c1\">\/\/ Or \"GET\", or...<\/span>\n        <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"nx\">headers<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">body<\/span><span class=\"p\">:<\/span> <span class=\"nx\">body<\/span>          <span class=\"c1\">\/\/ Whatever. If needed<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"nf\">fetch<\/span><span class=\"p\">(<\/span> <span class=\"nx\">url<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fetchOptions<\/span> <span class=\"p\">).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Process the HTTP Response<\/span>\n\n        <span class=\"c1\">\/\/ Normally, the \"nonce\" should come; to be checked.<\/span>\n        <span class=\"c1\">\/\/ ------------------------------------------<\/span>\n        <span class=\"nx\">dpopNonce<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nx\">headers<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">dpop-nonce<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">);<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/span><span class=\"p\">();<\/span>\n    <span class=\"p\">}).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span> <span class=\"nx\">data<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Process the HTTP Response Body<\/span>\n        <span class=\"c1\">\/\/ Whatever we expect.<\/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<h2><span class=\"ez-toc-section\" id=\"%DA%A9%D9%84%D9%85%D8%A7%D8%AA_%D9%BE%D8%A7%DB%8C%D8%A7%D9%86%DB%8C\"><\/span>\n<p>  \u06a9\u0644\u0645\u0627\u062a \u067e\u0627\u06cc\u0627\u0646\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u0644\u0628\u062a\u0647 \u0627\u06cc\u0646 \u0641\u0642\u0637 \u06cc\u06a9 &#8220;<em>\u0634\u0628\u0647 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a<\/em>&#8221; \u06a9\u062f. \u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f\u060c \u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 <strong><code>.then(...)<\/code><\/strong>  \u062a\u0648\u0627\u0628\u0639 \u0647\u0633\u062a\u0646\u062f &#8220;<em>\u0648\u0639\u062f\u0647 \u0647\u0627<\/em>&#8220;\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0627\u06cc\u062f \u0628\u0631 \u0627\u0633\u0627\u0633 \u0622\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u06cc\u0632\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0645\u0646 \u0647\u06cc\u0686 \u0686\u06a9 \u06cc\u0627 &#8220;<em>\u06a9\u0646\u062a\u0631\u0644 \u062e\u0637\u0627<\/em>&#8220;\u062f\u0631 \u06a9\u062f\u061b \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u062a\u0648\u0636\u06cc\u062d &#8220;<em>\u0645\u0633\u06cc\u0631 \u0645\u0628\u0627\u0631\u06a9<\/em>&#8220;\u060c \u0633\u0627\u062f\u0647 \u062a\u0631\u06cc\u0646 \u0631\u0627\u0647. \u0627\u06af\u0631 \u0642\u0635\u062f \u062f\u0627\u0631\u06cc\u062f \u0627\u0632 \u0627\u06cc\u0646 \u06a9\u062f \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u067e\u0627\u06cc\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f\u060c \u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0637\u0628\u0642 \u0645\u0639\u0645\u0648\u0644\u060c \u062a\u0645\u0627\u0645 \u0628\u0631\u0631\u0633\u06cc \u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0648 \u06a9\u0646\u062a\u0631\u0644 \u0647\u0627\u06cc \u062e\u0637\u0627 \u0631\u0627 \u062f\u0631 \u062c\u0631\u06cc\u0627\u0646 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f.<\/p>\n<p>\u0648 \u0628\u0627\u0644\u0627\u062e\u0631\u0647 &#8220;<em>\u0627\u0644\u0628\u062a\u0647<\/em>\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646 \u0628\u0633\u06cc\u0627\u0631 \u0628\u0633\u06cc\u0627\u0631 \u0628\u0647\u062a\u0631 \u0627\u0633\u062a <strong>\u0645\u0634\u062a\u0631\u06cc \u0631\u0633\u0645\u06cc Bluesky TypeScript<\/strong>. \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f <strong>\u06a9\u062f \u0645\u0646\u0628\u0639<\/strong>.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0633\u0644\u0627\u0645\u060c \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f! ;^) \u0645\u0642\u062f\u0645\u0647 \u0627\u06cc\u0646 \u067e\u0633\u062a \u062f\u0631 \u0645\u0648\u0631\u062f \u0627\u062f\u063a\u0627\u0645 \u0635\u062d\u0628\u062a \u0645\u06cc \u06a9\u0646\u062f \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a Bluesky (OAuth + DPoP) \u062f\u0631 \u06cc\u06a9 &#8220;\u0628\u062f\u0648\u0646 \u0633\u0631\u0648\u0631&#8220;\u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0634\u062a\u0631\u06cc\u060c \u0641\u0642\u0637 \u0628\u0627 \u062d\u06a9\u0645\u0631\u0627\u0646\u06cc&#8221;\u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0648\u0627\u0646\u06cc\u0644\u06cc&#8220;.\u0628\u0631\u0627\u06cc \u0634\u0645\u0627 \u062e\u0648\u0628\u0647\u061f \u0628\u0627\u0634\u0647&#8230; \u0628\u0631\u06cc\u0645! \u0633\u0644\u0628 \u0645\u0633\u0626\u0648\u0644\u06cc\u062a \u0627\u06cc\u0646 \u067e\u0633\u062a \u0635\u0631\u0641\u0627 \u0628\u0631\u0627\u06cc \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0646 \u0627\u0633\u062a&#8221;\u0686\u06af\u0648\u0646\u0647 \u0628\u0647&#8220;. \u0627\u06cc\u0646 \u06cc\u06a9&#8221; \u0646\u06cc\u0633\u062a\u0646\u0645\u0648\u0646\u0647 \u06a9\u0627\u0631&#8220;\u061b \u0639\u0645\u062f\u062a\u0627\u064b \u0628\u0647 \u062f\u0644\u06cc\u0644 \u0645\u0646\u0642\u0636\u06cc \u0634\u062f\u0646 \u062a\u0648\u06a9\u0646 \u0647\u0627! ;^) &hellip;<\/p>\n","protected":false},"author":2,"featured_media":94043,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-94042","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\/94042","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=94042"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/94042\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/94043"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=94042"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=94042"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=94042"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}