24 lines
1.1 KiB
JavaScript
24 lines
1.1 KiB
JavaScript
/**
|
|
* Bestätigungs-Token einer Auftragsbestätigung (Übersicht V4 „L5“): 32 Zufallsbytes als base64url (43 Zeichen),
|
|
* gespeichert wird nur der SHA-256-Hash in Hex. Gültig 60 Tage ab dem letzten Versand.
|
|
* Importiert bewusst nur node:crypto und konstanten.js (nie server/config.js).
|
|
*/
|
|
import { createHash, randomBytes } from 'node:crypto'
|
|
import { TOKEN_GUELTIG_TAGE } from './konstanten.js'
|
|
|
|
const TAG_MS = 86_400_000
|
|
const TOKEN_FORMAT = /^[A-Za-z0-9_-]{43}$/
|
|
|
|
const sha256Hex = (text) => createHash('sha256').update(text).digest('hex')
|
|
|
|
export function neuerToken(jetzt = new Date()) {
|
|
if (!(jetzt instanceof Date) || !Number.isFinite(jetzt.getTime())) throw new TypeError('neuerToken: jetzt muss ein gültiges Date sein')
|
|
const token = randomBytes(32).toString('base64url')
|
|
return { token, hash: sha256Hex(token), gueltigBis: new Date(jetzt.getTime() + TOKEN_GUELTIG_TAGE * TAG_MS) }
|
|
}
|
|
|
|
/** Hash eines Tokens aus einem Link; `null`, wenn der Text nicht das Format eines Tokens hat. */
|
|
export function hashToken(token) {
|
|
return typeof token === 'string' && TOKEN_FORMAT.test(token) ? sha256Hex(token) : null
|
|
}
|