UNPKG

fastify-oidc-provider

Version:

Fastify plugin for oidc-provider

75 lines (59 loc) 1.83 kB
'use strict' const fp = require('fastify-plugin') const { Provider } = require('oidc-provider') const isObjectLiteral = (x) => x?.constructor?.name === 'Object' async function plugin(fastify, options) { if (!isObjectLiteral(options)) { throw new Error('Expected options to be an object literal') } let issuer try { issuer = new URL(options.issuer).href } catch { throw new Error('Expected options.issuer to be a URL') } if (!isObjectLiteral(options.setup)) { throw new Error('Expected options.setup to be an object literal') } const customGrants = [].concat(options.customGrants || []).filter(Boolean) const validCustomGrants = customGrants && customGrants.every(isObjectLiteral) if (!validCustomGrants) { throw new Error( 'Expected options.customGrants to be an object literal or array of object literals' ) } const provider = new Provider(issuer, options.setup) customGrants.forEach( ({ grantType, tokenExchangeHandler, parameters, allowedDuplicateParameters }) => { provider.registerGrantType( grantType, tokenExchangeHandler, parameters, allowedDuplicateParameters ) } ) const interactionDetails = (req, reply) => { return provider.interactionDetails(req.raw, reply.raw) } const interactionFinished = (req, reply, result, options) => { return provider.interactionFinished(req.raw, reply.raw, result, options) } const interactionResult = (req, reply, result, options) => { return provider.interactionResult(req.raw, reply.raw, result, options) } fastify.decorate('oidcProvider', { interactionDetails, interactionFinished, interactionResult }) } module.exports = fp(plugin, { fastify: '3.x', name: 'fastify-oidc-provider' })