From dd79be58852bf48d742f211e609258f04e52ebe4 Mon Sep 17 00:00:00 2001 From: steel <mael.acier@ensiie.fr> Date: Mon, 6 May 2024 00:05:39 +0200 Subject: [PATCH] feat: claims --- package.json | 2 +- src/lib/default.ts | 28 +++++++++++++++++++++------- src/lib/index.ts | 4 ++-- src/lib/lucia.ts | 17 +++++++++++++---- src/lib/types.ts | 6 +++--- 5 files changed, 40 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 4440b79..c2c3521 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@arise/aidc-sveltekit", - "version": "0.2.3", + "version": "0.3.0", "type": "module", "scripts": { "dev": "vite dev", diff --git a/src/lib/default.ts b/src/lib/default.ts index 3386c2d..b23e776 100644 --- a/src/lib/default.ts +++ b/src/lib/default.ts @@ -1,10 +1,16 @@ import { BetterSqlite3Adapter } from "@lucia-auth/adapter-sqlite"; import sqlite from "better-sqlite3"; import type { Database as SqLiteConnection } from "better-sqlite3"; -import { LuciaWrapper } from "./lucia.js"; +import { + LuciaWrapper, + type DefaultSessionAttributes, + type DefaultUserAttributes, +} from "./lucia.js"; import type { IdTokenClaims, UserinfoResponse } from "openid-client"; -class DefaultLucia extends LuciaWrapper<DatabaseUser> { +class DefaultLucia< + UserInfo extends {} = Record<string, unknown>, +> extends LuciaWrapper<Omit<DatabaseUser<UserInfo>, "id">> { db: SqLiteConnection; constructor() { @@ -14,6 +20,14 @@ class DefaultLucia extends LuciaWrapper<DatabaseUser> { user: "user", session: "session", }), + { + getUserAttributes(attributes) { + return { + subject: attributes.subject, + claims: JSON.parse(attributes.claims), + }; + }, + }, ); this.db = db; } @@ -34,7 +48,7 @@ class DefaultLucia extends LuciaWrapper<DatabaseUser> { )`); } - getUser(subject: string): DatabaseUser | undefined { + getUser(subject: string): DatabaseUser<UserInfo> | undefined { const user = this.db .prepare("SELECT * FROM user WHERE subject = ?") .get(subject) as InternalUser | undefined; @@ -58,7 +72,7 @@ export const defaultLucia = new DefaultLucia(); declare module "lucia" { interface Register { Lucia: typeof defaultLucia.lucia; - DatabaseUserAttributes: Omit<DatabaseUser, "id">; + DatabaseUserAttributes: Omit<InternalUser, "id">; DatabaseSessionAttributes: Omit<DatabaseSession, "id">; } } @@ -68,12 +82,12 @@ interface InternalUser { subject: string; claims: string; } -export interface DatabaseUser { +export interface DatabaseUser<T extends {}> extends DefaultUserAttributes { id: string; subject: string; - claims: UserinfoResponse; + claims: UserinfoResponse<T>; } -export interface DatabaseSession { +export interface DatabaseSession extends DefaultSessionAttributes { id: string; id_token: string; } diff --git a/src/lib/index.ts b/src/lib/index.ts index 83b3088..8530c8b 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -20,7 +20,7 @@ export class AriseIdConnect<DbUser extends DatabaseUser> { protected cookieNames: CookieNames; constructor( - readonly config: Config<DbUser>, + readonly config: Config, issuer: Issuer, ) { this.client = new issuer.Client({ @@ -45,7 +45,7 @@ export class AriseIdConnect<DbUser extends DatabaseUser> { } static async init<DbUser extends DatabaseUser>( - config: Config<DbUser>, + config: Config, ): Promise<AriseIdConnect<DbUser>> { const issuer = await Issuer.discover( config.issuer || diff --git a/src/lib/lucia.ts b/src/lib/lucia.ts index 44b85ca..e4c54d9 100644 --- a/src/lib/lucia.ts +++ b/src/lib/lucia.ts @@ -19,10 +19,17 @@ export interface DatabaseSession { id_token: string; } +export interface DefaultUserAttributes { + subject: string; +} +export interface DefaultSessionAttributes { + id_token: string; +} + export abstract class LuciaWrapper< - DbUser extends DatabaseUser, - _SessionAttributes extends { id_token: string } = { id_token: string }, - _UserAttributes extends { subject: string } = { subject: string }, + _UserAttributes extends DefaultUserAttributes = DefaultUserAttributes, + _SessionAttributes extends + DefaultSessionAttributes = DefaultSessionAttributes, > { lucia: Lucia<_SessionAttributes, _UserAttributes>; @@ -61,7 +68,9 @@ export abstract class LuciaWrapper< } abstract initDatabase(): MaybePromise<void>; - abstract getUser(subject: string): MaybePromise<DbUser | undefined>; + abstract getUser( + subject: string, + ): MaybePromise<(_UserAttributes & { id: string }) | undefined>; abstract createUser( subject: string, userId: string, diff --git a/src/lib/types.ts b/src/lib/types.ts index 2195894..d664534 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,8 +1,8 @@ import type { MaybePromise, RequestEvent } from "@sveltejs/kit"; import type { ClientMetadata, UserinfoResponse, errors } from "openid-client"; -import type { DatabaseUser, LuciaWrapper } from "./lucia.js"; +import type { LuciaWrapper } from "./lucia.js"; -export interface Config<DbUser extends DatabaseUser> extends ClientMetadata { +export interface Config extends ClientMetadata { client_secret: string; scope: string; issuer?: string; @@ -11,7 +11,7 @@ export interface Config<DbUser extends DatabaseUser> extends ClientMetadata { login?: (event: RequestEvent, userInfo: UserinfoResponse) => never; logout?: (event: RequestEvent) => MaybePromise<void>; }; - wrapper: LuciaWrapper<DbUser>; + wrapper: LuciaWrapper; cookieNames?: Partial<CookieNames>; paths?: Partial<Paths>; } -- GitLab