fastify-oidc-provider
Version:
Fastify plugin for oidc-provider
75 lines (59 loc) • 1.83 kB
JavaScript
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'
})