Vorrei ripetere questa parte della domanda che le risposte qui stanno ignorando:
Può essere fatto in poche righe di codice, senza la necessità di inserire una lib di terze parti?
Lettura dei cookie
I cookie vengono letti dalle richieste con l' Cookie
intestazione. Includono solo un name
e value
. A causa del modo in cui funzionano i percorsi, è possibile inviare più cookie con lo stesso nome. In NodeJS, tutti i cookie vengono inseriti in un'unica stringa quando vengono inviati Cookie
nell'intestazione. Li hai divisi con ;
. Una volta che hai un cookie, tutto a sinistra degli uguali (se presente) è il name
, e tutto ciò che segue è il value
. Alcuni browser accetteranno un cookie senza segno di uguale e presumeranno il nome vuoto. Gli spazi bianchi non contano come parte del cookie. I valori possono anche essere racchiusi tra virgolette doppie ( "
). I valori possono anche contenere =
. Ad esempio, formula=5+3=8
è un cookie valido.
/**
* @param {string} [cookieString='']
* @return {[string,string][]} String Tuple
*/
function getEntriesFromCookie(cookieString = '') {
return cookieString.split(';').map((pair) => {
const indexOfEquals = pair.indexOf('=');
let name;
let value;
if (indexOfEquals === -1) {
name = '';
value = pair.trim();
} else {
name = pair.substr(0, indexOfEquals).trim();
value = pair.substr(indexOfEquals + 1).trim();
}
const firstQuote = value.indexOf('"');
const lastQuote = value.lastIndexOf('"');
if (firstQuote !== -1 && lastQuote !== -1) {
value = value.substring(firstQuote + 1, lastQuote);
}
return [name, value];
});
}
const cookieEntries = getEntriesFromCookie(request.headers.Cookie);
const object = Object.fromEntries(cookieEntries.slice().reverse());
Se non ti aspetti nomi duplicati, puoi convertirlo in un oggetto che semplifica le cose. Quindi è possibile accedere come object.myCookieName
per ottenere il valore. Se ti aspetti duplicati, allora vuoi farlo scorrere cookieEntries
. I browser alimentano i cookie con priorità decrescente, pertanto l'inversione garantisce che nell'oggetto venga visualizzato il cookie con priorità più alta. (Il .slice()
per evitare la mutazione dell'array.)
Impostazioni cookie
La "scrittura" dei cookie viene eseguita utilizzando l' Set-Cookie
intestazione nella risposta. L' response.headers['Set-Cookie']
oggetto è in realtà un array, quindi ti spingerai ad esso. Accetta una stringa ma ha più valori di solo name
e value
. La parte più difficile è scrivere la stringa, ma questo può essere fatto in una riga.
/**
* @param {Object} options
* @param {string} [options.name='']
* @param {string} [options.value='']
* @param {Date} [options.expires]
* @param {number} [options.maxAge]
* @param {string} [options.domain]
* @param {string} [options.path]
* @param {boolean} [options.secure]
* @param {boolean} [options.httpOnly]
* @param {'Strict'|'Lax'|'None'} [options.sameSite]
* @return {string}
*/
function createSetCookie(options) {
return (`${options.name || ''}=${options.value || ''}`)
+ (options.expires != null ? `; Expires=${options.expires.toUTCString()}` : '')
+ (options.maxAge != null ? `; Max-Age=${options.maxAge}` : '')
+ (options.domain != null ? `; Domain=${options.domain}` : '')
+ (options.path != null ? `; Path=${options.path}` : '')
+ (options.secure ? '; Secure' : '')
+ (options.httpOnly ? '; HttpOnly' : '')
+ (options.sameSite != null ? `; SameSite=${options.sameSite}` : '');
}
const newCookie = createSetCookie({
name: 'cookieName',
value: 'cookieValue',
path:'/',
});
response.headers['Set-Cookie'].push(newCookie);
Ricorda che puoi impostare più cookie perché puoi effettivamente impostare più Set-Cookie
intestazioni nella tua richiesta. Ecco perché è un array.
Nota sulle librerie esterne:
Se si decide di utilizzare la express
,, cookie-parser
o cookie
, notare che hanno valori predefiniti non standard. I cookie analizzati sono sempre decodificati URI (decodificati in percentuale). Ciò significa che se si utilizza un nome o un valore con uno dei seguenti caratteri: !#$%&'()*+/:<=>?@[]^`{|}
verranno gestiti in modo diverso con tali librerie. Se stai impostando i cookie, vengono codificati %{HEX}
. E se stai leggendo un cookie devi decodificarli.
Ad esempio, mentre email=name@domain.com
è un cookie valido, queste librerie lo codificheranno come email=name%40domain.com
. La decodifica può presentare problemi se si utilizza il %
cookie. Verrà rovinato. Ad esempio, il tuo cookie che era: secretagentlevel=50%007and50%006
diventasecretagentlevel=507and506
. Questo è un caso limite, ma qualcosa da notare se si cambia libreria.
Inoltre, su queste librerie, i cookie sono impostati con un valore predefinito, il path=/
che significa che vengono inviati su ogni richiesta url all'host.
Se vuoi codificare o decodificare questi valori tu stesso, puoi usare encodeURIComponent
o decodeURIComponent
, rispettivamente.
Riferimenti:
Informazioni aggiuntive:
=
segno uguale ( ) come in uno dei cookie di Facebook comefbm_1234123412341234=base_domain=.domain.com
.