/** * Copyright 2020 Inrupt Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the * Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * @hidden * @packageDocumentation */ /** * Top Level core document. Responsible for setting up the dependency graph */ import "reflect-metadata"; import { container } from "tsyringe"; import ClientAuthentication from "./ClientAuthentication"; import IAuthenticatedFetcher from "./authenticatedFetch/IAuthenticatedFetcher"; import AggregateAuthenticatedFetcher from "./authenticatedFetch/AggregateAuthenticatedFetcher"; import DpopAuthenticatedFetcher from "./authenticatedFetch/dpop/DpopAuthenticatedFetcher"; import UnauthenticatedFetcher from "./authenticatedFetch/unauthenticated/UnauthenticatedFetcher"; import ILoginHandler from "./login/ILoginHandler"; import AggregateLoginHandler from "./login/AggregateLoginHandler"; import IStorage from "./storage/IStorage"; import IJoseUtility from "./jose/IJoseUtility"; import IsomorphicJoseUtility from "./jose/IsomorphicJoseUtility"; import OidcLoginHandler from "./login/oidc/OidcLoginHandler"; import IOidcHandler from "./login/oidc/IOidcHandler"; import AggregateOidcHandler from "./login/oidc/AggregateOidcHandler"; import AuthorizationCodeOidcHandler from "./login/oidc/oidcHandlers/AuthorizationCodeOidcHandler"; import AuthorizationCodeWithPkceOidcHandler from "./login/oidc/oidcHandlers/AuthorizationCodeWithPkceOidcHandler"; import ClientCredentialsOidcHandler from "./login/oidc/oidcHandlers/ClientCredentialsOidcHandler"; import PrimaryDeviceOidcHandler from "./login/oidc/oidcHandlers/PrimaryDeviceOidcHandler"; import SecondaryDeviceOidcHandler from "./login/oidc/oidcHandlers/SecondaryDeviceOidcHandler"; import LegacyImplicitFlowOidcHandler from "./login/oidc/oidcHandlers/LegacyImplicitFlowOidcHandler"; import RefreshTokenOidcHandler from "./login/oidc/oidcHandlers/RefreshTokenOidcHandler"; import Fetcher, { IFetcher } from "./util/Fetcher"; import IssuerConfigFetcher, { IIssuerConfigFetcher, } from "./login/oidc/IssuerConfigFetcher"; import BearerAuthenticatedFetcher from "./authenticatedFetch/bearer/BearerAuthenticatedFetcher"; import DpopHeaderCreator, { IDpopHeaderCreator, } from "./dpop/DpopHeaderCreator"; import DpopClientKeyManager, { IDpopClientKeyManager, } from "./dpop/DpopClientKeyManager"; import StorageUtility, { IStorageUtility } from "./storage/StorageUtility"; import UuidGenerator, { IUuidGenerator } from "./util/UuidGenerator"; import IRedirectHandler from "./login/oidc/redirectHandler/IRedirectHandler"; import GeneralRedirectHandler from "./login/oidc/redirectHandler/GeneralRedirectHandler"; import EnvironmentDetector, { IEnvironmentDetector, detectEnvironment, } from "./util/EnvironmentDetector"; import ILogoutHandler from "./logout/ILogoutHandler"; import GeneralLogoutHandler from "./logout/GeneralLogoutHandler"; import UrlRepresenationConverter, { IUrlRepresentationConverter, } from "./util/UrlRepresenationConverter"; import SessionInfoManager, { ISessionInfoManager, } from "./sessionInfo/SessionInfoManager"; import AuthCodeRedirectHandler from "./login/oidc/redirectHandler/AuthCodeRedirectHandler"; import AggregateRedirectHandler from "./login/oidc/redirectHandler/AggregateRedirectHandler"; import BrowserStorage from "./storage/BrowserStorage"; import TokenSaver, { ITokenSaver, } from "./login/oidc/redirectHandler/TokenSaver"; import Redirector, { IRedirector } from "./login/oidc/Redirector"; import InactionRedirectHandler from "./login/oidc/redirectHandler/InactionRedirectHandler"; import PopUpLoginHandler from "./login/popUp/PopUpLoginHandler"; import AggregatePostPopUpLoginHandler from "./login/popUp/AggregatePostPopUpLoginHandler"; import ClientRegistrar, { IClientRegistrar, } from "./login/oidc/ClientRegistrar"; import TokenRefresher, { ITokenRefresher, } from "./login/oidc/refresh/TokenRefresher"; import AutomaticRefreshFetcher from "./authenticatedFetch/AutomaticRefreshFetcher"; import TokenRequester, { ITokenRequester } from "./login/oidc/TokenRequester"; import InMemoryStorage from "./storage/InMemoryStorage"; // Util container.register("fetcher", { useClass: Fetcher, }); container.register("dpopHeaderCreator", { useClass: DpopHeaderCreator, }); container.register("dpopClientKeyManager", { useClass: DpopClientKeyManager, }); container.register("storageUtility", { useClass: StorageUtility, }); container.register("uuidGenerator", { useClass: UuidGenerator, }); container.register("joseUtility", { useClass: IsomorphicJoseUtility, }); container.register("environmentDetector", { useClass: EnvironmentDetector, }); container.register("urlRepresentationConverter", { useClass: UrlRepresenationConverter, }); // Session container.register("sessionInfoManager", { useClass: SessionInfoManager, }); // Authenticated Fetcher container.register("authenticatedFetcher", { useClass: AutomaticRefreshFetcher, }); container.register("aggregateAuthenticatedFetcher", { useClass: AggregateAuthenticatedFetcher, }); container.register("authenticatedFetchers", { useClass: DpopAuthenticatedFetcher, }); container.register("authenticatedFetchers", { useClass: BearerAuthenticatedFetcher, }); container.register("authenticatedFetchers", { useClass: UnauthenticatedFetcher, }); // Login container.register("loginHandler", { useClass: AggregateLoginHandler, }); container.register("loginHandlers", { useClass: PopUpLoginHandler, }); container.register("loginHandlers", { useClass: OidcLoginHandler, }); container.register("postPopUpLoginHandler", { useClass: AggregatePostPopUpLoginHandler, }); container.register("postPopUpLoginHandlers", { useClass: OidcLoginHandler, }); // Login/OIDC container.register("oidcHandler", { useClass: AggregateOidcHandler, }); container.register("oidcHandlers", { useClass: RefreshTokenOidcHandler, }); container.register("oidcHandlers", { useClass: AuthorizationCodeOidcHandler, }); container.register("oidcHandlers", { useClass: AuthorizationCodeWithPkceOidcHandler, }); container.register("oidcHandlers", { useClass: LegacyImplicitFlowOidcHandler, }); container.register("oidcHandlers", { useClass: ClientCredentialsOidcHandler, }); container.register("oidcHandlers", { useClass: PrimaryDeviceOidcHandler, }); container.register("oidcHandlers", { useClass: SecondaryDeviceOidcHandler, }); container.register("redirector", { useClass: Redirector, }); container.register("clientRegistrar", { useClass: ClientRegistrar, }); container.register("tokenRequester", { useClass: TokenRequester, }); // Login/OIDC/redirectHandler container.register("redirectHandler", { useClass: AggregateRedirectHandler, }); container.register("redirectHandlers", { useClass: AuthCodeRedirectHandler, }); container.register("redirectHandlers", { useClass: GeneralRedirectHandler, }); container.register("redirectHandlers", { useClass: InactionRedirectHandler, }); container.register("tokenSaver", { useClass: TokenSaver, }); // Login/OIDC/Issuer container.register("issuerConfigFetcher", { useClass: IssuerConfigFetcher, }); // Login/OIDC/Refresh container.register("tokenRefresher", { useClass: TokenRefresher, }); // Logout container.register("logoutHandler", { useClass: GeneralLogoutHandler, }); export function getClientAuthenticationWithDependencies(dependencies: { secureStorage?: IStorage; insecureStorage?: IStorage; }): ClientAuthentication { let secureStorage; let insecureStorage; switch (detectEnvironment()) { case "browser": case "react-native": // TODO: change this to be secure secureStorage = dependencies.secureStorage || new InMemoryStorage(); insecureStorage = dependencies.insecureStorage || new BrowserStorage(); break; case "server": secureStorage = dependencies.secureStorage || new InMemoryStorage(); insecureStorage = dependencies.insecureStorage || new InMemoryStorage(); break; } const authenticatorContainer = container.createChildContainer(); authenticatorContainer.register("secureStorage", { useValue: secureStorage, }); authenticatorContainer.register("insecureStorage", { useValue: insecureStorage, }); return authenticatorContainer.resolve(ClientAuthentication); }