diff options
| author | LLLL Colonq <llll@colonq> | 2023-12-19 13:08:22 -0500 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2023-12-19 13:08:22 -0500 |
| commit | 0be357bb60a2bc4523056aba34add78b715211f5 (patch) | |
| tree | 5c401183dc05342ee6efc8a4bd163e60a0c17298 /fig-frontend/client/src/twitch.ts | |
| parent | 40a3ac0bd9188139c2cd6b8b1b116e20b6ed8446 (diff) | |
Add fig-frontend
Diffstat (limited to 'fig-frontend/client/src/twitch.ts')
| -rw-r--r-- | fig-frontend/client/src/twitch.ts | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/fig-frontend/client/src/twitch.ts b/fig-frontend/client/src/twitch.ts new file mode 100644 index 0000000..4c264be --- /dev/null +++ b/fig-frontend/client/src/twitch.ts @@ -0,0 +1,43 @@ +import * as Config from "./config"; + +function generateNonce(): string { + var arr = new Uint8Array(20); + window.crypto.getRandomValues(arr); + return Array.from(arr, b => b.toString(16).padStart(2, "0")).join(""); +} + +export function startTwitchAuth() { + const nonce = generateNonce(); + document.cookie = `authnonce=${nonce}; path=/;`; + window.location.href = + `https://id.twitch.tv/oauth2/authorize?response_type=id_token` + + `&client_id=${Config.CLIENT_ID}` + + `&redirect_uri=${Config.URL}` + + `&scope=openid` + + `&nonce=${nonce}` + + `&claims=${{id_token: {preferred_username: null}}}` + ; +} + +export function getFragmentQuery(): Map<string, string> { + let query = new Map(); + const hashQuery = document.location.hash.slice(1).split("&"); + for (let equals of hashQuery) { + const pair = equals.split("="); + query.set(decodeURIComponent(pair[0]), decodeURIComponent(pair[1])); + } + return query; +} + +export function getAuthToken(): String | null { + const frag = getFragmentQuery(); + const token = frag.get("id_token"); + if (token) { + document.cookie = `id_token=${token}; path=/; SameSite=Strict`; + } + for (let c of document.cookie.split("; ")) { + const [k, v] = c.split("="); + if (k === "id_token") return v; + } + return null; +} |
