sba-website/src/services/authenticationService.ts
2024-01-24 21:39:33 -05:00

75 lines
2.5 KiB
TypeScript

import { fetchActiveTeamByOwnerId } from './teamsService'
import { SITE_URL } from './utilities'
export function authenticate(): void {
// MAJOR DOMO - 712002920950005870
const clientID = '712002920950005870'
// TODO: dynamically redirect to current view by getting current query params and adding them back on after?
const redirectURI = encodeURIComponent(SITE_URL)
const scope = 'identify' // Adjust the scope as needed
window.location.href = `https://discord.com/oauth2/authorize?client_id=${clientID}&redirect_uri=${redirectURI}&response_type=token&scope=${scope}`
}
export async function isDiscordAuthenticated(): Promise<boolean> {
const ownerId: string | undefined = getOwnerId()
if (!ownerId) return false
// white list kiger for card access
if (ownerId === '308005533028319232') return true
return !!(await fetchActiveTeamByOwnerId(ownerId))
}
export function getOwnerId(): string | undefined {
return parseCookie(document.cookie)?.discord
}
export async function completeAuthentication(): Promise<void> {
if (!window.location.hash) {
// console.warn('No token hash found in return URL')
return
}
// Extract the access token from the URL params
const urlParams = new URLSearchParams(window.location.hash.slice(1))
const accessToken = urlParams.get('access_token')
const tokenType = urlParams.get('token_type') //should be 'Bearer'
const userResponse = await fetch('https://discord.com/api/users/@me', {
headers: {
authorization: `${tokenType} ${accessToken}`
}
})
if (!userResponse.ok) {
console.warn('userResponse was not OK', userResponse)
return
}
// right now we only care about the id property but we could make a full discord account object if desired
const user: { id: string } = await userResponse.json()
if (!user?.id) {
console.warn('No user or id found while authenticating')
return
}
window.location.href = SITE_URL
saveOwnerIdCookie(user.id)
}
// Based on https://www.30secondsofcode.org/js/s/parse-cookie/
export function parseCookie(cookie: string | undefined): { [key: string]: string } {
if (!cookie) return {}
return cookie.split(';')
.map(v => v.split('='))
.reduce((acc: { [key: string]: string }, v) => {
acc[decodeURIComponent(v[0].trim())] = decodeURIComponent(v[1].trim())
return acc
}, {})
}
export function saveOwnerIdCookie(ownerId: string): void {
document.cookie = `discord=${ownerId}; expires=Fri, 1 Jan 2100 12:00:00 UTC; path=/`
}
export function clearCookie(): void {
document.cookie = 'discord=;-1;path=/'
}