<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Web Development on kenji.blog</title><link>http://kenji.blog/hi/categories/web-development/</link><description>Recent content in Web Development on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>hi</language><copyright>kenjinote</copyright><lastBuildDate>Sun, 13 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/hi/categories/web-development/index.xml" rel="self" type="application/rss+xml"/><item><title>OAuth2.0 के काम करने के तरीके को समझना: Slack App एकीकरण से सीखना</title><link>http://kenji.blog/hi/p/oauth2-architecture-slack-app-integration/</link><pubDate>Sun, 13 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/oauth2-architecture-slack-app-integration/</guid><description>&lt;img src="http://kenji.blog/p/oauth2-architecture-slack-app-integration/img/eyecatch.jpg" alt="Featured image of post OAuth2.0 के काम करने के तरीके को समझना: Slack App एकीकरण से सीखना" />&lt;h1 id="परचय-oauth-20-कय-सख">परिचय: OAuth 2.0 क्यों सीखें?
&lt;/h1>&lt;p>आधुनिक वेब अनुप्रयोगों में, कई सेवाओं का एक साथ काम करना आम बात हो गई है। उदाहरण के लिए, &amp;ldquo;Google खाते से लॉग इन करना&amp;rdquo;, &amp;ldquo;Trello कार्य अपडेट होने पर Slack पर अधिसूचना भेजना&amp;rdquo;, या &amp;ldquo;Google कैलेंडर में ज़ूम मीटिंग लिंक स्वचालित रूप से जोड़ना&amp;rdquo; जैसी सुविधाएँ। इन सभी के पीछे &lt;strong>OAuth 2.0 (Open Authorization 2.0)&lt;/strong> नामक एक ऑथराइजेशन फ्रेमवर्क काम कर रहा है।&lt;/p>
&lt;p>अतीत में, जब विभिन्न सेवाओं के बीच डेटा का आदान-प्रदान किया जाता था, तो &amp;ldquo;बेसिक ऑथेंटिकेशन&amp;rdquo; या &amp;ldquo;पासवर्ड शेयरिंग&amp;rdquo; नामक बहुत ही खतरनाक तरीकों का उपयोग किया जाता था, जिसमें उपयोगकर्ता सीधे कनेक्टेड सेवा को अपना आईडी और पासवर्ड देते थे। हालांकि, इस विधि में कनेक्टेड सेवा उपयोगकर्ता के सभी अधिकारों को नियंत्रित कर लेती है, जिसमें महत्वपूर्ण सुरक्षा जोखिम शामिल होते हैं।&lt;/p>
&lt;p>OAuth 2.0 को इस तरह के &amp;ldquo;पासवर्ड शेयरिंग&amp;rdquo; से बचने और एक मानक प्रोटोकॉल (RFC 6749) के रूप में बनाया गया था, जो तीसरे पक्ष के अनुप्रयोगों को &amp;ldquo;केवल विशिष्ट अनुमतियाँ (स्कोप)&amp;rdquo; और &amp;ldquo;सीमित समय के लिए&amp;rdquo; सौंपता है।&lt;/p>
&lt;p>इस लेख में, हम OAuth 2.0 के काम करने के तरीके को अत्यंत विस्तृत और व्यावहारिक तरीके से समझाएंगे, एक एप्लिकेशन (Slack App) के कार्यान्वयन के माध्यम से जो &lt;strong>Slack (Slack API)&lt;/strong> को लक्षित करता है, जो व्यवसाय संचार उपकरण के रूप में वास्तविक मानक बन गया है। यह 10,000 से अधिक वर्णों की एक निश्चित मार्गदर्शिका है, जिसमें Node.js (Express) का उपयोग करके कोड उदाहरण, प्रोटोकॉल प्रवाह को स्पष्ट करने वाले अनुक्रम आरेख (Sequence Diagrams), और सुरक्षा की महत्वपूर्ण अवधारणाओं जैसे &lt;code>state&lt;/code> पैरामीटर और PKCE की गणितीय और क्रिप्टोग्राफ़िक पृष्ठभूमि शामिल है।&lt;/p>
&lt;hr>
&lt;h1 id="1-oauth-20-क-मल-अवधरण-4-भमकए-roles">1. OAuth 2.0 की मूल अवधारणा: 4 भूमिकाएँ (Roles)
&lt;/h1>&lt;p>OAuth 2.0 को समझने के लिए पहला कदम शामिल पात्रों (Roles) को सटीक रूप से समझना है। RFC 6749 में, निम्नलिखित 4 भूमिकाएँ परिभाषित की गई हैं।&lt;/p>
&lt;pre class="mermaid">
graph TD
RO[&amp;#34;Resource Owner (उपयोगकर्ता)&amp;#34;] -- &amp;#34;ऑथराइजेशन देता है&amp;#34; --&amp;gt; C[&amp;#34;Client (Slack App)&amp;#34;]
C -- &amp;#34;ऑथराइजेशन का अनुरोध करता है&amp;#34; --&amp;gt; AS[&amp;#34;Authorization Server (Slack ऑथराइजेशन सर्वर)&amp;#34;]
AS -- &amp;#34;एक्सेस टोकन जारी करता है&amp;#34; --&amp;gt; C
C -- &amp;#34;टोकन का उपयोग करके एक्सेस करता है&amp;#34; --&amp;gt; RS[&amp;#34;Resource Server (Slack API सर्वर)&amp;#34;]
RO -- &amp;#34;ID/पासवर्ड से लॉगिन करता है&amp;#34; --&amp;gt; AS
&lt;/pre>
&lt;ol>
&lt;li>&lt;strong>Resource Owner (रिसोर्स ओनर)&lt;/strong>
&lt;ul>
&lt;li>यह वह इकाई है जिसके पास रिसोर्स तक पहुंचने की अनुमति देने का अधिकार है। आमतौर पर यह &amp;ldquo;अंतिम उपयोगकर्ता (मानव)&amp;rdquo; को संदर्भित करता है। इस उदाहरण में, यह &amp;ldquo;आप स्वयं हैं, जो Slack वर्कस्पेस से संबंधित हैं और चैनल में संदेश पोस्ट करने का अधिकार रखते हैं।&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Client (क्लाइंट)&lt;/strong>
&lt;ul>
&lt;li>यह वह एप्लिकेशन है जो रिसोर्स ओनर की अनुमति से रिसोर्स सर्वर तक पहुंचने का प्रयास करता है। इस उदाहरण में, यह &amp;ldquo;आपके द्वारा विकसित किया जा रहा Node.js एप्लिकेशन (Slack App)&amp;rdquo; है। हालाँकि इसे &amp;ldquo;क्लाइंट&amp;rdquo; कहा जाता है, यहां तक कि सर्वर साइड पर चलने वाले वेब अनुप्रयोगों को भी OAuth के संदर्भ में &amp;ldquo;क्लाइंट&amp;rdquo; कहा जाता है।&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Authorization Server (ऑथराइजेशन सर्वर)&lt;/strong>
&lt;ul>
&lt;li>यह वह सर्वर है जो रिसोर्स ओनर को प्रमाणित करता है, रिसोर्स ओनर से ऑथराइजेशन प्राप्त करता है, और क्लाइंट को एक्सेस टोकन जारी करता है। इस उदाहरण में, यह Slack का ऑथेंटिकेशन इंफ्रास्ट्रक्चर है जो &lt;code>slack.com/oauth/v2/authorize&lt;/code> प्रदान करता है।&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Resource Server (रिसोर्स सर्वर)&lt;/strong>
&lt;ul>
&lt;li>यह संरक्षित रिसोर्सेज को होस्ट करता है, और एक्सेस टोकन का उपयोग करके रिसोर्स एक्सेस अनुरोधों को स्वीकार करता है और उनका जवाब देता है। इस उदाहरण में, यह &lt;code>slack.com/api/&lt;/code> का एंडपॉइंट है जो &lt;code>chat.postMessage&lt;/code> जैसे API प्रदान करता है।&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>एक शब्द में, OAuth फ्लो &lt;strong>&amp;ldquo;क्लाइंट द्वारा रिसोर्स ओनर की सहमति प्राप्त करने, ऑथराइजेशन सर्वर से एक्सेस टोकन प्राप्त करने, और उसका उपयोग करके रिसोर्स सर्वर से डेटा प्राप्त करने/हेरफेर करने&amp;rdquo;&lt;/strong> की प्रक्रिया है।&lt;/p>
&lt;hr>
&lt;h1 id="2-ऑथरइजशन-कड-गरट-authorization-code-grant-क-सपरण-वशलषण">2. ऑथराइजेशन कोड ग्रांट (Authorization Code Grant) का संपूर्ण विश्लेषण
&lt;/h1>&lt;p>OAuth 2.0 में कई प्रवाह (ग्रांट प्रकार) मौजूद हैं, लेकिन वेब एप्लिकेशन जैसे सर्वर-साइड वातावरण में जहां सीक्रेट कुंजी (Client Secret) को सुरक्षित रूप से रखा जा सकता है, सबसे अनुशंसित और व्यापक रूप से उपयोग किया जाने वाला &lt;strong>ऑथराइजेशन कोड ग्रांट (Authorization Code Grant)&lt;/strong> है।&lt;/p>
&lt;p>ऑथराइजेशन कोड ग्रांट की सबसे बड़ी विशेषता यह है कि यह &lt;strong>फ्रंट चैनल (ब्राउज़र के माध्यम से संचार)&lt;/strong> और &lt;strong>बैक चैनल (सर्वर के बीच सीधा संचार)&lt;/strong> को स्पष्ट रूप से अलग करता है। फ्रंट चैनल में केवल एक अस्थायी &amp;ldquo;ऑथराइजेशन कोड (Authorization Code)&amp;rdquo; पास किया जाता है, और अंतिम &amp;ldquo;एक्सेस टोकन&amp;rdquo; बैक चैनल में प्राप्त किया जाता है, जिससे ब्राउज़र के इतिहास या रेफ़रर में टोकन लीक होने का जोखिम काफी कम हो जाता है।&lt;/p>
&lt;p>निम्नलिखित अनुक्रम आरेख Slack App में ऑथराइजेशन कोड ग्रांट की पूरी प्रक्रिया को दर्शाता है।&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
autonumber
participant U as &amp;#34;Resource Owner (वेब ब्राउज़र)&amp;#34;
participant C as &amp;#34;Client (Node.js ऐप)&amp;#34;
participant AS as &amp;#34;Authorization Server (Slack ऑथेंटिकेशन)&amp;#34;
participant RS as &amp;#34;Resource Server (Slack API)&amp;#34;
U-&amp;gt;&amp;gt;C: &amp;#34;ऐप इंस्टॉल बटन पर क्लिक करता है (GET /slack/install)&amp;#34;
Note over C: &amp;#34;state पैरामीटर का निर्माण&amp;#34;
C--&amp;gt;&amp;gt;U: &amp;#34;रीडायरेक्ट: 302 Found (स्थान: Slack Auth URL)&amp;#34;
U-&amp;gt;&amp;gt;AS: &amp;#34;GET /oauth/v2/authorize?client_id=...&amp;amp;scope=...&amp;amp;state=...&amp;#34;
AS--&amp;gt;&amp;gt;U: &amp;#34;Slack लॉगिन स्क्रीन और अनुमति स्वीकृति स्क्रीन (Consent Screen)&amp;#34;
U-&amp;gt;&amp;gt;AS: &amp;#34;अनुमति देता है (Allow)&amp;#34;
Note over AS: &amp;#34;ऑथराइजेशन कोड (code) का निर्माण&amp;#34;
AS--&amp;gt;&amp;gt;U: &amp;#34;रीडायरेक्ट: 302 Found (स्थान: Client Callback URL?code=...&amp;amp;state=...)&amp;#34;
U-&amp;gt;&amp;gt;C: &amp;#34;GET /slack/oauth_redirect?code=...&amp;amp;state=...&amp;#34;
Note over C: &amp;#34;state पैरामीटर का सत्यापन (CSRF रोकथाम)&amp;#34;
C-&amp;gt;&amp;gt;AS: &amp;#34;POST /api/oauth.v2.access (code, client_id, client_secret)&amp;#34;
Note over C,AS: &amp;#34;बैक चैनल संचार (ब्राउज़र के माध्यम से नहीं)&amp;#34;
AS--&amp;gt;&amp;gt;C: &amp;#34;200 OK (JSON: access_token आदि जारी करना)&amp;#34;
C-&amp;gt;&amp;gt;RS: &amp;#34;POST /api/chat.postMessage (Authorization: Bearer &amp;lt;access_token&amp;gt;)&amp;#34;
RS--&amp;gt;&amp;gt;C: &amp;#34;200 OK (संदेश पोस्ट सफल)&amp;#34;
&lt;/pre>
&lt;p>आइए इस प्रवाह को एक-एक करके Node.js (Express) के विशिष्ट कोड कार्यान्वयन के माध्यम से समझें।&lt;/p>
&lt;hr>
&lt;h1 id="3-करयनवयन-क-तयर-slack-developer-console-म-सटगस">3. कार्यान्वयन की तैयारी: Slack Developer Console में सेटिंग्स
&lt;/h1>&lt;p>कोड लिखने से पहले, आपको Slack सिस्टम में &amp;ldquo;एक नया क्लाइंट मौजूद है&amp;rdquo; दर्ज करना होगा।&lt;/p>
&lt;ol>
&lt;li>&lt;a class="link" href="https://api.slack.com/apps" target="_blank" rel="noopener"
>Slack API: Applications&lt;/a> पर जाएं और &amp;ldquo;Create New App&amp;rdquo; पर क्लिक करें।&lt;/li>
&lt;li>&amp;ldquo;From scratch&amp;rdquo; चुनें, और ऐप का नाम (उदाहरण: &lt;code>My First OAuth App&lt;/code>) और इंस्टॉल करने के लिए वर्कस्पेस निर्दिष्ट करें।&lt;/li>
&lt;li>निर्माण के बाद &amp;ldquo;Basic Information&amp;rdquo; स्क्रीन पर, निम्नलिखित दो महत्वपूर्ण क्रेडेंशियल (प्रमाणपत्र) प्राप्त करें।
&lt;ul>
&lt;li>&lt;strong>Client ID&lt;/strong>: वह आईडी जो सार्वजनिक रूप से आपके ऐप की विशिष्ट पहचान करती है। ब्राउज़र (फ्रंट चैनल) के माध्यम से जाने वाले अनुरोधों में इसे शामिल करना ठीक है।&lt;/li>
&lt;li>&lt;strong>Client Secret&lt;/strong>: एक गुप्त स्ट्रिंग जो केवल आपका ऐप जानता है। &lt;strong>इसे कभी भी ब्राउज़र के सामने प्रकट न करें, और इसे GitHub आदि पर कमिट न करें।&lt;/strong>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&amp;ldquo;OAuth &amp;amp; Permissions&amp;rdquo; स्क्रीन पर जाएं और &amp;ldquo;Redirect URLs&amp;rdquo; में कॉलबैक URL रजिस्टर करें। इस बार, स्थानीय विकास को ध्यान में रखते हुए, निम्नलिखित सेट करें।
&lt;ul>
&lt;li>&lt;code>http://localhost:3000/slack/oauth_redirect&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>तैयारी अब पूरी हो गई है। हम सर्वर के कार्यान्वयन में प्रवेश करते हैं।&lt;/p>
&lt;hr>
&lt;h1 id="4-करयनवयन-चरण-1-slackinstall-और-csrf-रकथम-क-state-परमटर">4. कार्यान्वयन चरण 1: &lt;code>/slack/install&lt;/code> और CSRF रोकथाम का &lt;code>state&lt;/code> पैरामीटर
&lt;/h1>&lt;p>उपयोगकर्ताओं के लिए ऐप का उपयोग शुरू करने (वर्कस्पेस में इंस्टॉल करने) के लिए पहला एंडपॉइंट बनाएं। यहां सबसे बड़ी जिम्मेदारी उपयोगकर्ता को Slack के ऑथराइजेशन सर्वर पर रीडायरेक्ट करना है, लेकिन सुरक्षा के दृष्टिकोण से जो अत्यंत महत्वपूर्ण है वह &lt;strong>&lt;code>state&lt;/code> पैरामीटर का निर्माण और भंडारण&lt;/strong> है।&lt;/p>
&lt;h2 id="state-परमटर-क-आवशयकत-csrf-हमल-क-रकथम">state पैरामीटर की आवश्यकता (CSRF हमले की रोकथाम)
&lt;/h2>&lt;p>यदि &lt;code>state&lt;/code> पैरामीटर मौजूद नहीं है, तो एक दुर्भावनापूर्ण हमलावर अपने Slack खाते से ऑथराइजेशन प्रक्रिया शुरू कर सकता है, और पीड़ित को प्राप्त &amp;ldquo;ऑथराइजेशन कोड&amp;rdquo; वाले कॉलबैक URL (उदाहरण: &lt;code>http://localhost:3000/slack/oauth_redirect?code=ATTACKER_CODE&lt;/code>) पर क्लिक करने के लिए मजबूर कर सकता है। जब पीड़ित का ब्राउज़र इसे निष्पादित करता है, तो हमलावर का Slack खाता पीड़ित के सत्र से जुड़ जाता है, जिससे सूचना लीक होने या अनपेक्षित संचालन का कारण बनता है (लॉगिन CSRF)।&lt;/p>
&lt;p>इसे रोकने के लिए, &lt;code>state&lt;/code> एक अप्रत्याशित यादृच्छिक स्ट्रिंग है जिसका उपयोग यह सत्यापित करने के लिए किया जाता है कि जिस ब्राउज़र ने अनुरोध शुरू किया था वह कॉलबैक प्राप्त करने वाले ब्राउज़र के समान ही है।&lt;/p>
&lt;h2 id="state-क-एनटरप-गणतय-पषठभम">state की एन्ट्रापी (गणितीय पृष्ठभूमि)
&lt;/h2>&lt;p>एक सुरक्षित &lt;code>state&lt;/code> उत्पन्न करने के लिए, हमें पर्याप्त &amp;ldquo;एन्ट्रापी (सूचना की मात्रा)&amp;rdquo; वाले यादृच्छिक संख्याओं की आवश्यकता है। एन्ट्रापी $E$ उत्पन्न होने वाले स्ट्रिंग प्रकारों $N$ पर निर्भर करती है, और इसे निम्नलिखित सूत्र द्वारा दर्शाया जाता है।&lt;/p>
$$
E = \log_2(N) \quad (\text{इकाई: bits})
$$&lt;p>उदाहरण के लिए, यदि हम 16 बाइट का क्रिप्टोग्राफ़िक रूप से सुरक्षित छद्म यादृच्छिक संख्या (CSPRNG) उत्पन्न करते हैं और इसे हेक्साडेसिमल (Hex) स्ट्रिंग में परिवर्तित करते हैं, तो प्रतिनिधित्व की जा सकने वाली स्थितियों की संख्या $2^{128}$ है।&lt;/p>
$$
E = \log_2(2^{128}) = 128 \text{ bits}
$$&lt;p>128 बिट्स की एन्ट्रापी के साथ, आधुनिक कंप्यूटर विज्ञान में ब्रूट फोर्स (पाशविक बल) हमले के माध्यम से टकराव खोजना व्यावहारिक रूप से असंभव (खगोलीय संभावना) है। आमतौर पर, सुरक्षा आवश्यकताओं के रूप में कम से कम 128 बिट्स की एन्ट्रापी वाले &lt;code>state&lt;/code> की अनुशंसा की जाती है।&lt;/p>
&lt;h2 id="nodejs-दवर-करयनवयन">Node.js द्वारा कार्यान्वयन
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// app.js (आंशिक अंश)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">const&lt;/span> &lt;span class="nx">express&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;express&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">crypto&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;crypto&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">session&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;express-session&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">dotenv&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;dotenv&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dotenv&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">config&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">app&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">express&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// सेशन मिडलवेयर सेटअप (state को सेव करने के लिए)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">app&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">use&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">session&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">secret&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">process&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">env&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">SESSION_SECRET&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">resave&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">saveUninitialized&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">cookie&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">secure&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kc">false&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="c1">// प्रोडक्शन एनवायरनमेंट में इसे true करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">SLACK_CLIENT_ID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">process&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">env&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">SLACK_CLIENT_ID&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">SLACK_AUTHORIZE_URL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;https://slack.com/oauth/v2/authorize&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">app&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;/slack/install&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">req&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">res&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 16-बाइट का मजबूत यादृच्छिक संख्या उत्पन्न करें और 16-अंकीय स्ट्रिंग में बदलें (एंट्रॉपी: 128 bits)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">state&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">crypto&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">randomBytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">toString&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;hex&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// सेशन में सेव करें ताकि कॉलबैक के समय सत्यापन किया जा सके
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">req&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">session&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">oauth_state&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">state&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// अनुरोध किए जाने वाले स्कोप (अनुमतियों) की सूची (अल्पविराम से अलग)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// chat:write = चैनल में संदेश भेजने की अनुमति
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// channels:read = सार्वजनिक चैनलों की जानकारी प्राप्त करने की अनुमति
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">scope&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;chat:write,channels:read&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Slack के ऑथराइजेशन सर्वर के लिए URL पैरामीटर का निर्माण
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">params&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">URLSearchParams&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">client_id&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">SLACK_CLIENT_ID&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">scope&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">scope&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">state&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">state&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">redirect_uri&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;http://localhost:3000/slack/oauth_redirect&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">authUrl&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sb">`&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">SLACK_AUTHORIZE_URL&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb">?&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">params&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toString&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// उपयोगकर्ता को Slack की ऑथराइजेशन स्क्रीन पर रीडायरेक्ट करें (302 Found)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">res&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">redirect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">authUrl&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>जब आप इस एंडपॉइंट तक पहुँचते हैं, तो HTTP प्रतिक्रिया कुछ इस तरह दिखती है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-http" data-lang="http">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">HTTP&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="m">1.1&lt;/span> &lt;span class="m">302&lt;/span> &lt;span class="ne">Found&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Location&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="l">https://slack.com/oauth/v2/authorize?client_id=123.456&amp;amp;scope=chat%3Awrite%2Cchannels%3Aread&amp;amp;state=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6&amp;amp;redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fslack%2Foauth_redirect&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Set-Cookie&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="l">connect.sid=...; Path=/; HttpOnly&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>उपयोगकर्ता का ब्राउज़र तुरंत निर्दिष्ट &lt;code>Location&lt;/code> पर चला जाता है, और Slack की स्क्रीन (Consent Screen) प्रदर्शित होती है, और एक परिचित स्क्रीन दिखाई देती है जो कहती है &amp;ldquo;My First OAuth App कार्यक्षेत्र (Workspace) तक पहुंच मांग रहा है&amp;rdquo;।&lt;/p>
&lt;hr>
&lt;h1 id="5-करयनवयन-चरण-2-कलबक-परपत-करन-और-एकसस-टकन-क-आदन-परदन-करन">5. कार्यान्वयन चरण 2: कॉलबैक प्राप्त करना और एक्सेस टोकन का आदान-प्रदान करना
&lt;/h1>&lt;p>जब उपयोगकर्ता Slack स्क्रीन पर &amp;ldquo;अनुमति दें (Allow)&amp;rdquo; पर क्लिक करता है, तो Slack सर्वर उपयोगकर्ता के ब्राउज़र को सेट किए गए &lt;code>redirect_uri&lt;/code> पर रीडायरेक्ट करता है। उस समय, &lt;code>code&lt;/code> (ऑथराइजेशन कोड) और पहले भेजा गया &lt;code>state&lt;/code> URL के क्वेरी पैरामीटर के रूप में संलग्न किए जाते हैं।&lt;/p>
&lt;p>बैकएंड में निम्नलिखित प्रक्रिया की जाती है।&lt;/p>
&lt;ol>
&lt;li>जाँच करें कि भेजा गया &lt;code>state&lt;/code> और सेशन में सेव किया गया &lt;code>state&lt;/code> पूरी तरह से मेल खाता है या नहीं।&lt;/li>
&lt;li>यदि वे मेल खाते हैं, तो प्राप्त &lt;code>code&lt;/code>, अपना &lt;code>client_id&lt;/code>, और गुप्त जानकारी &lt;code>client_secret&lt;/code> का उपयोग करके Slack API के साथ बैक चैनल में संचार करें, और एक्सेस टोकन का अनुरोध करें।&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">axios&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;axios&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">SLACK_CLIENT_SECRET&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">process&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">env&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">SLACK_CLIENT_SECRET&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">SLACK_ACCESS_TOKEN_URL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;https://slack.com/api/oauth.v2.access&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">app&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;/slack/oauth_redirect&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kr">async&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">req&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">res&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">code&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">error&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">req&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">query&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// उपयोगकर्ता द्वारा ऑथराइजेशन अस्वीकार किए जाने की स्थिति में हैंडलिंग
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">error&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="s1">&amp;#39;access_denied&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nx">res&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">status&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">403&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">send&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;एक्सेस अस्वीकार कर दिया गया है।&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. state का सत्यापन (CSRF रोकथाम)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">savedState&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">req&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">session&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">oauth_state&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="nx">state&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="nx">state&lt;/span> &lt;span class="o">!==&lt;/span> &lt;span class="nx">savedState&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nx">res&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">status&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">400&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">send&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Invalid State Parameter (CSRF Attack Detected)&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// उपयोग किए गए state को हटा दें (रिप्ले अटैक की रोकथाम)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">delete&lt;/span> &lt;span class="nx">req&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">session&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">oauth_state&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 2. एक्सेस टोकन के लिए ऑथराइजेशन कोड का आदान-प्रदान (बैक चैनल संचार)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">tokenResponse&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">await&lt;/span> &lt;span class="nx">axios&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">post&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">SLACK_ACCESS_TOKEN_URL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">URLSearchParams&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">client_id&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">SLACK_CLIENT_ID&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">client_secret&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">SLACK_CLIENT_SECRET&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">code&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">code&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">redirect_uri&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;http://localhost:3000/slack/oauth_redirect&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}).&lt;/span>&lt;span class="nx">toString&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">headers&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Content-Type&amp;#39;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;application/x-www-form-urlencoded&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">tokenResponse&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">data&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="nx">data&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">ok&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">error&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Token Exchange Error:&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">data&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">error&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nx">res&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">status&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">500&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">send&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sb">`Slack API Error: &lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">data&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">error&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// सफल! एक्सेस टोकन प्राप्त किया गया
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">accessToken&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">data&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">access_token&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">teamName&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">data&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">team&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">botUserId&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">data&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">bot_user_id&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sb">`Successfully installed to &lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">teamName&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb">. Access Token: &lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">accessToken&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// सामान्यतः, यहां टोकन को एन्क्रिप्ट किया जाता है और डेटाबेस में सहेजा जाता है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// saveToDatabase(data.team.id, encrypt(accessToken));
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">res&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">send&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sb">`इंस्टॉलेशन पूरा हुआ! वर्कस्पेस: &lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">teamName&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">catch&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">err&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">error&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Network Error:&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">err&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">res&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">status&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">500&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">send&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;संचार त्रुटि उत्पन्न हुई है।&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस &lt;code>/api/oauth.v2.access&lt;/code> के प्रतिक्रिया (रिस्पॉन्स) के रूप में, Slack से निम्न प्रकार का JSON वापस किया जाता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;ok&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;app_id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;A12345678&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;authed_user&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;U12345678&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;scope&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;chat:write,channels:read&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;token_type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;bot&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;access_token&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;YOUR_BOT_TOKEN_HERE&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;bot_user_id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;B12345678&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;team&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;T12345678&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;My Workspace&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;enterprise&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;code>xoxb-&lt;/code> से शुरू होने वाला यह स्ट्रिंग Slack में &lt;strong>Bot एक्सेस टोकन&lt;/strong> है। इसके बाद, जब एप्लिकेशन Slack API (Resource Server) को अनुरोध भेजता है, तो प्रमाणीकरण (Authentication) और प्राधिकरण (Authorization) को HTTP हेडर में &lt;code>Authorization: Bearer xoxb-...&lt;/code> जोड़कर साबित किया जाता है।&lt;/p>
&lt;hr>
&lt;h1 id="6-टकन-सकप-और-नयनतम-वशषधकर-क-सदधत-principle-of-least-privilege">6. टोकन स्कोप और न्यूनतम विशेषाधिकार का सिद्धांत (Principle of Least Privilege)
&lt;/h1>&lt;p>OAuth 2.0 में सबसे महत्वपूर्ण अवधारणाओं में से एक &amp;ldquo;स्कोप (Scope)&amp;rdquo; है। स्कोप एक्सेस टोकन से जुड़ी अनुमतियों की सीमा को संदर्भित करता है।&lt;/p>
&lt;p>Slack में अनुमतियों को बहुत ही बारीकी से वर्गीकृत किया गया है, और मोटे तौर पर दो प्रकार के होते हैं: &lt;strong>Bot Token Scopes&lt;/strong> और &lt;strong>User Token Scopes&lt;/strong>।&lt;/p>
&lt;ul>
&lt;li>&lt;code>chat:write&lt;/code> (Bot): ऐप (बॉट) के रूप में स्वयं चैनल में संदेश पोस्ट करने की अनुमति।&lt;/li>
&lt;li>&lt;code>chat:write&lt;/code> (User): ऐप को इंस्टॉल करने वाले उपयोगकर्ता की ओर से (उपयोगकर्ता के नाम और आइकन के साथ) संदेश पोस्ट करने की अनुमति।&lt;/li>
&lt;li>&lt;code>channels:read&lt;/code>: चैनलों की सूची प्राप्त करने की अनुमति।&lt;/li>
&lt;li>&lt;code>channels:history&lt;/code>: चैनलों के पिछले संदेश इतिहास को पढ़ने की अनुमति।&lt;/li>
&lt;/ul>
&lt;p>सुरक्षा के मुख्य सिद्धांत &amp;ldquo;न्यूनतम विशेषाधिकार के सिद्धांत (Principle of Least Privilege)&amp;rdquo; के अनुसार, &lt;strong>यह एक सख्त नियम है कि केवल उन्हीं स्कोप का अनुरोध किया जाए जो ऐप द्वारा प्रदान किए जाने वाले कार्यों के लिए वास्तव में आवश्यक हैं&lt;/strong>। उदाहरण के लिए, &amp;ldquo;केवल सूचनाएं भेजने&amp;rdquo; वाले ऐप को केवल &lt;code>chat:write&lt;/code> का अनुरोध करना चाहिए, और &lt;code>channels:history&lt;/code> (सभी पिछली बातचीत को पढ़ने की अनुमति) का अनुरोध नहीं करना चाहिए। ऐसा इसलिए है ताकि अगर ऐप हैक हो जाता है और टोकन लीक हो जाता है, तो नुकसान को कम से कम किया जा सके।&lt;/p>
&lt;hr>
&lt;h1 id="7-अधक-उननत-सरकष-pkce-proof-key-for-code-exchange">7. अधिक उन्नत सुरक्षा: PKCE (Proof Key for Code Exchange)
&lt;/h1>&lt;p>हाल ही में, &lt;strong>PKCE (Proof Key for Code Exchange, RFC 7636, जिसका उच्चारण &amp;ldquo;पिक्सी&amp;rdquo; है)&lt;/strong> को OAuth 2.0 की सुरक्षा को और बढ़ाने के लिए एक तंत्र के रूप में मानकीकृत किया गया है और इसका व्यापक रूप से उपयोग किया जा रहा है।&lt;/p>
&lt;p>मूल रूप से PKCE को नेटिव ऐप्स (iOS/Android) और SPA (Single Page Application) जैसे &amp;ldquo;सार्वजनिक क्लाइंट&amp;rdquo; के लिए डिज़ाइन किया गया था, जो &lt;code>client_secret&lt;/code> को सुरक्षित रूप से सहेज नहीं सकते हैं। हालांकि, वर्तमान सुरक्षा सर्वोत्तम प्रथाओं (OAuth 2.1 ड्राफ्ट) में, PKCE के उपयोग की सर्वर-साइड &amp;ldquo;गोपनीय क्लाइंट&amp;rdquo; के लिए भी दृढ़ता से अनुशंसा की जाती है।&lt;/p>
&lt;h2 id="pkce-क-कम-करन-क-तरक-और-गणतय-पषठभम">PKCE का काम करने का तरीका और गणितीय पृष्ठभूमि
&lt;/h2>&lt;p>PKCE क्रिप्टोग्राफ़िक रूप से यह साबित करता है कि &amp;ldquo;ऑथराइजेशन अनुरोध शुरू करने वाला व्यक्ति&amp;rdquo; और &amp;ldquo;टोकन एक्सचेंज का अनुरोध करने वाला व्यक्ति&amp;rdquo; एक ही हैं।&lt;/p>
&lt;ol>
&lt;li>क्लाइंट एक यादृच्छिक स्ट्रिंग &lt;strong>&lt;code>code_verifier&lt;/code>&lt;/strong> (43 से 128 वर्ण) बनाता है।&lt;/li>
&lt;li>इसे &lt;strong>SHA-256&lt;/strong> का उपयोग करके हैश किया जाता है, और फिर BASE64URL में एन्कोड किया जाता है, और इसे &lt;strong>&lt;code>code_challenge&lt;/code>&lt;/strong> कहा जाता है।&lt;/li>
&lt;/ol>
&lt;p>इसे सूत्र में इस प्रकार दर्शाया जा सकता है।&lt;/p>
$$
\text{code\_challenge} = \text{BASE64URL-ENCODE}( \text{SHA256}( \text{ASCII}(\text{code\_verifier}) ) )
$$&lt;ol start="3">
&lt;li>क्लाइंट &lt;code>/slack/install&lt;/code> निष्पादित करते समय, &lt;code>state&lt;/code> के अतिरिक्त &lt;code>code_challenge&lt;/code> और &lt;code>code_challenge_method=S256&lt;/code> को ऑथराइजेशन सर्वर (Slack) को भेजता है (Slack इसे अस्थायी रूप से सहेजता है)।&lt;/li>
&lt;li>कॉलबैक के बाद, टोकन एक्सचेंज (&lt;code>/api/oauth.v2.access&lt;/code>) के दौरान, मूल बिना हैश किया हुआ &lt;strong>&lt;code>code_verifier&lt;/code>&lt;/strong> भेजा जाता है।&lt;/li>
&lt;li>ऑथराइजेशन सर्वर (Slack) प्राप्त &lt;code>code_verifier&lt;/code> को स्वयं SHA-256 के साथ हैश करता है, और सत्यापित करता है कि क्या यह चरण 3 में सहेजे गए &lt;code>code_challenge&lt;/code> के साथ पूरी तरह से मेल खाता है।&lt;/li>
&lt;/ol>
&lt;pre class="mermaid">
sequenceDiagram
participant C as &amp;#34;Client&amp;#34;
participant AS as &amp;#34;Authorization Server&amp;#34;
Note over C: &amp;#34;code_verifier = यादृच्छिक स्ट्रिंग&amp;#34;&amp;lt;br/&amp;gt;&amp;#34;code_challenge = SHA256(code_verifier)&amp;#34;
C-&amp;gt;&amp;gt;AS: &amp;#34;ऑथराइजेशन अनुरोध (code_challenge भेजता है)&amp;#34;
Note over AS: &amp;#34;code_challenge को बनाए रखता है&amp;#34;
AS--&amp;gt;&amp;gt;C: &amp;#34;ऑथराइजेशन कोड (code) जारी करना&amp;#34;
C-&amp;gt;&amp;gt;AS: &amp;#34;टोकन अनुरोध (code + code_verifier भेजता है)&amp;#34;
Note over AS: &amp;#34;SHA256(प्राप्त verifier) == बनाए रखा challenge?&amp;#34;
AS--&amp;gt;&amp;gt;C: &amp;#34;सत्यापन सफल: एक्सेस टोकन जारी करना&amp;#34;
&lt;/pre>
&lt;p>इस तंत्र के कारण, भले ही &amp;ldquo;ऑथराइजेशन कोड (code)&amp;rdquo; को किसी दुर्भावनापूर्ण ऐप द्वारा चुरा लिया गया हो या संचार चैनल को सुनकर प्राप्त कर लिया गया हो, हमलावर को एक्सेस टोकन नहीं मिल सकता है क्योंकि वह मूल &lt;code>code_verifier&lt;/code> को नहीं जानता है (अपरिवर्तनीय हैश फ़ंक्शन SHA-256 की प्रकृति के कारण, challenge से verifier की गणना करना असंभव है)।&lt;/p>
&lt;p>वर्तमान में, कुछ नए Slack API प्रवाह और अन्य आधुनिक SaaS API (Auth0, Okta, X/Twitter API v2 आदि) में PKCE का समर्थन बढ़ रहा है, और यह एक ऐसी तकनीक बन गई है जिसे डेवलपर्स को सक्रिय रूप से अपनाना चाहिए।&lt;/p>
&lt;hr>
&lt;h1 id="8-एकसस-टकन-क-सरकषत-परबधन-और-सचलन">8. एक्सेस टोकन का सुरक्षित प्रबंधन और संचालन
&lt;/h1>&lt;p>अंत में, प्राप्त एक्सेस टोकन को सहेजने के तरीके के बारे में सर्वोत्तम प्रथाएं (best practices)।&lt;/p>
&lt;h2 id="1-डटबस-म-सव-करत-समय-एनकरपशन-अनवरय-ह">1. डेटाबेस में सेव करते समय एन्क्रिप्शन अनिवार्य है
&lt;/h2>&lt;p>एक्सेस टोकन (&lt;code>xoxb-...&lt;/code>) Slack वर्कस्पेस के लिए &amp;ldquo;मास्टर कुंजी&amp;rdquo; की तरह है। इसे कभी भी प्लेनटेक्स्ट (सादे पाठ) में डेटाबेस (MySQL, PostgreSQL, MongoDB आदि) में सहेजा नहीं जाना चाहिए। यदि किसी भी कारण से, जैसे SQL इंजेक्शन द्वारा, डेटाबेस लीक हो जाता है, तो यह एक बड़ी आपदा होगी जिसमें सभी ग्राहकों के Slack खातों पर नियंत्रण कर लिया जाएगा।&lt;/p>
&lt;p>डेटाबेस में सेव करने से पहले एप्लिकेशन लेयर पर &lt;strong>AES-256-GCM&lt;/strong> जैसे शक्तिशाली सममित-कुंजी एन्क्रिप्शन (Symmetric-key encryption) का उपयोग करके इसे एन्क्रिप्ट करना सुनिश्चित करें। एन्क्रिप्शन/डिक्रिप्शन के लिए मास्टर कुंजी को AWS KMS (Key Management Service) या GCP Cloud KMS जैसी सुरक्षित कुंजी प्रबंधन सेवाओं का उपयोग करके सख्ती से प्रबंधित किया जाना चाहिए।&lt;/p>
&lt;h2 id="2-टकन-रटशन-token-rotation">2. टोकन रोटेशन (Token Rotation)
&lt;/h2>&lt;p>लंबे समय तक चलने वाले टोकन का उपयोग करना जोखिम भरा हो सकता है। नवीनतम OAuth कार्यान्वयनों में, &amp;ldquo;रिफ्रेश टोकन (Refresh Token)&amp;rdquo; का उपयोग करने और हर कुछ घंटों में एक नया एक्सेस टोकन फिर से जारी करने (टोकन रोटेशन) की अनुशंसा की जाती है। आप विकल्प सेटिंग्स में Slack API में टोकन रोटेशन को भी सक्षम कर सकते हैं।&lt;/p>
&lt;hr>
&lt;h1 id="नषकरष">निष्कर्ष
&lt;/h1>&lt;p>इस लेख में, हमने Slack App एकीकरण के लिए विशिष्ट Node.js कार्यान्वयन कोड के साथ OAuth 2.0 ऑथराइजेशन कोड ग्रांट प्रवाह के बारे में विस्तार से बताया है।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>4 भूमिकाओं (RO, Client, AS, RS)&lt;/strong> को ध्यान में रखते हुए, पूरे सिस्टम की वास्तुकला स्पष्ट हो जाती है।&lt;/li>
&lt;li>&lt;strong>ऑथराइजेशन कोड ग्रांट&lt;/strong> ब्राउज़र और सर्वर के बीच संचार पथ (फ्रंट/बैक चैनल) का कुशलतापूर्वक उपयोग करके सुरक्षा सुनिश्चित करता है।&lt;/li>
&lt;li>&lt;strong>&lt;code>state&lt;/code> पैरामीटर&lt;/strong> के साथ CSRF रोकथाम और &lt;strong>PKCE&lt;/strong> के साथ ऑथराइजेशन कोड इंटरसेप्ट हमलों की रोकथाम जैसे अंतर्निहित क्रिप्टोग्राफ़िक तंत्र को समझना सुरक्षित कार्यान्वयन के लिए एक शॉर्टकट है।&lt;/li>
&lt;li>&lt;strong>न्यूनतम विशेषाधिकार के सिद्धांत&lt;/strong> के आधार पर स्कोप डिज़ाइन, और डेटाबेस में सहेजते समय एन्क्रिप्शन संचालन के लिए बिल्कुल आवश्यक तत्व हैं।&lt;/li>
&lt;/ol>
&lt;p>OAuth 2.0 बहुत गहरा है, और केवल RFC में भारी मात्रा में विनिर्देश हैं, लेकिन वास्तविक प्लेटफॉर्म (Slack) को लक्षित करके और इसे हाथों-हाथ सीखकर, आपको इसकी परिष्कृत डिज़ाइन अवधारणाओं और मजबूत सुरक्षा तंत्र का अनुभव होना चाहिए। मुझे उम्मीद है कि इस लेख का ज्ञान भविष्य के एप्लिकेशन डेवलपमेंट और API एकीकरण के कार्यान्वयन में आपके लिए उपयोगी होगा।&lt;/p></description></item></channel></rss>