first commit
This commit is contained in:
52
services/auth-oidc/callback/auth-oidc-callback.class.ts
Normal file
52
services/auth-oidc/callback/auth-oidc-callback.class.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
import type { Params, ServiceInterface } from '@feathersjs/feathers'
|
||||
import type { Application } from '../../../declarations'
|
||||
import { Issuer } from 'openid-client'
|
||||
|
||||
import config from 'config'
|
||||
|
||||
type AuthOidcCallback = string
|
||||
type AuthOidcCallbackData = any
|
||||
type AuthOidcCallbackPatch = any
|
||||
type AuthOidcCallbackQuery = any
|
||||
|
||||
export type { AuthOidcCallback, AuthOidcCallbackData, AuthOidcCallbackPatch, AuthOidcCallbackQuery }
|
||||
|
||||
export interface AuthOidcCallbackServiceOptions {
|
||||
app: Application
|
||||
}
|
||||
|
||||
export interface AuthOidcCallbackParams extends Params<AuthOidcCallbackQuery> {
|
||||
session?: any
|
||||
query: {
|
||||
iss: string,
|
||||
code: string,
|
||||
}
|
||||
}
|
||||
|
||||
export class AuthOidcCallbackService<ServiceParams extends AuthOidcCallbackParams = AuthOidcCallbackParams>
|
||||
implements ServiceInterface<AuthOidcCallback, AuthOidcCallbackData, ServiceParams, AuthOidcCallbackPatch>
|
||||
{
|
||||
constructor(public options: AuthOidcCallbackServiceOptions) { }
|
||||
|
||||
async find(params: ServiceParams): Promise<AuthOidcCallback> {
|
||||
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 = params.session.codeVerifier;
|
||||
const tokenSet = await client.callback(config.get('clientUrl') + '/auth-oidc/callback', { code: params.query.code, iss: params.query.iss }, { code_verifier: codeVerifier });
|
||||
const userinfo = await client.userinfo(tokenSet.access_token as string);
|
||||
|
||||
params.session.user = userinfo;
|
||||
|
||||
return '/'
|
||||
}
|
||||
}
|
||||
|
||||
export const getOptions = (app: Application) => {
|
||||
return { app }
|
||||
}
|
42
services/auth-oidc/callback/auth-oidc-callback.ts
Normal file
42
services/auth-oidc/callback/auth-oidc-callback.ts
Normal file
@@ -0,0 +1,42 @@
|
||||
import { http } from '@feathersjs/transport-commons'
|
||||
import type { Application } from '../../../declarations'
|
||||
import { AuthOidcCallbackService, getOptions } from './auth-oidc-callback.class'
|
||||
|
||||
export const authOidcCallbackPath = 'auth-oidc/callback'
|
||||
export const authOidcCallbackMethods = ['find'] as const
|
||||
|
||||
export * from './auth-oidc-callback.class'
|
||||
|
||||
export const authOidcCallback = (app: Application) => {
|
||||
// TODO: fix this to use the correct type
|
||||
// @ts-ignore
|
||||
app.use(authOidcCallbackPath, new AuthOidcCallbackService(getOptions(app)), {
|
||||
methods: authOidcCallbackMethods,
|
||||
events: []
|
||||
}, (req: any, res: any) => {
|
||||
|
||||
return res.redirect(res.data);
|
||||
})
|
||||
|
||||
app.service(authOidcCallbackPath).hooks({
|
||||
around: {
|
||||
all: []
|
||||
},
|
||||
before: {
|
||||
all: [],
|
||||
find: [],
|
||||
},
|
||||
after: {
|
||||
all: []
|
||||
},
|
||||
error: {
|
||||
all: []
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
declare module '../../../declarations' {
|
||||
interface ServiceTypes {
|
||||
[authOidcCallbackPath]: AuthOidcCallbackService
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user