UNPKG

ltijs

Version:

Easily turn your web application into a LTI 1.3 Learning Tool.

156 lines (155 loc) • 5.76 kB
import type { IdTokenClaim, LtiMessageType } from '#services/launch/id-token.constants'; import type { IdTokenValidationMethod } from '#services/platform-manager/platform-manager.constants'; export interface IdTokenValidation { method: IdTokenValidationMethod; key: string; } export interface PlatformKeys { public: string; private: string; } /** The persisted fields for a platform, excluding its `id` (assigned by `savePlatform`). */ export interface PlatformAttributes { url: string; clientId: string; name: string; authenticationEndpoint: string; accessTokenEndpoint: string; authorizationServer?: string; idTokenValidation: IdTokenValidation; active: boolean; keys: PlatformKeys; } /** A stored platform as returned by `DatabaseManager`'s read methods -- `PlatformAttributes` plus its assigned `id`. */ export interface PlatformRecord extends PlatformAttributes { id: string; } export interface PlatformFilter { url?: string; name?: string; clientId?: string | string[]; } /** A cached platform-issued OAuth2 access token (client-credentials grant), keyed by `platformUrl`+`clientId`+`scopes`. */ export interface AccessTokenRecord { access_token: string; token_type: string; expires_in: number; scope?: string; createdAt: number; } export interface ToolPlatformClaim { name?: string; description?: string; guid?: string; contact_email?: string; version?: string; product_family_code?: string; [claim: string]: unknown; } export interface LaunchPresentationClaim { document_target?: string; width?: number; height?: number; return_url?: string; locale?: string; [claim: string]: unknown; } export interface DeepLinkingSettingsClaim { accept_types?: string[]; accept_media_types?: string[]; accept_presentation_document_targets?: string[]; accept_multiple?: boolean; auto_create?: boolean; title?: string; text?: string; data?: string; deep_link_return_url?: string; [claim: string]: unknown; } export interface AssignmentAndGradesClaim { scope?: string[]; lineitem?: string; lineitems?: string; [claim: string]: unknown; } export interface ContextClaim { id?: string; label?: string; title?: string; type?: string[]; [claim: string]: unknown; } export interface ResourceLinkClaim { id?: string; title?: string; description?: string; [claim: string]: unknown; } export interface NamesRoleServiceClaim { context_memberships_url?: string; service_versions?: string[]; [claim: string]: unknown; } export interface ForUserClaim { user_id?: string; [claim: string]: unknown; } /** The raw, validated claims of an LTI 1.3 id_token, keyed by their spec-defined claim URIs/names (see `IdTokenClaim`). */ export interface IdTokenClaims { [IdTokenClaim.Iss]: string; [IdTokenClaim.Sub]: string; [IdTokenClaim.Aud]?: string | string[]; [IdTokenClaim.Azp]?: string; [IdTokenClaim.Exp]?: number; [IdTokenClaim.Iat]?: number; [IdTokenClaim.Nonce]?: string; [IdTokenClaim.GivenName]?: string; [IdTokenClaim.FamilyName]?: string; [IdTokenClaim.Name]?: string; [IdTokenClaim.Email]?: string; [IdTokenClaim.ClientId]: string; [IdTokenClaim.PlatformId]: string; [IdTokenClaim.DeploymentId]: string; [IdTokenClaim.MessageType]: LtiMessageType; [IdTokenClaim.Version]: string; [IdTokenClaim.Roles]: string[]; [IdTokenClaim.RoleScopeMentor]?: string[]; [IdTokenClaim.TargetLinkUri]?: string; [IdTokenClaim.ToolPlatform]?: ToolPlatformClaim; [IdTokenClaim.Context]?: ContextClaim; [IdTokenClaim.ResourceLink]?: ResourceLinkClaim; [IdTokenClaim.LaunchPresentation]?: LaunchPresentationClaim; [IdTokenClaim.Custom]?: Record<string, unknown>; [IdTokenClaim.Lis]?: Record<string, unknown>; [IdTokenClaim.ForUser]?: ForUserClaim; [IdTokenClaim.Endpoint]?: AssignmentAndGradesClaim; [IdTokenClaim.NamesRoleService]?: NamesRoleServiceClaim; [IdTokenClaim.DeepLinkingSettings]?: DeepLinkingSettingsClaim; [claim: string]: unknown; } /** A stored id_token as returned by `getIdToken` -- `IdTokenClaims` plus the record's own `id`. */ export interface IdTokenRecord extends IdTokenClaims { id: string; } /** * The pluggable storage contract `Provider` reads/writes platforms, access tokens, id tokens, and OIDC * nonces through. The default implementation is `MongoDatabaseManager`; implement this interface directly * to back ltijs with anything else (a different database, an ORM, a remote service), and pass it via * `ProviderOptions.databaseManager`. */ export interface DatabaseManager { listen: () => Promise<void>; close: () => Promise<void>; getPlatforms: (filter?: PlatformFilter) => Promise<PlatformRecord[]>; getPlatformById: (id: string) => Promise<PlatformRecord | undefined>; getPlatformByUrlAndClientId: (url: string, clientId: string) => Promise<PlatformRecord | undefined>; savePlatform: (platform: PlatformAttributes) => Promise<string>; updatePlatformById: (id: string, fields: Partial<PlatformAttributes>) => Promise<void>; deletePlatformById: (id: string) => Promise<void>; getAccessToken: (platformUrl: string, clientId: string, scopes: string) => Promise<AccessTokenRecord | undefined>; saveAccessToken: (platformUrl: string, clientId: string, scopes: string, token: AccessTokenRecord) => Promise<string>; getIdToken: (id: string) => Promise<IdTokenRecord | undefined>; saveIdToken: (token: IdTokenClaims) => Promise<string>; saveNonce: (nonce: string) => Promise<string>; consumeNonce: (nonce: string) => Promise<boolean>; }