Untitled

 avatar
unknown
plain_text
a year ago
1.9 kB
5
Indexable
import { pipe } from "fp-ts/lib/function";
import * as E from "fp-ts/Either";
import * as TE from "fp-ts/TaskEither";
import { generatePKCEError } from "./GeneratePKCEError";
import { SecretsManager } from "@aws-sdk/client-secrets-manager";
import { URL } from "url";
import {
  MissingEnvironmentVariableError,
  readString,
  readUrl,
} from "@lambdas/shared/configuration";
import { UrlStringParserError } from "@lambdas/shared/configuration/parseUrlString";
const MyInfoConnector = require("myinfo-connector-v4-nodejs");

export type PKCEConfig = {
  clientID: string;
  scope: string;
  redirectUrl: URL;
  authorizeJKWSUrl: URL;
  myInfoJWKSUrl: URL;
  tokenUrl: URL;
  personUrl: URL;
};

type GeneratePKCE = {
  codeChallenge: string;
  codeVerifier: string;
  sessionId: string;
};

export const readPKCEConfig = (): TE.TaskEither<
  MissingEnvironmentVariableError | UrlStringParserError,
  PKCEConfig
> =>
  pipe(
    E.Do,
    E.apSW("clientID", readString("CLIENT_ID")),
    E.apSW("scope", readString("SCOPE")),
    E.apSW("redirectUrl", readUrl("REDIRECT_URL")),
    E.apSW("authorizeJKWSUrl", readUrl("AUTHORIZE_JWKS_URL")),
    E.apSW("myInfoJWKSUrl", readUrl("MYINFO_JWKS_URL")),
    E.apSW("tokenUrl", readUrl("TOKEN_URL")),
    E.apSW("personUrl", readUrl("PERSON_URL")),
    TE.fromEither,
    TE.map((config) => config)
  );

export const generatePKCE = (): TE.TaskEither<
  MissingEnvironmentVariableError | UrlStringParserError,
  GeneratePKCE
> =>
  pipe(
    readPKCEConfig(),
    TE.tryCatch(
      (pKCEConfig) => {
        const connector = new MyInfoConnector(pKCEConfig);
        return connector.generatePKCECodePair();
      },
      (err) => generatePKCEError(E.toError(JSON.stringify(err)))
    ),
    TE.map((pkce) => ({
      codeChallenge: pkce.codeChallenge,
      codeVerifier: pkce.codeVerifier,
      // sessionId: string;
    }))
  );
Editor is loading...
Leave a Comment