0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2024-12-23 20:33:16 -05:00
logto/packages/core/src/routes/well-known.ts

65 lines
2 KiB
TypeScript
Raw Normal View History

2022-10-21 00:14:17 -05:00
import type { ConnectorMetadata } from '@logto/connector-kit';
import { ConnectorType } from '@logto/connector-kit';
import { adminConsoleApplicationId } from '@logto/schemas';
import etag from 'etag';
2022-10-21 00:14:17 -05:00
import type { Provider } from 'oidc-provider';
2022-11-21 03:38:24 -05:00
import { getLogtoConnectors } from '#src/connectors/index.js';
2022-12-14 00:23:59 -05:00
import { getApplicationIdFromInteraction } from '#src/libraries/session.js';
import { getSignInExperienceForApplication } from '#src/libraries/sign-in-experience/index.js';
2022-11-21 03:38:24 -05:00
import type { AnonymousRouter } from './types.js';
export default function wellKnownRoutes<T extends AnonymousRouter>(router: T, provider: Provider) {
router.get(
'/.well-known/sign-in-exp',
async (ctx, next) => {
2022-11-14 04:57:47 -05:00
const applicationId = await getApplicationIdFromInteraction(ctx, provider);
const [signInExperience, logtoConnectors] = await Promise.all([
2022-11-14 04:57:47 -05:00
getSignInExperienceForApplication(applicationId),
getLogtoConnectors(),
]);
const forgotPassword = {
sms: logtoConnectors.some(({ type }) => type === ConnectorType.Sms),
email: logtoConnectors.some(({ type }) => type === ConnectorType.Email),
};
2022-11-14 04:57:47 -05:00
const socialConnectors =
applicationId === adminConsoleApplicationId
? []
: signInExperience.socialSignInConnectorTargets.reduce<
Array<ConnectorMetadata & { id: string }>
>((previous, connectorTarget) => {
const connectors = logtoConnectors.filter(
({ metadata: { target } }) => target === connectorTarget
2022-11-14 04:57:47 -05:00
);
return [
...previous,
...connectors.map(({ metadata, dbEntry: { id } }) => ({ ...metadata, id })),
];
}, []);
ctx.body = {
...signInExperience,
socialConnectors,
forgotPassword,
};
return next();
},
async (ctx, next) => {
await next();
ctx.response.etag = etag(JSON.stringify(ctx.body));
if (ctx.fresh) {
ctx.status = 304;
ctx.body = null;
}
}
);
}