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