Files
headquarter/apps/web/src/auth/oidc.ts
T
2026-05-16 14:52:05 +00:00

59 lines
1.7 KiB
TypeScript

function generateRandomString(length: number): string {
const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
let text = ''
for (let i = 0; i < length; i++) {
text += possible.charAt(Math.floor(Math.random() * possible.length))
}
return text
}
async function generateCodeChallenge(verifier: string): Promise<string> {
const encoder = new TextEncoder()
const data = encoder.encode(verifier)
const digest = await crypto.subtle.digest('SHA-256', data)
const base64 = btoa(String.fromCharCode(...new Uint8Array(digest)))
return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '')
}
export async function createPKCE(): Promise<{ verifier: string; challenge: string }> {
const verifier = generateRandomString(128)
const challenge = await generateCodeChallenge(verifier)
return { verifier, challenge }
}
export function storePKCE(verifier: string): void {
sessionStorage.setItem('pkce_verifier', verifier)
}
export function getPKCE(): string | null {
return sessionStorage.getItem('pkce_verifier')
}
export function clearPKCE(): void {
sessionStorage.removeItem('pkce_verifier')
}
export function storeState(state: string): void {
sessionStorage.setItem('oidc_state', state)
}
export function getState(): string | null {
return sessionStorage.getItem('oidc_state')
}
export function clearState(): void {
sessionStorage.removeItem('oidc_state')
}
export function storeToken(token: string): void {
localStorage.setItem('access_token', token)
}
export function getToken(): string | null {
return localStorage.getItem('access_token')
}
export function clearToken(): void {
localStorage.removeItem('access_token')
}