
RFC6265-अनुरूप कुकी पार्सिंग और CookieJar प्रबंधन लाइब्रेरी Node.js के लिए, CVE-2023-26136 सुरक्षा पैच के साथ। HTTP क्लाइंट्स के लिए कुकी निर्माण, सत्यापन, भंडारण और पुनर्प्राप्ति का समर्थन करता है।
RFC6265 कुकीज़ और Node.js के लिए CookieJar
var tough = require('tough-cookie'); var Cookie = tough.Cookie; var cookie = Cookie.parse(header); cookie.value = 'somethingdifferent'; header = cookie.toString();
var cookiejar = new tough.CookieJar(); cookiejar.setCookie(cookie, 'http://currentdomain.example.com/path', cb); // ... cookiejar.getCookies('http://example.com/otherpath',function(err,cookies) { res.headers['cookie'] = cookies.join('; '); });
# स्थापना
यह _बहुत_ आसान है!
`npm install tough-cookie`
नाम क्यों? NPM मॉड्यूल `cookie`, `cookies` और `cookiejar` पहले से लिए गए थे।
## संस्करण समर्थन
node.js के संस्करणों के लिए समर्थन [request](https://www.npmjs.com/package/request) मॉड्यूल के अनुसार होगा।
# API
## tough
`require('tough-cookie')` से प्राप्त मॉड्यूल पर फ़ंक्शन। सभी को शुद्ध फ़ंक्शन के रूप में उपयोग किया जा सकता है और इन्हें 'बाउंड' करने की आवश्यकता नहीं है।
**नोट**: 1.0.x से पहले, इनमें से कई फ़ंक्शन एक `strict` पैरामीटर लेते थे। इसे बाद में API से हटा दिया गया क्योंकि इसकी अब आवश्यकता नहीं थी।
### `parseDate(string)`
कुकी दिनांक स्ट्रिंग को `Date` में पार्स करें। RFC6265 खंड 5.1.1 के अनुसार पार्स करता है, न कि `Date.parse()` के अनुसार।
### `formatDate(date)`
एक Date को RFC1123 स्ट्रिंग में प्रारूपित करें (RFC6265-अनुशंसित प्रारूप)।
### `canonicalDomain(str)`
एक डोमेन-नाम को विहित डोमेन-नाम में रूपांतरित करता है। विहित डोमेन-नाम एक छंटा हुआ, लोअरकेस, अग्रणी डॉट हटाया हुआ और वैकल्पिक रूप से पनीकोड-एन्कोडेड डोमेन-नाम है (RFC6265 का खंड 5.1.2)। अधिकांश भाग के लिए, यह फ़ंक्शन आइडेम्पोटेंट है (बिना किसी प्रतिकूल प्रभाव के इसके आउटपुट पर फिर से चलाया जा सकता है)।
### `domainMatch(str,domStr[,canonicalize=true])`
उत्तर देता है 'क्या यह वास्तविक डोमेन कुकी में डोमेन से मेल खाता है?'। `str` 'वर्तमान' डोमेन-नाम है और `domStr` 'कुकी' डोमेन-नाम है। RFC6265 खंड 5.1.3 के अनुसार मेल खाता है, लेकिन इसे 'सफ़िक्स मैच' के रूप में सोचना सहायक है।
`canonicalize` पैरामीटर अन्य दो पैरामीटर को `canonicalDomain` के माध्यम से चलाएगा या नहीं।
### `defaultPath(path)`
एक वर्तमान अनुरोध/प्रतिक्रिया पथ दिए जाने पर, कुकी में संग्रहीत करने के लिए उपयुक्त पथ देता है। यह मूल रूप से पथ में 'फ़ाइल' की 'निर्देशिका' है, लेकिन RFC के खंड 5.1.4 द्वारा निर्दिष्ट है।
`path` पैरामीटर URI का _केवल_ पथनाम भाग होना चाहिए (अर्थात होस्टनाम, क्वेरी, फ्रैगमेंट आदि को शामिल नहीं करता)। यह node के `uri.parse()` आउटपुट की `.pathname` प्रॉपर्टी है।
### `pathMatch(reqPath,cookiePath)`
उत्तर देता है 'क्या अनुरोध-पथ किसी दिए गए कुकी-पथ से पथ-मेल खाता है?' RFC6265 खंड 5.1.4 के अनुसार। एक बूलियन लौटाता है।
यह अनिवार्य रूप से एक उपसर्ग-मैच है जहाँ `cookiePath`, `reqPath` का उपसर्ग है।
### `parse(cookieString[, options])`
`Cookie.parse(cookieString[, options])` का उपनाम
### `fromJSON(string)`
`Cookie.fromJSON(string)` का उपनाम
### `getPublicSuffix(hostname)`
इस होस्टनाम का सार्वजनिक प्रत्यय लौटाता है। सार्वजनिक प्रत्यय सबसे छोटा डोमेन-नाम है जिस पर कुकी सेट की जा सकती है। यदि होस्टनाम के लिए कुकी सेट नहीं की जा सकती तो `null` लौटाता है।
उदाहरण के लिए: `www.example.com` और `www.subdomain.example.com` दोनों का सार्वजनिक प्रत्यय `example.com` है।
अधिक जानकारी के लिए, http://publicsuffix.org/ देखें। यह मॉड्यूल अपनी सूची उस साइट से प्राप्त करता है। यह कॉल वर्तमान में [`psl`](https://www.npmjs.com/package/psl) की [get() विधि](https://www.npmjs.com/package/psl#pslgetdomain) के आसपास एक रैपर है।
### `cookieCompare(a,b)`
`.sort()` के साथ उपयोग के लिए, कुकीज़ की एक सूची को RFC में दिए गए अनुशंसित क्रम में क्रमबद्ध करता है (खंड 5.4 चरण 2)। क्रमबद्ध एल्गोरिथ्म प्राथमिकता के क्रम में है:
* सबसे लंबा `.path`
* सबसे पुराना `.creation` (जिसमें 1ms सटीकता है, `Date` के समान)
* सबसे कम `.creationIndex` (1ms सटीकता से परे जाने के लिए)``` javascript
var cookies = [ /* unsorted array of Cookie objects */ ];
cookies = cookies.sort(cookieCompare);
नोट: चूंकि JavaScript का Date 1ms सटीकता तक सीमित है, एक ही मिलीसेकंड के भीतर कुकीज़ पूरी तरह से संभव हैं। यह विशेष रूप से तब सच है जब .setCookie() पर now विकल्प का उपयोग किया जाता है। .creationIndex प्रॉपर्टी एक प्रति-प्रक्रिया वैश्विक काउंटर है, जिसे new Cookie() के साथ निर्माण के दौरान असाइन किया जाता है। यह RFC सॉर्टिंग की भावना को संरक्षित करता है: पुरानी कुकीज़ पहले जाती हैं। यह MemoryCookieStore के लिए बहुत अच्छा काम करता है, क्योंकि Set-Cookie हेडर क्रम में पार्स किए जाते हैं, लेकिन वितरित सिस्टम के लिए उतना अच्छा नहीं हो सकता है। परिष्कृत Stores इसे किसी अन्य लॉजिकल क्लॉक पर सेट करना चाह सकते हैं, ताकि यदि कुकी A और B एक ही मिलीसेकंड में बनाई जाती हैं, लेकिन कुकी A, B से पहले बनाई जाती है, तो A.creationIndex < B.creationIndex। यदि आप वैश्विक काउंटर को बदलना चाहते हैं, जो आपको शायद नहीं करना चाहिए, तो यह Cookie.cookiesCreated में संग्रहीत है।
permuteDomain(domain)उन सभी संभावित डोमेन की एक सूची उत्पन्न करता है जो domainMatch() पैरामीटर से मेल खाते हैं। कुकी स्टोर लागू करने के लिए उपयोगी हो सकता है।
permutePath(path)उन सभी संभावित पथों की एक सूची उत्पन्न करता है जो pathMatch() पैरामीटर से मेल खाते हैं। कुकी स्टोर लागू करने के लिए उपयोगी हो सकता है।
tough.Cookie के माध्यम से निर्यात किया गया।
Cookie.parse(cookieString[, options])एकल Cookie या Set-Cookie HTTP हेडर को एक Cookie ऑब्जेक्ट में पार्स करता है। यदि स्ट्रिंग पार्स नहीं की जा सकती है तो undefined लौटाता है।
options पैरामीटर आवश्यक नहीं है और वर्तमान में केवल एक प्रॉपर्टी है:
true है तो कुंजी-रहित कुकीज़ जैसे =abc और = का पार्सिंग सक्षम करता है, जो RFC-अनुरूप नहीं हैं।यदि options एक ऑब्जेक्ट नहीं है, तो इसे अनदेखा किया जाता है, जिसका अर्थ है कि आप इसके साथ Array#map का उपयोग कर सकते हैं।
यहाँ बताया गया है कि नोड HTTP/HTTPS प्रतिक्रिया पर Set-Cookie हेडर(s) को कैसे संसाधित किया जाए:``` javascript if (res.headers['set-cookie'] instanceof Array) cookies = res.headers['set-cookie'].map(Cookie.parse); else cookies = [Cookie.parse(res.headers['set-cookie'])];
_नोट:_ संस्करण 2.3.3 में, tough-cookie ने `=` से पहले स्पेस की संख्या को 256 वर्णों तक सीमित कर दिया था। यह सीमा अब हटा दी गई है।
देखें [Issue 92](https://github.com/salesforce/tough-cookie/issues/92)
### गुण (Properties)
कुकी ऑब्जेक्ट के गुण:
* _key_ - स्ट्रिंग - कुकी का नाम या कुंजी (डिफ़ॉल्ट "")
* _value_ - स्ट्रिंग - कुकी का मान (डिफ़ॉल्ट "")
* _expires_ - `Date` - यदि सेट किया गया हो, तो कुकी का `Expires=` गुण (डिफ़ॉल्ट स्ट्रिंग `"Infinity"`)। देखें `setExpires()`
* _maxAge_ - सेकंड - यदि सेट किया गया हो, तो कुकी का `Max-Age=` गुण _सेकंड में_। गैर-समाप्ति और तत्काल-समाप्ति के लिए क्रमशः स्ट्रिंग `"Infinity"` और `"-Infinity"` पर भी सेट किया जा सकता है। देखें `setMaxAge()`
* _domain_ - स्ट्रिंग - कुकी का `Domain=` गुण
* _path_ - स्ट्रिंग - कुकी का `Path=` गुण
* _secure_ - बूलियन - `Secure` कुकी फ़्लैग
* _httpOnly_ - बूलियन - `HttpOnly` कुकी फ़्लैग
* _extensions_ - `Array` - कोई भी अपरिचित कुकी गुण स्ट्रिंग के रूप में (भले ही उनमें बराबर के चिह्न हों)
* _creation_ - `Date` - यह कुकी कब बनाई गई थी
* _creationIndex_ - संख्या - निर्माण के समय सेट किया गया, बेहतर छँटाई सटीकता प्रदान करने के लिए उपयोग किया जाता है (पूर्ण स्पष्टीकरण के लिए कृपया `cookieCompare(a,b)` देखें)
कुकी को `CookieJar.setCookie()` के माध्यम से पारित करने के बाद, इसमें निम्नलिखित अतिरिक्त गुण होंगे: