import type { Params, ServiceInterface } from '@feathersjs/feathers'; import type { Application } from '../../declarations'; import { Issuer, generators } from 'openid-client'; import config from 'config'; type AuthOidcResponse = string; type AuthOidcQuery = any; export type { AuthOidcResponse as AuthOidc, AuthOidcQuery }; export interface AuthOidcServiceOptions { app: Application; } export interface AuthOidcParams extends Params { session?: any; } export class AuthOidcService implements ServiceInterface { constructor(public options: AuthOidcServiceOptions) {} async find(params: ServiceParams): Promise { const issuer = await Issuer.discover(config.get('oidc.gatewayUri')); const client = new issuer.Client({ client_id: config.get('oidc.clientId'), client_secret: config.get('oidc.clientSecret'), redirect_uris: [config.get('oidc.redirectUris')], response_types: ['code'], }); const codeVerifier = generators.codeVerifier(); const codeChallenge = generators.codeChallenge(codeVerifier); const url = client.authorizationUrl({ redirect_uri: config.get('clientUrl') + '/auth-oidc/callback', scope: 'openid profile offline_access', response_type: 'code', code_challenge: codeChallenge, code_challenge_method: 'S256', }); params.session.codeVerifier = codeVerifier; return url; } } export const getOptions = (app: Application) => { return { app }; };