diff --git a/.env.example b/.env.example index de29bcc..3117396 100644 --- a/.env.example +++ b/.env.example @@ -9,9 +9,13 @@ OAUTH2__GET_TOKEN= OAUTH2__CLIENT_ID= # Client secret OAUTH2__CLIENT_SECRET= +# OAuth2 scopes +OAUTH2__SCOPES=openid profile # Userinfo route USERINFO__ROUTE= +# Identifier you'd like to use to link avatars with +USERINFO__IDENTIFIER=preferred_username # Prisma database URL DATABASE_URL="file:./data.db" \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index b5f7e63..2398c2b 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 3026369..042b28e 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "type": "module", "dependencies": { "@fontsource-variable/inter": "^5.0.18", + "@fontsource-variable/noto-sans-mono": "^5.0.20", "@prisma/client": "5.16.2" } } diff --git a/src/lib/configuration.ts b/src/lib/configuration.ts index 47823f6..b9522c2 100644 --- a/src/lib/configuration.ts +++ b/src/lib/configuration.ts @@ -7,11 +7,13 @@ const configuration = { }, client: { id: process.env.OAUTH2__CLIENT_ID, - secret: process.env.OAUTH2__CLIENT_SECRET + secret: process.env.OAUTH2__CLIENT_SECRET, + scopes: process.env.OAUTH2__SCOPES } }, userinfo: { - route: process.env.USERINFO__ROUTE + route: process.env.USERINFO__ROUTE, + identifier: process.env.USERINFO__IDENTIFIER } } export default configuration \ No newline at end of file diff --git a/src/lib/index.ts b/src/lib/index.ts index bb41ccf..3baee3d 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -92,41 +92,44 @@ export async function getUserInfo(id: string) { }) if (!tokenInfo) return + let userInfo + // check for cached userinfo if (userInfoCache.has(tokenInfo.owner)) - return userInfoCache.get(tokenInfo.owner) - + userInfo = userInfoCache.get(tokenInfo.owner) + else { let userInfoRequest = await fetchUserInfo(tokenInfo.token) - if (!userInfoRequest.ok) { - // assume that token has expired. - // try fetching a new one + if (!userInfoRequest.ok) { + // assume that token has expired. + // try fetching a new one - if (!tokenInfo.refreshToken) return // no refresh token. back out - let token = await getNewToken({ - grant_type: "refresh_token", - refresh_token: tokenInfo.refreshToken - }) + if (!tokenInfo.refreshToken) return // no refresh token. back out + let token = await getNewToken({ + grant_type: "refresh_token", + refresh_token: tokenInfo.refreshToken + }) - if (!token) return // refresh failed. back out - prisma.token.update({ - where: { id }, - data: { - token: token.access_token, - refreshToken: token.refresh_token - } - }) + if (!token) return // refresh failed. back out + prisma.token.update({ + where: { id }, + data: { + token: token.access_token, + refreshToken: token.refresh_token + } + }) - userInfoRequest = await fetchUserInfo(token.access_token) - if (!userInfoRequest.ok) return // Give up + userInfoRequest = await fetchUserInfo(token.access_token) + if (!userInfoRequest.ok) return // Give up + } + + userInfo = await userInfoRequest.json() + + // cache userinfo + userInfoCache.set(tokenInfo.owner, userInfo) + setTimeout(() => userInfoCache.delete(tokenInfo.owner), 60*60*1000) } - const userInfo = await userInfoRequest.json() - - // cache userinfo - userInfoCache.set(tokenInfo.owner, userInfo) - setTimeout(() => userInfoCache.delete(tokenInfo.owner), 60*60*1000) - - return userInfo as User + return { ...userInfo, identifier: userInfo[configuration.userinfo.identifier] } as User } export function deleteToken(id: string) { diff --git a/src/lib/types.ts b/src/lib/types.ts index 9b37fe3..c578975 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,4 +1,5 @@ export interface User { name: string sub: string + identifier: string } \ No newline at end of file diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 36e1dc8..0ade011 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,5 +1,6 @@ + +

Hi, {data.user.name}

- Your identifier is {data.user.sub}. -

\ No newline at end of file + The sub claim is set to {data.user.sub}. + Your identifier is {data.user.identifier}. +

+
+ + + +
\ No newline at end of file