{"version":3,"sources":["authn.ts","components/authn.tsx","App.tsx","serviceWorker.ts","config.tsx","index.tsx","startup/authn.ts"],"names":["keyOf","network","scope","concat","logout","options","hello","getToken","login","force","then","undefined","_","a","authResponse","access_token","getAuthResponse","useIdentity","response","_useState","useState","_useState2","Object","slicedToArray","setResponse","useEffect","tryUpdateSession","auth","unchanged","on","off","useCachedResponse","jwt_decode","id_token","App","initial","react","className","style","margin","onClick","href","src","alt","Boolean","window","location","hostname","match","ClientConfigContext","React","createContext","clientId","redirectUri","tenantId","config","process","REACT_APP_REDIRECTURI","origin","tenant","policyId","providers","b2c","name","policy","oauth","version","grant","response_type","scope_delim","form","req","qs","nonce","String","Date","now","pathname","initAzureADB2C","graph","portal","providerScopeMap","init","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","next","done","_ref5","value","_ref4","provider","workaround","services","err","return","applyMultiscopeWorkaround","helloJsInit","scopeMap","providerConfig","toReturn","objectSpread","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","_ref8","_ref7","mapMultiscopeWorkaroundInit","redirect_uri","configureAccessManagement","ReactDOM","render","react_default","createElement","_ref","children","Provider","react_router_dom","src_App","document","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.6f8489a3.chunk.js","sourcesContent":["import hello from \"hellojs\"\r\nimport axios, { AxiosRequestConfig } from \"axios\"\r\nimport { ServiceClientCredentials, HttpHeaders } from \"@azure/ms-rest-js\"\r\n\r\nconst keyOf = (network: string, scope?: string) => scope ? `${network}_${scope}` : network\r\n\r\nexport const login = (network?: string | undefined, options?: hello.HelloJSLoginOptions | undefined): PromiseLike => {\r\n return hello.login(network, options)\r\n}\r\n\r\nexport const logout = (network?: string | undefined, options?: hello.HelloJSLogoutOptions | undefined): PromiseLike => {\r\n return hello.logout(network, options)\r\n}\r\n\r\nexport const getToken = (scope?: string | undefined, network?: string | undefined): PromiseLike => {\r\n return (\r\n hello.login(keyOf(network || \"b2c\", scope), { force: false, scope })\r\n .then(undefined, _ => hello.login())\r\n .then(a => a.authResponse ? a.authResponse.access_token : undefined)\r\n )\r\n}\r\n\r\nexport const getAuthResponse = (scope?: string | undefined, network?: string | undefined): Required | undefined => {\r\n let authResponse = hello.getAuthResponse(keyOf(network || \"b2c\", scope))\r\n return authResponse ? authResponse as Required : undefined\r\n}\r\n\r\nexport function mkAxiosInstance(options: { scope?: string, network?: string, config?: AxiosRequestConfig } = {}) {\r\n const instance = axios.create(options.config)\r\n instance.interceptors.request.use(async config => {\r\n const token = await getToken(options.scope, options.network)\r\n if (token == undefined) {\r\n throw new Error(\"could not get token\")\r\n }\r\n if (!config.headers) { config.headers = {} }\r\n config.headers[\"Authorization\"] = `Bearer ${token}`\r\n return config\r\n })\r\n return instance\r\n}\r\n\r\nexport function mkMSRestCreds(options: { scope?: string, network?: string }): ServiceClientCredentials {\r\n const creds: ServiceClientCredentials = {\r\n signRequest: async (webResource) => {\r\n const token = await getToken(options.scope, options.network)\r\n if (!webResource.headers) { webResource.headers = new HttpHeaders() }\r\n webResource.headers.set(\"Authorization\", `Bearer ${token}`)\r\n return webResource\r\n }\r\n }\r\n return creds\r\n}\r\n\r\nexport interface AzureClientConstructor {\r\n new(credentials: ServiceClientCredentials, resourceId: string, options?: U): T\r\n}\r\n\r\nexport interface AzureClientOptions {\r\n scope?: string\r\n network?: string\r\n ctorArgs?: U\r\n}\r\n\r\nexport function mkAzureClient(TCtor: AzureClientConstructor, resourceId: string, options: AzureClientOptions = {}) {\r\n const creds = mkMSRestCreds(options)\r\n return new TCtor(creds, resourceId, options.ctorArgs)\r\n}\r\n\r\nexport default {\r\n login,\r\n logout,\r\n getToken,\r\n getAuthResponse,\r\n mkMSRestCreds,\r\n mkAzureClient,\r\n mkAxiosInstance\r\n}\r\n\r\n","import React, { useState, useEffect } from \"react\"\r\nimport hello from \"hellojs\"\r\nimport jwt_decode from \"jwt-decode\"\r\nimport { getAuthResponse } from \"../authn\";\r\n\r\ntype AuthEvent = {\r\n network: string\r\n authResponse?: hello.HelloJSAuthResponse\r\n unchanged?: boolean\r\n}\r\n\r\n// function useHelloJsState(init: () => { [key: string]: Required | undefined }) {\r\n// const [sessions, setSessions] = useState(init)\r\n// const sessionsRef = useRef(sessions)\r\n// useEffect(() => {\r\n// function tryUpdateSession(auth: AuthEvent) {\r\n// if (!auth.unchanged) {\r\n// console.log(\"session update\")\r\n// setSessions({ ...sessionsRef.current, [auth.network]: auth.authResponse as Required })\r\n// }\r\n// }\r\n// hello.on(\"auth\", tryUpdateSession)\r\n// return () => {\r\n// hello.off(\"auth\", tryUpdateSession)\r\n// }\r\n// }, [sessionsRef])\r\n// return sessions\r\n// }\r\n\r\nexport function useCachedResponse(scope?: string, network?: string) {\r\n const [response, setResponse] = useState | undefined>(undefined)\r\n\r\n useEffect(() => {\r\n function tryUpdateSession(auth: AuthEvent) {\r\n if (!auth.unchanged) {\r\n setResponse(auth.authResponse as Required)\r\n }\r\n }\r\n\r\n hello.on(\"auth\", tryUpdateSession)\r\n setResponse(getAuthResponse(scope, network))\r\n return () => {\r\n hello.off(\"auth\", tryUpdateSession)\r\n }\r\n }, [scope, network])\r\n\r\n return response\r\n}\r\n\r\nexport function useIdentity(scope?: string, network?: string) {\r\n const response = useCachedResponse(scope, network)\r\n return response ? jwt_decode(response.id_token) : undefined\r\n}\r\n\r\n// export function useAuthenticatedClient(scope?: string, network?: string) {\r\n// return React.useMemo(() => {\r\n// const instance = axios.create()\r\n// instance.interceptors.request.use(async config => {\r\n// const token = await getToken(scope, network)\r\n// if (token == undefined) {\r\n// throw new Error(\"could not get token\")\r\n// }\r\n// if (!config.headers) { config.headers = {} }\r\n// config.headers[\"Authorization\"] = `Bearer ${token}`\r\n// return config\r\n// })\r\n// return instance\r\n// }, [scope, network])\r\n// }\r\n","import * as React from \"react\"\r\nimport \"./App.css\"\r\nimport { BrowserRouter as Router, Route, Link, Redirect, Switch } from \"react-router-dom\"\r\nimport { useIdentity } from \"./components/authn\";\r\nimport { Jsonify } from \"./components/formatting\";\r\n\r\nimport { login, logout, getToken } from \"./authn\";\r\n\r\n\r\n\r\nexport function Home() {\r\n const identity = useIdentity(\"portal\")\r\n return (\r\n
\r\n

Home

\r\n
Your id_token data:
\r\n
\r\n )\r\n}\r\n\r\nfunction Menu() {\r\n return (\r\n
    \r\n
  • Home
  • \r\n
\r\n )\r\n}\r\n\r\nfunction App() {\r\n const initial = useIdentity<{ [claim: string]: string }>(\"portal\")\r\n return (\r\n <>\r\n {initial ? (\r\n <>\r\n
\r\n
\r\n
\r\n

Welcome

\r\n

Reset Your Password Below

\r\n
\r\n
\r\n \r\n
\"\"
\r\n
\r\n
\r\n
\r\n \r\n ) : (\r\n <>\r\n
\r\n
\r\n
\r\n

Welcome

\r\n

Reset Your Password Below

\r\n
\r\n
\r\n \r\n
\"\"
\r\n
\r\n
\r\n
\r\n \r\n\r\n\r\n )}\r\n \r\n )\r\n}\r\n\r\nexport default App\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read http://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\ntype Config = {\r\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n};\r\n\r\nexport function register(config?: Config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(\r\n (process as { env: { [key: string]: string } }).env.PUBLIC_URL,\r\n window.location.href\r\n );\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit http://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See http://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import React, { useContext } from \"react\"\r\n\r\nexport interface ClientConfigValue {\r\n clientId: string\r\n redirectUri?: string\r\n tenantId: string\r\n}\r\n\r\nconst ClientConfigContext = React.createContext({\r\n clientId: \"string\",\r\n redirectUri: \"string\",\r\n tenantId: \"string\",\r\n})\r\n\r\nexport function useClientConfig() {\r\n return useContext(ClientConfigContext)\r\n}\r\n\r\nexport function ClientConfig({ config, children }: { config: ClientConfigValue, children?: React.ReactNode }) {\r\n return {children}\r\n}\r\n","import React from \"react\"\r\nimport ReactDOM from \"react-dom\"\r\nimport \"./index.css\"\r\nimport App from \"./App\"\r\nimport * as serviceWorker from \"./serviceWorker\"\r\nimport { configureAccessManagement } from \"./startup/authn\"\r\nimport { BrowserRouter as Router } from \"react-router-dom\"\r\nimport { ClientConfig } from \"./config\"\r\n\r\nconst config = {\r\n clientId: process.env.REACT_APP_CLIENTID!,\r\n redirectUri: process.env.REACT_APP_REDIRECTURI || window.location.origin,\r\n tenant: process.env.REACT_APP_TENANT!,\r\n tenantId: process.env.REACT_APP_TENANTID!,\r\n policyId: process.env.REACT_APP_POLICYID!,\r\n}\r\n\r\nconfigureAccessManagement(config.tenant, config.policyId, config.clientId, config.redirectUri)\r\n\r\nReactDOM.render(, document.getElementById(\"root\"))\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: http://bit.ly/CRA-PWA\r\nserviceWorker.unregister()\r\n","import hello from \"hellojs\"\r\n\r\ntype Provider = \"b2c\"\r\n\r\n/** Configures all the idp and scopes available to Authentication components */\r\nexport function configureAccessManagement(tenant: string, policyId: string, clientId: string, redirectUri: string) {\r\n\r\n const b2c = initAzureADB2C(\"Imagined.Cloud B2C\", tenant, policyId, {\r\n \"graph\": \"https://graph.windows.net/.default\",\r\n \"portal\": clientId\r\n })\r\n\r\n const providers = { b2c }\r\n\r\n const providerScopeMap: [Provider, string][] = [\r\n [\"b2c\", \"graph\"],\r\n [\"b2c\", \"portal\"],\r\n ]\r\n\r\n hello.init(providers)\r\n\r\n //https://github.com/MrSwitch/hello.js/issues/348#issuecomment-154735343\r\n applyMultiscopeWorkaround(providerScopeMap)\r\n const helloJsInit = mapMultiscopeWorkaroundInit(providerScopeMap, {\r\n \"b2c\": clientId\r\n })\r\n\r\n hello.init(helloJsInit, { redirect_uri: redirectUri, scope: \"openid\" })\r\n\r\n return () => Object.entries(helloJsInit).reduce((acc, [name, _]) => ({ ...acc, [name]: hello.getAuthResponse(name) }), {})\r\n}\r\n\r\nfunction initAzureADB2C(name: string, tenant: string, policy: string, scope?: { [scope: string]: string }): hello.HelloJSServiceDef {\r\n return {\r\n name,\r\n oauth: {\r\n version: 2,\r\n auth: `https://login.microsoftonline.com/tfp/${tenant}/${policy}/oauth2/v2.0/authorize`,\r\n grant: `https://login.microsoftonline.com/tfp/${tenant}/${policy}/oauth2/v2.0/token`,\r\n response_type: \"id_token token\"\r\n },\r\n scope_delim: ' ',\r\n scope,\r\n form: false,\r\n login: req => {\r\n req.qs.nonce = req.qs.nonce || String(Date.now())\r\n },\r\n logout: function () {\r\n window.location.href = `https://login.microsoftonline.com/tfp/${tenant}/${policy}/oauth2/v2.0/logout?post_logout_redirect_uri=${window.location.origin + window.location.pathname}`\r\n return true\r\n }\r\n }\r\n}\r\n\r\nfunction applyMultiscopeWorkaround(config: [Provider, string][]) {\r\n for (const [provider, scope] of config) {\r\n let workaround = hello as any\r\n workaround.services[`${provider}_${scope}`] = workaround.services[provider]\r\n }\r\n}\r\n\r\nfunction mapMultiscopeWorkaroundInit(scopeMap: [Provider, string][], providerConfig: { [provider in Provider]: string }) {\r\n let toReturn: { [k: string]: string } = { ...providerConfig }\r\n\r\n for (const [provider, scope] of scopeMap) {\r\n toReturn[`${provider}_${scope}`] = providerConfig[provider]\r\n }\r\n\r\n return toReturn\r\n}\r\n"],"sourceRoot":""}