0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2025-02-10 21:58:23 -05:00
logto/packages/core/src/middleware/koa-auto-consent.ts
2024-01-22 02:29:32 +00:00

49 lines
1.5 KiB
TypeScript

import { demoAppApplicationId } from '@logto/schemas';
import { type MiddlewareType } from 'koa';
import { type IRouterParamContext } from 'koa-router';
import type Provider from 'oidc-provider';
import { errors } from 'oidc-provider';
import { EnvSet } from '#src/env-set/index.js';
import { consent } from '#src/libraries/session.js';
import type Queries from '#src/tenants/Queries.js';
import assertThat from '#src/utils/assert-that.js';
/**
* Automatically consent for the first party apps.
*/
export default function koaAutoConsent<StateT, ContextT extends IRouterParamContext, ResponseBodyT>(
provider: Provider,
query: Queries
): MiddlewareType<StateT, ContextT, ResponseBodyT> {
return async (ctx, next) => {
const interactionDetails = await provider.interactionDetails(ctx.req, ctx.res);
const { client_id: clientId } = interactionDetails.params;
const {
applications: { findApplicationById },
} = query;
assertThat(
clientId && typeof clientId === 'string',
new errors.InvalidClient('client must be available')
);
// Demo app not in the database
const application =
clientId === demoAppApplicationId ? undefined : await findApplicationById(clientId);
// FIXME: @simeng-li remove this when the IdP is ready
const shouldAutoConsent = !EnvSet.values.isDevFeaturesEnabled || !application?.isThirdParty;
if (shouldAutoConsent) {
const redirectTo = await consent(ctx, provider, query, interactionDetails);
ctx.redirect(redirectTo);
return;
}
return next();
};
}