pkce.js 746 B

12345678910111213141516171819202122232425
  1. import crypto from 'node:crypto';
  2. /**
  3. * Generate a PKCE S256 code challenge from a code verifier.
  4. * @param {string} codeVerifier
  5. * @returns {string}
  6. */
  7. export function generateCodeChallenge(codeVerifier) {
  8. const hash = crypto.createHash('sha256').update(codeVerifier).digest();
  9. return hash.toString('base64url');
  10. }
  11. /**
  12. * Verify a PKCE S256 code challenge against a code verifier.
  13. * @param {string} verifier
  14. * @param {string} challenge
  15. * @returns {boolean}
  16. */
  17. export function verifyCodeChallenge(verifier, challenge) {
  18. const regenerated = generateCodeChallenge(verifier);
  19. const a = Buffer.from(regenerated);
  20. const b = Buffer.from(challenge);
  21. if (a.length !== b.length) return false;
  22. return crypto.timingSafeEqual(a, b);
  23. }