2023-03-24 16:28:36 +00:00
|
|
|
import crypto from 'node:crypto';
|
2022-04-21 16:13:59 +08:00
|
|
|
|
2022-10-21 13:14:17 +08:00
|
|
|
import type { LogtoOidcConfigType } from '@logto/schemas';
|
|
|
|
import { LogtoOidcConfigKey } from '@logto/schemas';
|
2023-01-09 17:34:13 +08:00
|
|
|
import { conditional } from '@silverhand/essentials';
|
2022-08-08 14:00:24 +08:00
|
|
|
import { createLocalJWKSet } from 'jose';
|
2022-04-21 16:13:59 +08:00
|
|
|
|
2022-11-21 16:38:24 +08:00
|
|
|
import { exportJWK } from '#src/utils/jwks.js';
|
2022-08-08 14:00:24 +08:00
|
|
|
|
2022-10-09 17:22:34 +08:00
|
|
|
const loadOidcValues = async (issuer: string, configs: LogtoOidcConfigType) => {
|
2023-10-08 12:51:04 -05:00
|
|
|
const cookieKeys = configs[LogtoOidcConfigKey.CookieKeys].map(({ value }) => value);
|
|
|
|
const privateKeys = configs[LogtoOidcConfigKey.PrivateKeys].map(({ value }) =>
|
|
|
|
crypto.createPrivateKey(value)
|
2022-08-08 14:00:24 +08:00
|
|
|
);
|
|
|
|
const publicKeys = privateKeys.map((key) => crypto.createPublicKey(key));
|
|
|
|
const privateJwks = await Promise.all(privateKeys.map(async (key) => exportJWK(key)));
|
|
|
|
const publicJwks = await Promise.all(publicKeys.map(async (key) => exportJWK(key)));
|
|
|
|
const localJWKSet = createLocalJWKSet({ keys: publicJwks });
|
2022-04-21 16:13:59 +08:00
|
|
|
|
2023-01-09 17:34:13 +08:00
|
|
|
// Use ES384 if it's an Elliptic Curve key, otherwise fall back to default
|
|
|
|
// It's for backwards compatibility since we were using RSA keys before v1.0.0-beta.20
|
|
|
|
const jwkSigningAlg = conditional(privateJwks[0]?.kty === 'EC' && 'ES384');
|
|
|
|
|
2022-04-21 16:13:59 +08:00
|
|
|
return Object.freeze({
|
2022-05-20 00:08:33 +08:00
|
|
|
cookieKeys,
|
2022-08-08 14:00:24 +08:00
|
|
|
privateJwks,
|
2023-02-10 19:57:25 +08:00
|
|
|
publicJwks,
|
2023-01-09 17:34:13 +08:00
|
|
|
jwkSigningAlg,
|
2022-08-08 14:00:24 +08:00
|
|
|
localJWKSet,
|
2022-07-05 18:01:49 +08:00
|
|
|
issuer,
|
2022-04-21 16:13:59 +08:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
export default loadOidcValues;
|