-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpkce.ts
39 lines (32 loc) · 1.11 KB
/
pkce.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import sha from 'sha.js'
import {getRandomValues} from './crypto'
import {stringFromBuffer, base64urlFromString} from './buffers'
function generateCodeVerifier() {
// eslint-disable-next-line @typescript-eslint/no-magic-numbers
const typedArray = new Uint8Array(96)
const codeVerifierBytes = getRandomValues(typedArray)
const codeVerifierString = stringFromBuffer(codeVerifierBytes)
return base64urlFromString(codeVerifierString)
}
function generateCodeChallenge(codeVerifier: string) {
const codeChallengeS256 = sha('sha256').update(codeVerifier)
const codeChallengeBytes = codeChallengeS256.digest()
const codeChallengeString = stringFromBuffer(codeChallengeBytes)
return base64urlFromString(codeChallengeString)
}
/** PKCE data */
export interface PKCE {
codeVerifier: string
codeChallenge: string
codeChallengeMethod: string
}
/** Generate PKCE challenge and verifier */
export function generatePKCE(): PKCE {
const codeVerifier = generateCodeVerifier()
const codeChallenge = generateCodeChallenge(codeVerifier)
return {
codeVerifier,
codeChallenge,
codeChallengeMethod: 'S256'
}
}