0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2025-01-27 21:39:16 -05:00
logto/packages/core/src/oidc/utils.ts

73 lines
2.3 KiB
TypeScript
Raw Normal View History

2022-10-21 13:14:17 +08:00
import type { CustomClientMetadata, OidcClientMetadata } from '@logto/schemas';
import { ApplicationType, customClientMetadataGuard, GrantType } from '@logto/schemas';
2022-09-21 13:06:56 +08:00
import { conditional } from '@silverhand/essentials';
2022-10-21 13:14:17 +08:00
import type { AllClientMetadata, ClientAuthMethod } from 'oidc-provider';
import { errors } from 'oidc-provider';
2021-08-18 00:24:00 +08:00
import type { EnvSet } from '#src/env-set/index.js';
export const getConstantClientMetadata = (
envSet: EnvSet,
type: ApplicationType
): AllClientMetadata => {
const { jwkSigningAlg } = envSet.oidc;
2022-09-21 13:06:56 +08:00
const getTokenEndpointAuthMethod = (): ClientAuthMethod => {
switch (type) {
case ApplicationType.Native:
2023-02-16 23:49:03 +08:00
case ApplicationType.SPA: {
2022-09-21 13:06:56 +08:00
return 'none';
2023-02-16 23:49:03 +08:00
}
default: {
2022-09-21 13:06:56 +08:00
return 'client_secret_basic';
2023-02-16 23:49:03 +08:00
}
2022-09-21 13:06:56 +08:00
}
};
return {
application_type: type === ApplicationType.Native ? 'native' : 'web',
grant_types:
type === ApplicationType.MachineToMachine
? [GrantType.ClientCredentials]
: [GrantType.AuthorizationCode, GrantType.RefreshToken],
token_endpoint_auth_method: getTokenEndpointAuthMethod(),
response_types: conditional(type === ApplicationType.MachineToMachine && []),
// https://www.scottbrady91.com/jose/jwts-which-signing-algorithm-should-i-use
authorization_signed_response_alg: jwkSigningAlg,
userinfo_signed_response_alg: jwkSigningAlg,
id_token_signed_response_alg: jwkSigningAlg,
introspection_signed_response_alg: jwkSigningAlg,
2022-09-21 13:06:56 +08:00
};
};
export const buildOidcClientMetadata = (metadata?: OidcClientMetadata): OidcClientMetadata => ({
redirectUris: [],
postLogoutRedirectUris: [],
...metadata,
2021-08-18 00:24:00 +08:00
});
export const validateCustomClientMetadata = (key: string, value: unknown) => {
const result = customClientMetadataGuard.pick({ [key]: true }).safeParse({ [key]: value });
if (!result.success) {
throw new errors.InvalidClientMetadata(key);
}
};
export const isOriginAllowed = (
origin: string,
{ corsAllowedOrigins = [] }: CustomClientMetadata,
redirectUris: string[] = []
) => {
const redirectUriOrigins = redirectUris.map((uri) => new URL(uri).origin);
return [...corsAllowedOrigins, ...redirectUriOrigins].includes(origin);
};
export const getUtcStartOfToday = () => {
const now = new Date();
return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), 0, 0, 0, 0));
};