@webiny/okta 0.0.0-unstable.61c048f412

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/LICENSE +36 -0
  2. package/Okta.d.ts +14 -0
  3. package/Okta.js +44 -0
  4. package/Okta.js.map +1 -0
  5. package/README.md +11 -0
  6. package/admin/Extension.d.ts +2 -0
  7. package/admin/Extension.js +16 -0
  8. package/admin/Extension.js.map +1 -0
  9. package/admin/Okta.d.ts +6 -0
  10. package/admin/Okta.js +19 -0
  11. package/admin/Okta.js.map +1 -0
  12. package/admin/OktaLoginScreen.d.ts +11 -0
  13. package/admin/OktaLoginScreen.js +38 -0
  14. package/admin/OktaLoginScreen.js.map +1 -0
  15. package/admin/components/LoginContent.d.ts +26 -0
  16. package/admin/components/LoginContent.js +36 -0
  17. package/admin/components/LoginContent.js.map +1 -0
  18. package/admin/components/View.d.ts +98 -0
  19. package/admin/components/View.js +70 -0
  20. package/admin/components/View.js.map +1 -0
  21. package/admin/components/okta-icon.svg +1 -0
  22. package/admin/features/Okta/OktaPresenter.d.ts +25 -0
  23. package/admin/features/Okta/OktaPresenter.js +119 -0
  24. package/admin/features/Okta/OktaPresenter.js.map +1 -0
  25. package/admin/features/Okta/abstractions.d.ts +22 -0
  26. package/admin/features/Okta/abstractions.js +4 -0
  27. package/admin/features/Okta/abstractions.js.map +1 -0
  28. package/admin/features/Okta/feature.d.ts +3 -0
  29. package/admin/features/Okta/feature.js +16 -0
  30. package/admin/features/Okta/feature.js.map +1 -0
  31. package/admin/features/Okta/index.d.ts +1 -0
  32. package/admin/features/Okta/index.js +3 -0
  33. package/admin/features/Okta/index.js.map +1 -0
  34. package/api/features/OktaIdp/OktaIIdentityProvider.d.ts +15 -0
  35. package/api/features/OktaIdp/OktaIIdentityProvider.js +38 -0
  36. package/api/features/OktaIdp/OktaIIdentityProvider.js.map +1 -0
  37. package/api/features/OktaIdp/abstractions.d.ts +15 -0
  38. package/api/features/OktaIdp/abstractions.js +4 -0
  39. package/api/features/OktaIdp/abstractions.js.map +1 -0
  40. package/api/features/OktaIdp/feature.d.ts +1 -0
  41. package/api/features/OktaIdp/feature.js +10 -0
  42. package/api/features/OktaIdp/feature.js.map +1 -0
  43. package/api/features/OktaIdp/index.d.ts +1 -0
  44. package/api/features/OktaIdp/index.js +3 -0
  45. package/api/features/OktaIdp/index.js.map +1 -0
  46. package/index.d.ts +2 -0
  47. package/index.js +4 -0
  48. package/index.js.map +1 -0
  49. package/package.json +42 -0
package/LICENSE ADDED
@@ -0,0 +1,36 @@
1
+ The Webiny Enterprise license (the “Enterprise License”)
2
+ Copyright (c) 2021 Webiny Ltd.
3
+
4
+ With regard to the Webiny Software:
5
+
6
+ This software and associated documentation files (the "Software") may only be
7
+ used in production, if you (and any entity that you represent) have agreed to,
8
+ and are in compliance with, the Webiny Subscription Terms of Service, available
9
+ at https://www.webiny.com/terms (the “Enterprise Terms”), or other
10
+ agreement governing the use of the Software, as agreed by you and Webiny,
11
+ and otherwise have a valid Webiny Enterprise license for the
12
+ correct number of user seats. Subject to the foregoing sentence, you are free to
13
+ modify this Software and publish patches to the Software. You agree that Webiny
14
+ and/or its licensors (as applicable) retain all right, title and interest in and
15
+ to all such modifications and/or patches, and all such modifications and/or
16
+ patches may only be used, copied, modified, displayed, distributed, or otherwise
17
+ exploited with a valid Webiny Enterprise license for the correct
18
+ number of user seats. Notwithstanding the foregoing, you may copy and modify
19
+ the Software for development and testing purposes, without requiring a
20
+ subscription. You agree that Webiny and/or its licensors (as applicable) retain
21
+ all right, title and interest in and to all such modifications. You are not
22
+ granted any other rights beyond what is expressly stated herein. Subject to the
23
+ foregoing, it is forbidden to copy, merge, publish, distribute, sublicense,
24
+ and/or sell the Software.
25
+
26
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
29
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
30
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
31
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32
+ SOFTWARE.
33
+
34
+ For all third party components incorporated into the Webiny Software, those
35
+ components are licensed under the original license provided by the owner of the
36
+ applicable component.
package/Okta.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { z } from "zod";
2
+ export declare const Okta: import("@webiny/project/defineExtension/defineExtension").ExtensionComponent<z.ZodObject<{
3
+ issuer: z.ZodString;
4
+ clientId: z.ZodString;
5
+ apiConfig: z.ZodString;
6
+ }, "strip", z.ZodTypeAny, {
7
+ issuer: string;
8
+ clientId: string;
9
+ apiConfig: string;
10
+ }, {
11
+ issuer: string;
12
+ clientId: string;
13
+ apiConfig: string;
14
+ }>>;
package/Okta.js ADDED
@@ -0,0 +1,44 @@
1
+ import React from "react";
2
+ import { defineExtension } from "@webiny/project/defineExtension/index.js";
3
+ import { EnvVar } from "@webiny/project/extensions/index.js";
4
+ import { Api, Admin } from "@webiny/project-aws";
5
+ import { z } from "zod";
6
+ export const Okta = defineExtension({
7
+ type: "Project/Okta",
8
+ tags: {
9
+ runtimeContext: "project"
10
+ },
11
+ description: "Enable and configure Okta authentication.",
12
+ paramsSchema: z.object({
13
+ issuer: z.string().describe("Okta issuer URL."),
14
+ clientId: z.string().describe("Okta client ID."),
15
+ apiConfig: z.string().describe("Path to API configuration.")
16
+ }),
17
+ render: props => {
18
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(EnvVar, {
19
+ varName: "OKTA_ISSUER",
20
+ value: props.issuer
21
+ }), /*#__PURE__*/React.createElement(EnvVar, {
22
+ varName: "OKTA_CLIENT_ID",
23
+ value: props.clientId
24
+ }), /*#__PURE__*/React.createElement(EnvVar, {
25
+ varName: "REACT_APP_IDP_TYPE",
26
+ value: "okta"
27
+ }), /*#__PURE__*/React.createElement(EnvVar, {
28
+ varName: "REACT_APP_OKTA_ISSUER",
29
+ value: props.issuer
30
+ }), /*#__PURE__*/React.createElement(EnvVar, {
31
+ varName: "REACT_APP_OKTA_CLIENT_ID",
32
+ value: props.clientId
33
+ }), /*#__PURE__*/React.createElement(Api.Extension, {
34
+ src: import.meta.dirname + "/api/features/OktaIdp/feature.js",
35
+ exportName: "OktaIdpFeature"
36
+ }), /*#__PURE__*/React.createElement(Api.Extension, {
37
+ src: props.apiConfig
38
+ }), /*#__PURE__*/React.createElement(Admin.Extension, {
39
+ src: import.meta.dirname + "/admin/Extension.js"
40
+ }));
41
+ }
42
+ });
43
+
44
+ //# sourceMappingURL=Okta.js.map
package/Okta.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","defineExtension","EnvVar","Api","Admin","z","Okta","type","tags","runtimeContext","description","paramsSchema","object","issuer","string","describe","clientId","apiConfig","render","props","createElement","Fragment","varName","value","Extension","src","import","meta","dirname","exportName"],"sources":["Okta.tsx"],"sourcesContent":["import React from \"react\";\nimport { defineExtension } from \"@webiny/project/defineExtension/index.js\";\nimport { EnvVar } from \"@webiny/project/extensions/index.js\";\nimport { Api, Admin } from \"@webiny/project-aws\";\nimport { z } from \"zod\";\n\nexport const Okta = defineExtension({\n type: \"Project/Okta\",\n tags: { runtimeContext: \"project\" },\n description: \"Enable and configure Okta authentication.\",\n paramsSchema: z.object({\n issuer: z.string().describe(\"Okta issuer URL.\"),\n clientId: z.string().describe(\"Okta client ID.\"),\n apiConfig: z.string().describe(\"Path to API configuration.\")\n }),\n render: props => {\n return (\n <>\n {/* Lambda vars */}\n <EnvVar varName={\"OKTA_ISSUER\"} value={props.issuer} />\n <EnvVar varName={\"OKTA_CLIENT_ID\"} value={props.clientId} />\n {/* Admin app vars */}\n <EnvVar varName={\"REACT_APP_IDP_TYPE\"} value={\"okta\"} />\n <EnvVar varName={\"REACT_APP_OKTA_ISSUER\"} value={props.issuer} />\n <EnvVar varName={\"REACT_APP_OKTA_CLIENT_ID\"} value={props.clientId} />\n {/* Api extensions */}\n <Api.Extension\n src={import.meta.dirname + \"/api/features/OktaIdp/feature.js\"}\n exportName={\"OktaIdpFeature\"}\n />\n <Api.Extension src={props.apiConfig} />\n {/* Admin extensions */}\n <Admin.Extension src={import.meta.dirname + \"/admin/Extension.js\"} />\n </>\n );\n }\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,eAAe,QAAQ,0CAA0C;AAC1E,SAASC,MAAM,QAAQ,qCAAqC;AAC5D,SAASC,GAAG,EAAEC,KAAK,QAAQ,qBAAqB;AAChD,SAASC,CAAC,QAAQ,KAAK;AAEvB,OAAO,MAAMC,IAAI,GAAGL,eAAe,CAAC;EAChCM,IAAI,EAAE,cAAc;EACpBC,IAAI,EAAE;IAAEC,cAAc,EAAE;EAAU,CAAC;EACnCC,WAAW,EAAE,2CAA2C;EACxDC,YAAY,EAAEN,CAAC,CAACO,MAAM,CAAC;IACnBC,MAAM,EAAER,CAAC,CAACS,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,kBAAkB,CAAC;IAC/CC,QAAQ,EAAEX,CAAC,CAACS,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,iBAAiB,CAAC;IAChDE,SAAS,EAAEZ,CAAC,CAACS,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,4BAA4B;EAC/D,CAAC,CAAC;EACFG,MAAM,EAAEC,KAAK,IAAI;IACb,oBACInB,KAAA,CAAAoB,aAAA,CAAApB,KAAA,CAAAqB,QAAA,qBAEIrB,KAAA,CAAAoB,aAAA,CAAClB,MAAM;MAACoB,OAAO,EAAE,aAAc;MAACC,KAAK,EAAEJ,KAAK,CAACN;IAAO,CAAE,CAAC,eACvDb,KAAA,CAAAoB,aAAA,CAAClB,MAAM;MAACoB,OAAO,EAAE,gBAAiB;MAACC,KAAK,EAAEJ,KAAK,CAACH;IAAS,CAAE,CAAC,eAE5DhB,KAAA,CAAAoB,aAAA,CAAClB,MAAM;MAACoB,OAAO,EAAE,oBAAqB;MAACC,KAAK,EAAE;IAAO,CAAE,CAAC,eACxDvB,KAAA,CAAAoB,aAAA,CAAClB,MAAM;MAACoB,OAAO,EAAE,uBAAwB;MAACC,KAAK,EAAEJ,KAAK,CAACN;IAAO,CAAE,CAAC,eACjEb,KAAA,CAAAoB,aAAA,CAAClB,MAAM;MAACoB,OAAO,EAAE,0BAA2B;MAACC,KAAK,EAAEJ,KAAK,CAACH;IAAS,CAAE,CAAC,eAEtEhB,KAAA,CAAAoB,aAAA,CAACjB,GAAG,CAACqB,SAAS;MACVC,GAAG,EAAEC,MAAM,CAACC,IAAI,CAACC,OAAO,GAAG,kCAAmC;MAC9DC,UAAU,EAAE;IAAiB,CAChC,CAAC,eACF7B,KAAA,CAAAoB,aAAA,CAACjB,GAAG,CAACqB,SAAS;MAACC,GAAG,EAAEN,KAAK,CAACF;IAAU,CAAE,CAAC,eAEvCjB,KAAA,CAAAoB,aAAA,CAAChB,KAAK,CAACoB,SAAS;MAACC,GAAG,EAAEC,MAAM,CAACC,IAAI,CAACC,OAAO,GAAG;IAAsB,CAAE,CACtE,CAAC;EAEX;AACJ,CAAC,CAAC","ignoreList":[]}
package/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # @webiny/okta
2
+
3
+ > [!NOTE]
4
+ > This package is part of the [Webiny](https://www.webiny.com) monorepo.
5
+ > It’s **included in every Webiny project by default** and is not meant to be used as a standalone package.
6
+
7
+ 📘 **Documentation:** [https://www.webiny.com/docs](https://www.webiny.com/docs)
8
+
9
+ ---
10
+
11
+ _This README file is automatically generated during the publish process._
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const Extension: () => React.JSX.Element;
@@ -0,0 +1,16 @@
1
+ import React from "react";
2
+ import { RegisterFeature } from "@webiny/app-admin/components/RegisterFeature.js";
3
+ import { Okta } from "./Okta.js";
4
+ import { OktaFeature } from "./features/Okta/feature.js";
5
+ export const Extension = () => {
6
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(RegisterFeature, {
7
+ feature: OktaFeature
8
+ }), /*#__PURE__*/React.createElement(Okta, {
9
+ okta: {
10
+ issuer: String(process.env.REACT_APP_OKTA_ISSUER),
11
+ clientId: String(process.env.REACT_APP_OKTA_CLIENT_ID)
12
+ }
13
+ }));
14
+ };
15
+
16
+ //# sourceMappingURL=Extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","RegisterFeature","Okta","OktaFeature","Extension","createElement","Fragment","feature","okta","issuer","String","process","env","REACT_APP_OKTA_ISSUER","clientId","REACT_APP_OKTA_CLIENT_ID"],"sources":["Extension.tsx"],"sourcesContent":["import React from \"react\";\nimport { RegisterFeature } from \"@webiny/app-admin/components/RegisterFeature.js\";\nimport { Okta } from \"./Okta.js\";\nimport { OktaFeature } from \"./features/Okta/feature.js\";\n\nexport const Extension = () => {\n return (\n <>\n <RegisterFeature feature={OktaFeature} />\n <Okta\n okta={{\n issuer: String(process.env.REACT_APP_OKTA_ISSUER),\n clientId: String(process.env.REACT_APP_OKTA_CLIENT_ID)\n }}\n />\n </>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,eAAe,QAAQ,iDAAiD;AACjF,SAASC,IAAI;AACb,SAASC,WAAW;AAEpB,OAAO,MAAMC,SAAS,GAAGA,CAAA,KAAM;EAC3B,oBACIJ,KAAA,CAAAK,aAAA,CAAAL,KAAA,CAAAM,QAAA,qBACIN,KAAA,CAAAK,aAAA,CAACJ,eAAe;IAACM,OAAO,EAAEJ;EAAY,CAAE,CAAC,eACzCH,KAAA,CAAAK,aAAA,CAACH,IAAI;IACDM,IAAI,EAAE;MACFC,MAAM,EAAEC,MAAM,CAACC,OAAO,CAACC,GAAG,CAACC,qBAAqB,CAAC;MACjDC,QAAQ,EAAEJ,MAAM,CAACC,OAAO,CAACC,GAAG,CAACG,wBAAwB;IACzD;EAAE,CACL,CACH,CAAC;AAEX,CAAC","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ import type { CreateAuthenticationConfig } from "./OktaLoginScreen.js";
3
+ export type OktaProps = Pick<CreateAuthenticationConfig, "okta"> & {
4
+ children?: React.ReactNode;
5
+ };
6
+ export declare const Okta: (props: OktaProps) => React.JSX.Element;
package/admin/Okta.js ADDED
@@ -0,0 +1,19 @@
1
+ import React from "react";
2
+ import { Fragment } from "react";
3
+ import { LoginScreenRenderer } from "@webiny/app-admin";
4
+ import { OktaLoginScreen } from "./OktaLoginScreen.js";
5
+ const createLoginScreenPlugin = params => {
6
+ return LoginScreenRenderer.createDecorator(() => {
7
+ return function Okta({
8
+ children
9
+ }) {
10
+ return /*#__PURE__*/React.createElement(OktaLoginScreen, params, children);
11
+ };
12
+ });
13
+ };
14
+ export const Okta = props => {
15
+ const LoginScreenPlugin = createLoginScreenPlugin(props);
16
+ return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(LoginScreenPlugin, null));
17
+ };
18
+
19
+ //# sourceMappingURL=Okta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","Fragment","LoginScreenRenderer","OktaLoginScreen","createLoginScreenPlugin","params","createDecorator","Okta","children","createElement","props","LoginScreenPlugin"],"sources":["Okta.tsx"],"sourcesContent":["import React from \"react\";\nimport { Fragment } from \"react\";\nimport { LoginScreenRenderer } from \"@webiny/app-admin\";\nimport { OktaLoginScreen } from \"./OktaLoginScreen.js\";\nimport type { CreateAuthenticationConfig } from \"./OktaLoginScreen.js\";\n\nconst createLoginScreenPlugin = (params: OktaProps) => {\n return LoginScreenRenderer.createDecorator(() => {\n return function Okta({ children }) {\n return <OktaLoginScreen {...params}>{children}</OktaLoginScreen>;\n };\n });\n};\n\nexport type OktaProps = Pick<CreateAuthenticationConfig, \"okta\"> & {\n children?: React.ReactNode;\n};\n\nexport const Okta = (props: OktaProps) => {\n const LoginScreenPlugin = createLoginScreenPlugin(props);\n return (\n <Fragment>\n <LoginScreenPlugin />\n </Fragment>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,QAAQ,QAAQ,OAAO;AAChC,SAASC,mBAAmB,QAAQ,mBAAmB;AACvD,SAASC,eAAe;AAGxB,MAAMC,uBAAuB,GAAIC,MAAiB,IAAK;EACnD,OAAOH,mBAAmB,CAACI,eAAe,CAAC,MAAM;IAC7C,OAAO,SAASC,IAAIA,CAAC;MAAEC;IAAS,CAAC,EAAE;MAC/B,oBAAOR,KAAA,CAAAS,aAAA,CAACN,eAAe,EAAKE,MAAM,EAAGG,QAA0B,CAAC;IACpE,CAAC;EACL,CAAC,CAAC;AACN,CAAC;AAMD,OAAO,MAAMD,IAAI,GAAIG,KAAgB,IAAK;EACtC,MAAMC,iBAAiB,GAAGP,uBAAuB,CAACM,KAAK,CAAC;EACxD,oBACIV,KAAA,CAAAS,aAAA,CAACR,QAAQ,qBACLD,KAAA,CAAAS,aAAA,CAACE,iBAAiB,MAAE,CACd,CAAC;AAEnB,CAAC","ignoreList":[]}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ export interface CreateAuthenticationConfig {
3
+ okta: {
4
+ issuer: string;
5
+ clientId: string;
6
+ };
7
+ children: React.ReactNode;
8
+ }
9
+ export declare const OktaLoginScreen: (({ okta, children }: CreateAuthenticationConfig) => React.JSX.Element) & {
10
+ displayName: string;
11
+ };
@@ -0,0 +1,38 @@
1
+ import React from "react";
2
+ import { useEffect } from "react";
3
+ import { useMemo } from "react";
4
+ import { observer } from "mobx-react-lite";
5
+ import { useFeature } from "@webiny/app";
6
+ import { OktaFeature } from "./features/Okta/feature.js";
7
+ import { LoginContent } from "./components/LoginContent.js";
8
+ export const OktaLoginScreen = observer(({
9
+ okta,
10
+ children
11
+ }) => {
12
+ const {
13
+ presenter
14
+ } = useFeature(OktaFeature);
15
+ const autoLogin = useMemo(() => {
16
+ const query = new URLSearchParams(window.location.search);
17
+ return query.get("action") !== "logout";
18
+ }, []);
19
+ useEffect(() => {
20
+ presenter.init({
21
+ issuer: okta.issuer,
22
+ clientId: okta.clientId,
23
+ autoLogin
24
+ });
25
+ }, []);
26
+ const vm = presenter.vm;
27
+ if (vm.isAuthenticated) {
28
+ return /*#__PURE__*/React.createElement(React.Fragment, null, children);
29
+ }
30
+ return /*#__PURE__*/React.createElement(LoginContent, {
31
+ onLogin: () => presenter.authenticate(),
32
+ checkingSession: vm.checkingSession,
33
+ isLoggingIn: vm.isLoggingIn,
34
+ isAuthenticated: vm.isAuthenticated
35
+ });
36
+ });
37
+
38
+ //# sourceMappingURL=OktaLoginScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useEffect","useMemo","observer","useFeature","OktaFeature","LoginContent","OktaLoginScreen","okta","children","presenter","autoLogin","query","URLSearchParams","window","location","search","get","init","issuer","clientId","vm","isAuthenticated","createElement","Fragment","onLogin","authenticate","checkingSession","isLoggingIn"],"sources":["OktaLoginScreen.tsx"],"sourcesContent":["import React from \"react\";\nimport { useEffect } from \"react\";\nimport { useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { useFeature } from \"@webiny/app\";\nimport { OktaFeature } from \"~/admin/features/Okta/feature.js\";\nimport { LoginContent } from \"./components/LoginContent.js\";\n\nexport interface CreateAuthenticationConfig {\n okta: { issuer: string; clientId: string };\n children: React.ReactNode;\n}\n\nexport const OktaLoginScreen = observer(({ okta, children }: CreateAuthenticationConfig) => {\n const { presenter } = useFeature(OktaFeature);\n\n const autoLogin = useMemo(() => {\n const query = new URLSearchParams(window.location.search);\n return query.get(\"action\") !== \"logout\";\n }, []);\n\n useEffect(() => {\n presenter.init({\n issuer: okta.issuer,\n clientId: okta.clientId,\n autoLogin\n });\n }, []);\n\n const vm = presenter.vm;\n\n if (vm.isAuthenticated) {\n return <>{children}</>;\n }\n\n return (\n <LoginContent\n onLogin={() => presenter.authenticate()}\n checkingSession={vm.checkingSession}\n isLoggingIn={vm.isLoggingIn}\n isAuthenticated={vm.isAuthenticated}\n />\n );\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,SAAS,QAAQ,OAAO;AACjC,SAASC,OAAO,QAAQ,OAAO;AAC/B,SAASC,QAAQ,QAAQ,iBAAiB;AAC1C,SAASC,UAAU,QAAQ,aAAa;AACxC,SAASC,WAAW;AACpB,SAASC,YAAY;AAOrB,OAAO,MAAMC,eAAe,GAAGJ,QAAQ,CAAC,CAAC;EAAEK,IAAI;EAAEC;AAAqC,CAAC,KAAK;EACxF,MAAM;IAAEC;EAAU,CAAC,GAAGN,UAAU,CAACC,WAAW,CAAC;EAE7C,MAAMM,SAAS,GAAGT,OAAO,CAAC,MAAM;IAC5B,MAAMU,KAAK,GAAG,IAAIC,eAAe,CAACC,MAAM,CAACC,QAAQ,CAACC,MAAM,CAAC;IACzD,OAAOJ,KAAK,CAACK,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ;EAC3C,CAAC,EAAE,EAAE,CAAC;EAENhB,SAAS,CAAC,MAAM;IACZS,SAAS,CAACQ,IAAI,CAAC;MACXC,MAAM,EAAEX,IAAI,CAACW,MAAM;MACnBC,QAAQ,EAAEZ,IAAI,CAACY,QAAQ;MACvBT;IACJ,CAAC,CAAC;EACN,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMU,EAAE,GAAGX,SAAS,CAACW,EAAE;EAEvB,IAAIA,EAAE,CAACC,eAAe,EAAE;IACpB,oBAAOtB,KAAA,CAAAuB,aAAA,CAAAvB,KAAA,CAAAwB,QAAA,QAAGf,QAAW,CAAC;EAC1B;EAEA,oBACIT,KAAA,CAAAuB,aAAA,CAACjB,YAAY;IACTmB,OAAO,EAAEA,CAAA,KAAMf,SAAS,CAACgB,YAAY,CAAC,CAAE;IACxCC,eAAe,EAAEN,EAAE,CAACM,eAAgB;IACpCC,WAAW,EAAEP,EAAE,CAACO,WAAY;IAC5BN,eAAe,EAAED,EAAE,CAACC;EAAgB,CACvC,CAAC;AAEV,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,26 @@
1
+ import React from "react";
2
+ export interface LoginContentProps {
3
+ isAuthenticated: boolean;
4
+ isLoggingIn: boolean;
5
+ checkingSession: boolean;
6
+ onLogin: () => void;
7
+ }
8
+ export declare const LoginContent: (({ onLogin, isLoggingIn, checkingSession, isAuthenticated }: LoginContentProps) => React.JSX.Element) & {
9
+ original: ({ onLogin, isLoggingIn, checkingSession, isAuthenticated }: LoginContentProps) => React.JSX.Element;
10
+ originalName: string;
11
+ displayName: string;
12
+ } & {
13
+ original: (({ onLogin, isLoggingIn, checkingSession, isAuthenticated }: LoginContentProps) => React.JSX.Element) & {
14
+ original: ({ onLogin, isLoggingIn, checkingSession, isAuthenticated }: LoginContentProps) => React.JSX.Element;
15
+ originalName: string;
16
+ displayName: string;
17
+ };
18
+ originalName: string;
19
+ displayName: string;
20
+ } & {
21
+ createDecorator: (decorator: import("@webiny/app-admin").ComponentDecorator<(({ onLogin, isLoggingIn, checkingSession, isAuthenticated }: LoginContentProps) => React.JSX.Element) & {
22
+ original: ({ onLogin, isLoggingIn, checkingSession, isAuthenticated }: LoginContentProps) => React.JSX.Element;
23
+ originalName: string;
24
+ displayName: string;
25
+ }>) => (props: unknown) => React.JSX.Element;
26
+ };
@@ -0,0 +1,36 @@
1
+ import React from "react";
2
+ import { makeDecoratable } from "@webiny/app-admin";
3
+ import { Button } from "@webiny/admin-ui";
4
+ import { Icon } from "@webiny/admin-ui";
5
+ import { OverlayLoader } from "@webiny/admin-ui";
6
+ import { ReactComponent as OktaIcon } from "./okta-icon.svg";
7
+ import { View } from "./View.js";
8
+ export const LoginContent = makeDecoratable("LoginContent", ({
9
+ onLogin,
10
+ isLoggingIn,
11
+ checkingSession,
12
+ isAuthenticated
13
+ }) => {
14
+ return /*#__PURE__*/React.createElement(React.Fragment, null, isLoggingIn ? /*#__PURE__*/React.createElement(OverlayLoader, {
15
+ text: "Logging in..."
16
+ }) : null, checkingSession ? /*#__PURE__*/React.createElement(OverlayLoader, {
17
+ text: "Checking user session..."
18
+ }) : null, !isAuthenticated && !isLoggingIn && !checkingSession ? /*#__PURE__*/React.createElement(View.Container, null, /*#__PURE__*/React.createElement(View.Content, null, /*#__PURE__*/React.createElement(View.Title, {
19
+ title: "Sign In",
20
+ description: "You will be taken to Okta website to complete the sign in process."
21
+ }), /*#__PURE__*/React.createElement("div", {
22
+ className: "flex w-full"
23
+ }, /*#__PURE__*/React.createElement(Button, {
24
+ variant: "primary",
25
+ className: "w-full",
26
+ containerClassName: "w-full",
27
+ onClick: onLogin,
28
+ icon: /*#__PURE__*/React.createElement(Icon, {
29
+ icon: /*#__PURE__*/React.createElement(OktaIcon, null),
30
+ label: "Okta"
31
+ }),
32
+ text: "Sign in with Okta"
33
+ })))) : null);
34
+ });
35
+
36
+ //# sourceMappingURL=LoginContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","makeDecoratable","Button","Icon","OverlayLoader","ReactComponent","OktaIcon","View","LoginContent","onLogin","isLoggingIn","checkingSession","isAuthenticated","createElement","Fragment","text","Container","Content","Title","title","description","className","variant","containerClassName","onClick","icon","label"],"sources":["LoginContent.tsx"],"sourcesContent":["import React from \"react\";\nimport { makeDecoratable } from \"@webiny/app-admin\";\nimport { Button } from \"@webiny/admin-ui\";\nimport { Icon } from \"@webiny/admin-ui\";\nimport { OverlayLoader } from \"@webiny/admin-ui\";\nimport { ReactComponent as OktaIcon } from \"./okta-icon.svg\";\nimport { View } from \"./View.js\";\n\nexport interface LoginContentProps {\n isAuthenticated: boolean;\n isLoggingIn: boolean;\n checkingSession: boolean;\n onLogin: () => void;\n}\n\nexport const LoginContent = makeDecoratable(\n \"LoginContent\",\n ({ onLogin, isLoggingIn, checkingSession, isAuthenticated }: LoginContentProps) => {\n return (\n <>\n {isLoggingIn ? <OverlayLoader text={\"Logging in...\"} /> : null}\n {checkingSession ? <OverlayLoader text={\"Checking user session...\"} /> : null}\n {!isAuthenticated && !isLoggingIn && !checkingSession ? (\n <View.Container>\n <View.Content>\n <View.Title\n title={\"Sign In\"}\n description={\n \"You will be taken to Okta website to complete the sign in process.\"\n }\n />\n\n <div className={\"flex w-full\"}>\n <Button\n variant={\"primary\"}\n className={\"w-full\"}\n containerClassName={\"w-full\"}\n onClick={onLogin}\n icon={<Icon icon={<OktaIcon />} label={\"Okta\"} />}\n text={\"Sign in with Okta\"}\n />\n </div>\n </View.Content>\n </View.Container>\n ) : null}\n </>\n );\n }\n);\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,eAAe,QAAQ,mBAAmB;AACnD,SAASC,MAAM,QAAQ,kBAAkB;AACzC,SAASC,IAAI,QAAQ,kBAAkB;AACvC,SAASC,aAAa,QAAQ,kBAAkB;AAChD,SAASC,cAAc,IAAIC,QAAQ;AACnC,SAASC,IAAI;AASb,OAAO,MAAMC,YAAY,GAAGP,eAAe,CACvC,cAAc,EACd,CAAC;EAAEQ,OAAO;EAAEC,WAAW;EAAEC,eAAe;EAAEC;AAAmC,CAAC,KAAK;EAC/E,oBACIZ,KAAA,CAAAa,aAAA,CAAAb,KAAA,CAAAc,QAAA,QACKJ,WAAW,gBAAGV,KAAA,CAAAa,aAAA,CAACT,aAAa;IAACW,IAAI,EAAE;EAAgB,CAAE,CAAC,GAAG,IAAI,EAC7DJ,eAAe,gBAAGX,KAAA,CAAAa,aAAA,CAACT,aAAa;IAACW,IAAI,EAAE;EAA2B,CAAE,CAAC,GAAG,IAAI,EAC5E,CAACH,eAAe,IAAI,CAACF,WAAW,IAAI,CAACC,eAAe,gBACjDX,KAAA,CAAAa,aAAA,CAACN,IAAI,CAACS,SAAS,qBACXhB,KAAA,CAAAa,aAAA,CAACN,IAAI,CAACU,OAAO,qBACTjB,KAAA,CAAAa,aAAA,CAACN,IAAI,CAACW,KAAK;IACPC,KAAK,EAAE,SAAU;IACjBC,WAAW,EACP;EACH,CACJ,CAAC,eAEFpB,KAAA,CAAAa,aAAA;IAAKQ,SAAS,EAAE;EAAc,gBAC1BrB,KAAA,CAAAa,aAAA,CAACX,MAAM;IACHoB,OAAO,EAAE,SAAU;IACnBD,SAAS,EAAE,QAAS;IACpBE,kBAAkB,EAAE,QAAS;IAC7BC,OAAO,EAAEf,OAAQ;IACjBgB,IAAI,eAAEzB,KAAA,CAAAa,aAAA,CAACV,IAAI;MAACsB,IAAI,eAAEzB,KAAA,CAAAa,aAAA,CAACP,QAAQ,MAAE,CAAE;MAACoB,KAAK,EAAE;IAAO,CAAE,CAAE;IAClDX,IAAI,EAAE;EAAoB,CAC7B,CACA,CACK,CACF,CAAC,GACjB,IACN,CAAC;AAEX,CACJ,CAAC","ignoreList":[]}
@@ -0,0 +1,98 @@
1
+ import * as React from "react";
2
+ export interface ContainerProps {
3
+ children: React.ReactNode;
4
+ }
5
+ export interface ContentProps {
6
+ children: React.ReactNode;
7
+ }
8
+ export interface FooterProps {
9
+ children: React.ReactNode;
10
+ }
11
+ export interface TitleProps {
12
+ title: string;
13
+ description?: React.ReactNode;
14
+ }
15
+ export interface ErrorProps {
16
+ title?: string;
17
+ description?: string | null;
18
+ }
19
+ export declare const Error: ({ title, description }: ErrorProps) => React.JSX.Element | null;
20
+ export declare const View: {
21
+ Container: (({ children }: ContainerProps) => React.JSX.Element) & {
22
+ original: ({ children }: ContainerProps) => React.JSX.Element;
23
+ originalName: string;
24
+ displayName: string;
25
+ } & {
26
+ original: (({ children }: ContainerProps) => React.JSX.Element) & {
27
+ original: ({ children }: ContainerProps) => React.JSX.Element;
28
+ originalName: string;
29
+ displayName: string;
30
+ };
31
+ originalName: string;
32
+ displayName: string;
33
+ } & {
34
+ createDecorator: (decorator: import("@webiny/app-admin").ComponentDecorator<(({ children }: ContainerProps) => React.JSX.Element) & {
35
+ original: ({ children }: ContainerProps) => React.JSX.Element;
36
+ originalName: string;
37
+ displayName: string;
38
+ }>) => (props: unknown) => React.JSX.Element;
39
+ };
40
+ Content: (({ children }: ContentProps) => React.JSX.Element) & {
41
+ original: ({ children }: ContentProps) => React.JSX.Element;
42
+ originalName: string;
43
+ displayName: string;
44
+ } & {
45
+ original: (({ children }: ContentProps) => React.JSX.Element) & {
46
+ original: ({ children }: ContentProps) => React.JSX.Element;
47
+ originalName: string;
48
+ displayName: string;
49
+ };
50
+ originalName: string;
51
+ displayName: string;
52
+ } & {
53
+ createDecorator: (decorator: import("@webiny/app-admin").ComponentDecorator<(({ children }: ContentProps) => React.JSX.Element) & {
54
+ original: ({ children }: ContentProps) => React.JSX.Element;
55
+ originalName: string;
56
+ displayName: string;
57
+ }>) => (props: unknown) => React.JSX.Element;
58
+ };
59
+ Title: (({ title, description }: TitleProps) => React.JSX.Element) & {
60
+ original: ({ title, description }: TitleProps) => React.JSX.Element;
61
+ originalName: string;
62
+ displayName: string;
63
+ } & {
64
+ original: (({ title, description }: TitleProps) => React.JSX.Element) & {
65
+ original: ({ title, description }: TitleProps) => React.JSX.Element;
66
+ originalName: string;
67
+ displayName: string;
68
+ };
69
+ originalName: string;
70
+ displayName: string;
71
+ } & {
72
+ createDecorator: (decorator: import("@webiny/app-admin").ComponentDecorator<(({ title, description }: TitleProps) => React.JSX.Element) & {
73
+ original: ({ title, description }: TitleProps) => React.JSX.Element;
74
+ originalName: string;
75
+ displayName: string;
76
+ }>) => (props: unknown) => React.JSX.Element;
77
+ };
78
+ Footer: (({ children }: FooterProps) => React.JSX.Element) & {
79
+ original: ({ children }: FooterProps) => React.JSX.Element;
80
+ originalName: string;
81
+ displayName: string;
82
+ } & {
83
+ original: (({ children }: FooterProps) => React.JSX.Element) & {
84
+ original: ({ children }: FooterProps) => React.JSX.Element;
85
+ originalName: string;
86
+ displayName: string;
87
+ };
88
+ originalName: string;
89
+ displayName: string;
90
+ } & {
91
+ createDecorator: (decorator: import("@webiny/app-admin").ComponentDecorator<(({ children }: FooterProps) => React.JSX.Element) & {
92
+ original: ({ children }: FooterProps) => React.JSX.Element;
93
+ originalName: string;
94
+ displayName: string;
95
+ }>) => (props: unknown) => React.JSX.Element;
96
+ };
97
+ Error: ({ title, description }: ErrorProps) => React.JSX.Element | null;
98
+ };
@@ -0,0 +1,70 @@
1
+ import * as React from "react";
2
+ import { Logo } from "@webiny/app-admin";
3
+ import { makeDecoratable } from "@webiny/app-admin";
4
+ import { Alert } from "@webiny/admin-ui";
5
+ import { Grid } from "@webiny/admin-ui";
6
+ import { Heading } from "@webiny/admin-ui";
7
+ import { Text } from "@webiny/admin-ui";
8
+ const Container = makeDecoratable("ViewContainer", ({
9
+ children
10
+ }) => {
11
+ return /*#__PURE__*/React.createElement("div", {
12
+ className: "w-full h-screen bg-neutral-light flex-1"
13
+ }, /*#__PURE__*/React.createElement("section", {
14
+ className: "m-auto flex flex-col justify-center min-h-screen"
15
+ }, /*#__PURE__*/React.createElement("div", {
16
+ className: "mx-auto"
17
+ }, /*#__PURE__*/React.createElement(Logo, null)), /*#__PURE__*/React.createElement("div", {
18
+ className: "w-full max-w-[480px] mx-auto my-lg"
19
+ }, children)));
20
+ });
21
+ const Content = makeDecoratable("ViewContent", ({
22
+ children
23
+ }) => /*#__PURE__*/React.createElement("div", {
24
+ className: "relative p-lg pt-md bg-neutral-base rounded-xl"
25
+ }, children));
26
+ const Footer = makeDecoratable("ViewFooter", ({
27
+ children
28
+ }) => {
29
+ return /*#__PURE__*/React.createElement(Grid, null, /*#__PURE__*/React.createElement(Grid.Column, {
30
+ span: 12,
31
+ className: "text-center mt-lg"
32
+ }, children));
33
+ });
34
+ const Title = makeDecoratable("ViewTitle", ({
35
+ title,
36
+ description
37
+ }) => {
38
+ return /*#__PURE__*/React.createElement("div", {
39
+ className: "mb-md"
40
+ }, /*#__PURE__*/React.createElement(Heading, {
41
+ level: 4
42
+ }, title), description && /*#__PURE__*/React.createElement(Text, {
43
+ as: "div",
44
+ size: "sm",
45
+ className: "text-neutral-strong"
46
+ }, description));
47
+ });
48
+ export const Error = ({
49
+ title = "Something went wrong",
50
+ description
51
+ }) => {
52
+ if (!description) {
53
+ return null;
54
+ }
55
+ return /*#__PURE__*/React.createElement("div", {
56
+ className: "mb-lg"
57
+ }, /*#__PURE__*/React.createElement(Alert, {
58
+ title: title,
59
+ type: "danger"
60
+ }, description));
61
+ };
62
+ export const View = {
63
+ Container,
64
+ Content,
65
+ Title,
66
+ Footer,
67
+ Error
68
+ };
69
+
70
+ //# sourceMappingURL=View.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","Logo","makeDecoratable","Alert","Grid","Heading","Text","Container","children","createElement","className","Content","Footer","Column","span","Title","title","description","level","as","size","Error","type","View"],"sources":["View.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Logo } from \"@webiny/app-admin\";\nimport { makeDecoratable } from \"@webiny/app-admin\";\nimport { Alert } from \"@webiny/admin-ui\";\nimport { Grid } from \"@webiny/admin-ui\";\nimport { Heading } from \"@webiny/admin-ui\";\nimport { Text } from \"@webiny/admin-ui\";\n\nexport interface ContainerProps {\n children: React.ReactNode;\n}\n\nconst Container = makeDecoratable(\"ViewContainer\", ({ children }: ContainerProps) => {\n return (\n <div className={\"w-full h-screen bg-neutral-light flex-1\"}>\n <section className={\"m-auto flex flex-col justify-center min-h-screen\"}>\n <div className={\"mx-auto\"}>\n <Logo />\n </div>\n <div className={\"w-full max-w-[480px] mx-auto my-lg\"}>{children}</div>\n </section>\n </div>\n );\n});\n\nexport interface ContentProps {\n children: React.ReactNode;\n}\n\nconst Content = makeDecoratable(\"ViewContent\", ({ children }: ContentProps) => (\n <div className={\"relative p-lg pt-md bg-neutral-base rounded-xl\"}>{children}</div>\n));\n\nexport interface FooterProps {\n children: React.ReactNode;\n}\n\nconst Footer = makeDecoratable(\"ViewFooter\", ({ children }: FooterProps) => {\n return (\n <Grid>\n <Grid.Column span={12} className={\"text-center mt-lg\"}>\n {children}\n </Grid.Column>\n </Grid>\n );\n});\n\nexport interface TitleProps {\n title: string;\n description?: React.ReactNode;\n}\n\nconst Title = makeDecoratable(\"ViewTitle\", ({ title, description }: TitleProps) => {\n return (\n <div className={\"mb-md\"}>\n <Heading level={4}>{title}</Heading>\n {description && (\n <Text as={\"div\"} size={\"sm\"} className={\"text-neutral-strong\"}>\n {description}\n </Text>\n )}\n </div>\n );\n});\n\nexport interface ErrorProps {\n title?: string;\n description?: string | null;\n}\n\nexport const Error = ({ title = \"Something went wrong\", description }: ErrorProps) => {\n if (!description) {\n return null;\n }\n\n return (\n <div className={\"mb-lg\"}>\n <Alert title={title} type={\"danger\"}>\n {description}\n </Alert>\n </div>\n );\n};\n\nexport const View = {\n Container,\n Content,\n Title,\n Footer,\n Error\n};\n"],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAASC,IAAI,QAAQ,mBAAmB;AACxC,SAASC,eAAe,QAAQ,mBAAmB;AACnD,SAASC,KAAK,QAAQ,kBAAkB;AACxC,SAASC,IAAI,QAAQ,kBAAkB;AACvC,SAASC,OAAO,QAAQ,kBAAkB;AAC1C,SAASC,IAAI,QAAQ,kBAAkB;AAMvC,MAAMC,SAAS,GAAGL,eAAe,CAAC,eAAe,EAAE,CAAC;EAAEM;AAAyB,CAAC,KAAK;EACjF,oBACIR,KAAA,CAAAS,aAAA;IAAKC,SAAS,EAAE;EAA0C,gBACtDV,KAAA,CAAAS,aAAA;IAASC,SAAS,EAAE;EAAmD,gBACnEV,KAAA,CAAAS,aAAA;IAAKC,SAAS,EAAE;EAAU,gBACtBV,KAAA,CAAAS,aAAA,CAACR,IAAI,MAAE,CACN,CAAC,eACND,KAAA,CAAAS,aAAA;IAAKC,SAAS,EAAE;EAAqC,GAAEF,QAAc,CAChE,CACR,CAAC;AAEd,CAAC,CAAC;AAMF,MAAMG,OAAO,GAAGT,eAAe,CAAC,aAAa,EAAE,CAAC;EAAEM;AAAuB,CAAC,kBACtER,KAAA,CAAAS,aAAA;EAAKC,SAAS,EAAE;AAAiD,GAAEF,QAAc,CACpF,CAAC;AAMF,MAAMI,MAAM,GAAGV,eAAe,CAAC,YAAY,EAAE,CAAC;EAAEM;AAAsB,CAAC,KAAK;EACxE,oBACIR,KAAA,CAAAS,aAAA,CAACL,IAAI,qBACDJ,KAAA,CAAAS,aAAA,CAACL,IAAI,CAACS,MAAM;IAACC,IAAI,EAAE,EAAG;IAACJ,SAAS,EAAE;EAAoB,GACjDF,QACQ,CACX,CAAC;AAEf,CAAC,CAAC;AAOF,MAAMO,KAAK,GAAGb,eAAe,CAAC,WAAW,EAAE,CAAC;EAAEc,KAAK;EAAEC;AAAwB,CAAC,KAAK;EAC/E,oBACIjB,KAAA,CAAAS,aAAA;IAAKC,SAAS,EAAE;EAAQ,gBACpBV,KAAA,CAAAS,aAAA,CAACJ,OAAO;IAACa,KAAK,EAAE;EAAE,GAAEF,KAAe,CAAC,EACnCC,WAAW,iBACRjB,KAAA,CAAAS,aAAA,CAACH,IAAI;IAACa,EAAE,EAAE,KAAM;IAACC,IAAI,EAAE,IAAK;IAACV,SAAS,EAAE;EAAsB,GACzDO,WACC,CAET,CAAC;AAEd,CAAC,CAAC;AAOF,OAAO,MAAMI,KAAK,GAAGA,CAAC;EAAEL,KAAK,GAAG,sBAAsB;EAAEC;AAAwB,CAAC,KAAK;EAClF,IAAI,CAACA,WAAW,EAAE;IACd,OAAO,IAAI;EACf;EAEA,oBACIjB,KAAA,CAAAS,aAAA;IAAKC,SAAS,EAAE;EAAQ,gBACpBV,KAAA,CAAAS,aAAA,CAACN,KAAK;IAACa,KAAK,EAAEA,KAAM;IAACM,IAAI,EAAE;EAAS,GAC/BL,WACE,CACN,CAAC;AAEd,CAAC;AAED,OAAO,MAAMM,IAAI,GAAG;EAChBhB,SAAS;EACTI,OAAO;EACPI,KAAK;EACLH,MAAM;EACNS;AACJ,CAAC","ignoreList":[]}
@@ -0,0 +1 @@
1
+ <svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2"><path d="M281.086 9.305L270.8 136.057a129.037 129.037 0 00-14.732-.834c-6.254 0-12.37.417-18.346 1.39l-5.837-61.43c-.14-1.946 1.39-3.614 3.336-3.614h10.423l-5.003-62.125c-.14-1.946 1.39-3.614 3.196-3.614h34.051c1.946 0 3.475 1.668 3.197 3.614v-.14zm-85.892 6.254c-.556-1.807-2.501-2.919-4.308-2.224L158.92 25.01c-1.807.695-2.64 2.78-1.807 4.447l25.99 56.705-9.868 3.614c-1.807.695-2.64 2.78-1.807 4.447l26.546 55.732a119.16 119.16 0 0130.993-11.813L195.333 15.559h-.139zM116.808 50.86l73.522 103.68c-9.312 6.116-17.79 13.343-25.017 21.682l-44.058-43.362c-1.39-1.39-1.25-3.614.14-4.865l8.06-6.671-43.78-44.336c-1.389-1.39-1.25-3.613.279-4.864l25.99-21.82c1.528-1.251 3.613-.973 4.725.556h.139zM55.1 110.9c-1.53-1.112-3.753-.556-4.726 1.112l-16.956 29.464c-.973 1.668-.278 3.753 1.39 4.587l56.427 26.685-5.281 9.034c-.973 1.667-.278 3.891 1.529 4.586l56.149 25.712c4.03-10.424 9.45-20.153 16.122-28.909L55.1 110.902zm-41.556 80.054c.278-1.945 2.223-3.057 4.03-2.64l123 32.105c-3.197 10.424-5.003 21.403-5.281 32.8l-61.57-5.004a3.21 3.21 0 01-2.918-3.891l1.806-10.285-62.125-5.837c-1.946-.14-3.197-1.946-2.919-3.892l5.838-33.495.139.14zm-4.587 83.112c-1.946.14-3.196 1.946-2.918 3.892l5.976 33.495c.278 1.945 2.224 3.057 4.03 2.64l60.319-15.705 1.807 10.285c.278 1.946 2.223 3.058 4.03 2.64l59.485-16.4c-3.475-10.284-5.698-21.264-6.254-32.521L8.818 274.067h.14zm19.736 88.115c-.973-1.667-.278-3.752 1.39-4.586l114.8-54.481c4.308 10.284 10.145 19.874 17.094 28.491l-50.311 35.858c-1.53 1.112-3.753.695-4.726-.973l-5.281-9.173-51.285 35.44c-1.529 1.113-3.752.557-4.725-1.111l-17.095-29.465h.139zm139.122-23.905l-89.366 90.478c-1.39 1.39-1.251 3.614.278 4.865l26.128 21.82c1.53 1.25 3.614.973 4.726-.556l36.135-50.868 8.061 6.81c1.53 1.251 3.753.973 4.865-.694l35.024-50.868c-9.451-5.837-18.207-12.926-25.712-20.987h-.14zm-17.651 145.238c-1.807-.695-2.64-2.78-1.807-4.448l52.953-115.634c9.728 5.004 20.291 8.756 31.27 10.841l-15.565 59.763c-.417 1.806-2.502 2.918-4.309 2.223l-9.868-3.613-16.538 60.18c-.556 1.806-2.502 2.918-4.309 2.223l-31.966-11.674.139.139zm91.173-107.712l-10.285 126.752c-.139 1.946 1.39 3.614 3.197 3.614h34.05c1.946 0 3.475-1.668 3.197-3.614l-5.003-62.125h10.423c1.946 0 3.475-1.668 3.336-3.614l-5.837-61.43c-5.977.973-12.092 1.39-18.346 1.39-5.003 0-9.868-.278-14.732-.973zM363.92 32.653c.834-1.806 0-3.752-1.807-4.447l-31.966-11.674c-1.807-.695-3.753.417-4.309 2.224L309.3 78.936l-9.867-3.614c-1.807-.695-3.753.417-4.309 2.223l-15.566 59.763c11.119 2.224 21.542 5.976 31.271 10.84L363.92 32.655zm69.77 50.452l-89.367 90.478a121.31 121.31 0 00-25.712-20.987l35.024-50.868c1.112-1.528 3.336-1.945 4.864-.695l8.061 6.81 36.136-50.867c1.112-1.529 3.336-1.807 4.725-.556l26.13 21.82c1.528 1.251 1.528 3.475.277 4.865h-.139zm48.365 71.159c1.807-.834 2.363-2.919 1.39-4.587l-17.095-29.464c-.973-1.668-3.196-2.085-4.725-1.112l-51.285 35.44-5.281-9.033c-.973-1.668-3.197-2.224-4.726-.973l-50.312 35.858c6.95 8.617 12.648 18.207 17.095 28.491l114.8-54.481.14-.14zm18.068 46.142l5.837 33.495c.278 1.946-.972 3.614-2.918 3.892l-126.614 11.813c-.556-11.396-2.78-22.237-6.254-32.522l59.485-16.4c1.807-.556 3.752.695 4.03 2.64l1.807 10.286 60.319-15.705c1.806-.417 3.752.695 4.03 2.64l.278-.139zm-5.698 123c1.807.417 3.752-.695 4.03-2.64l5.838-33.495c.278-1.946-.973-3.614-2.919-3.892l-62.125-5.837 1.806-10.285c.278-1.946-.973-3.613-2.918-3.891l-61.57-5.004c-.278 11.397-2.085 22.376-5.281 32.8l123 32.105.139.14zm-32.8 76.44c-.973 1.669-3.197 2.086-4.726 1.113l-104.654-72.271c6.671-8.756 12.092-18.485 16.122-28.909l56.15 25.712c1.806.834 2.501 2.919 1.528 4.586l-5.281 9.034 56.427 26.685c1.668.834 2.363 2.919 1.39 4.586l-16.956 29.465zM321.669 357.18L395.19 460.86c1.112 1.53 3.336 1.807 4.725.556l25.99-21.82c1.529-1.25 1.529-3.475.278-4.864l-43.78-44.336 8.062-6.671c1.528-1.251 1.528-3.475.139-4.865l-44.058-43.362c-7.366 8.339-15.705 15.705-25.017 21.681h.139zm-.695 141.207c-1.807.695-3.753-.417-4.308-2.224L283.032 373.58a119.16 119.16 0 0030.993-11.813l26.546 55.732c.834 1.807 0 3.891-1.807 4.447l-9.868 3.614 25.99 56.705c.834 1.807 0 3.752-1.807 4.447l-31.966 11.675h-.139z"/></svg>
@@ -0,0 +1,25 @@
1
+ import { OktaPresenter as Abstraction } from "./abstractions.js";
2
+ import { LogInUseCase } from "@webiny/app-admin/features/security/LogIn";
3
+ import { IdentityContext } from "@webiny/app-admin/features/security/IdentityContext/index.js";
4
+ declare class OktaPresenterImpl implements Abstraction.Interface {
5
+ private identity;
6
+ private loginUseCase;
7
+ private oktaAuth;
8
+ private loggingIn;
9
+ private checkingSession;
10
+ constructor(identity: IdentityContext.Interface, loginUseCase: LogInUseCase.Interface);
11
+ get vm(): {
12
+ isAuthenticated: boolean;
13
+ isLoggingIn: boolean;
14
+ checkingSession: boolean;
15
+ };
16
+ init(params: Abstraction.InitParams): Promise<void>;
17
+ authenticate(): void;
18
+ private login;
19
+ private getOktaAuth;
20
+ private isOktaAuthenticated;
21
+ }
22
+ export declare const OktaPresenter: typeof OktaPresenterImpl & {
23
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IOktaPresenter>;
24
+ };
25
+ export {};
@@ -0,0 +1,119 @@
1
+ import { makeAutoObservable } from "mobx";
2
+ import { runInAction } from "mobx";
3
+ import { OktaAuth } from "@okta/okta-auth-js";
4
+ import { OktaPresenter as Abstraction } from "./abstractions.js";
5
+ import { LogInUseCase } from "@webiny/app-admin/features/security/LogIn";
6
+ import { IdentityContext } from "@webiny/app-admin/features/security/IdentityContext/index.js";
7
+ class OktaPresenterImpl {
8
+ loggingIn = false;
9
+ checkingSession = false;
10
+ constructor(identity, loginUseCase) {
11
+ this.identity = identity;
12
+ this.loginUseCase = loginUseCase;
13
+ makeAutoObservable(this);
14
+ }
15
+ get vm() {
16
+ const identity = this.identity.getIdentity();
17
+ return {
18
+ isAuthenticated: identity.isAuthenticated,
19
+ isLoggingIn: this.loggingIn,
20
+ checkingSession: this.checkingSession
21
+ };
22
+ }
23
+ async init(params) {
24
+ this.oktaAuth = new OktaAuth({
25
+ issuer: params.issuer,
26
+ clientId: params.clientId,
27
+ redirectUri: window.location.origin,
28
+ scopes: ["openid", "profile", "email", "offline_access"],
29
+ pkce: true,
30
+ tokenManager: {
31
+ storage: "localStorage"
32
+ }
33
+ });
34
+
35
+ // Subscribe to authState changes
36
+ this.oktaAuth.authStateManager.subscribe(authState => {
37
+ // Handle authentication state changes
38
+ if (authState.isAuthenticated && !this.identity.getIdentity().isAuthenticated) {
39
+ // User just became authenticated, trigger login
40
+ this.login();
41
+ }
42
+ });
43
+
44
+ // Handle redirect callback if present
45
+ if (this.oktaAuth.token.isLoginRedirect()) {
46
+ runInAction(() => {
47
+ this.checkingSession = true;
48
+ });
49
+ try {
50
+ const {
51
+ tokens
52
+ } = await this.oktaAuth.token.parseFromUrl();
53
+ this.oktaAuth.tokenManager.setTokens(tokens);
54
+ // Clean up URL
55
+ window.history.replaceState({}, document.title, window.location.pathname);
56
+ } finally {
57
+ runInAction(() => {
58
+ this.checkingSession = false;
59
+ });
60
+ }
61
+ }
62
+
63
+ // Run as a service - this will trigger authStateManager updates
64
+ await this.oktaAuth.start();
65
+
66
+ // Only auto-login if not authenticated and autoLogin is enabled
67
+ if (!this.isOktaAuthenticated() && params.autoLogin) {
68
+ this.authenticate();
69
+ }
70
+ }
71
+ authenticate() {
72
+ this.getOktaAuth().signInWithRedirect({
73
+ originalUri: window.location.pathname + window.location.search
74
+ });
75
+ }
76
+ async login() {
77
+ // Prevent duplicate login attempts
78
+ if (this.loggingIn) {
79
+ return;
80
+ }
81
+ runInAction(() => {
82
+ this.loggingIn = true;
83
+ });
84
+ try {
85
+ // Set logout callback
86
+ const logoutCallback = async () => {
87
+ // Clear tokens from local storage
88
+ this.getOktaAuth().tokenManager.clear();
89
+ const url = new URL(`${window.location}`);
90
+ url.searchParams.set("action", "logout");
91
+ window.history.replaceState({}, "", url);
92
+ };
93
+ await this.loginUseCase.execute({
94
+ idTokenProvider: () => this.getOktaAuth().getIdToken(),
95
+ logoutCallback
96
+ });
97
+ } finally {
98
+ runInAction(() => {
99
+ this.loggingIn = false;
100
+ });
101
+ }
102
+ }
103
+ getOktaAuth() {
104
+ if (!this.oktaAuth) {
105
+ throw new Error("OktaAuth is not initialized.");
106
+ }
107
+ return this.oktaAuth;
108
+ }
109
+ isOktaAuthenticated() {
110
+ const currentAuthState = this.getOktaAuth().authStateManager.getAuthState();
111
+ return currentAuthState?.isAuthenticated ?? false;
112
+ }
113
+ }
114
+ export const OktaPresenter = Abstraction.createImplementation({
115
+ implementation: OktaPresenterImpl,
116
+ dependencies: [IdentityContext, LogInUseCase]
117
+ });
118
+
119
+ //# sourceMappingURL=OktaPresenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["makeAutoObservable","runInAction","OktaAuth","OktaPresenter","Abstraction","LogInUseCase","IdentityContext","OktaPresenterImpl","loggingIn","checkingSession","constructor","identity","loginUseCase","vm","getIdentity","isAuthenticated","isLoggingIn","init","params","oktaAuth","issuer","clientId","redirectUri","window","location","origin","scopes","pkce","tokenManager","storage","authStateManager","subscribe","authState","login","token","isLoginRedirect","tokens","parseFromUrl","setTokens","history","replaceState","document","title","pathname","start","isOktaAuthenticated","autoLogin","authenticate","getOktaAuth","signInWithRedirect","originalUri","search","logoutCallback","clear","url","URL","searchParams","set","execute","idTokenProvider","getIdToken","Error","currentAuthState","getAuthState","createImplementation","implementation","dependencies"],"sources":["OktaPresenter.ts"],"sourcesContent":["import { makeAutoObservable } from \"mobx\";\nimport { runInAction } from \"mobx\";\nimport { OktaAuth } from \"@okta/okta-auth-js\";\nimport type { AuthState } from \"@okta/okta-auth-js\";\nimport { OktaPresenter as Abstraction } from \"./abstractions.js\";\nimport { LogInUseCase } from \"@webiny/app-admin/features/security/LogIn\";\nimport { IdentityContext } from \"@webiny/app-admin/features/security/IdentityContext/index.js\";\n\nclass OktaPresenterImpl implements Abstraction.Interface {\n private oktaAuth: OktaAuth | undefined;\n private loggingIn = false;\n private checkingSession = false;\n\n constructor(\n private identity: IdentityContext.Interface,\n private loginUseCase: LogInUseCase.Interface\n ) {\n makeAutoObservable(this);\n }\n\n get vm() {\n const identity = this.identity.getIdentity();\n\n return {\n isAuthenticated: identity.isAuthenticated,\n isLoggingIn: this.loggingIn,\n checkingSession: this.checkingSession\n };\n }\n\n async init(params: Abstraction.InitParams): Promise<void> {\n this.oktaAuth = new OktaAuth({\n issuer: params.issuer,\n clientId: params.clientId,\n redirectUri: window.location.origin,\n scopes: [\"openid\", \"profile\", \"email\", \"offline_access\"],\n pkce: true,\n tokenManager: {\n storage: \"localStorage\"\n }\n });\n\n // Subscribe to authState changes\n this.oktaAuth.authStateManager.subscribe((authState: AuthState) => {\n // Handle authentication state changes\n if (authState.isAuthenticated && !this.identity.getIdentity().isAuthenticated) {\n // User just became authenticated, trigger login\n this.login();\n }\n });\n\n // Handle redirect callback if present\n if (this.oktaAuth.token.isLoginRedirect()) {\n runInAction(() => {\n this.checkingSession = true;\n });\n\n try {\n const { tokens } = await this.oktaAuth.token.parseFromUrl();\n this.oktaAuth.tokenManager.setTokens(tokens);\n // Clean up URL\n window.history.replaceState({}, document.title, window.location.pathname);\n } finally {\n runInAction(() => {\n this.checkingSession = false;\n });\n }\n }\n\n // Run as a service - this will trigger authStateManager updates\n await this.oktaAuth.start();\n\n // Only auto-login if not authenticated and autoLogin is enabled\n if (!this.isOktaAuthenticated() && params.autoLogin) {\n this.authenticate();\n }\n }\n\n authenticate() {\n this.getOktaAuth().signInWithRedirect({\n originalUri: window.location.pathname + window.location.search\n });\n }\n\n private async login(): Promise<void> {\n // Prevent duplicate login attempts\n if (this.loggingIn) {\n return;\n }\n\n runInAction(() => {\n this.loggingIn = true;\n });\n\n try {\n // Set logout callback\n const logoutCallback = async (): Promise<void> => {\n // Clear tokens from local storage\n this.getOktaAuth().tokenManager.clear();\n\n const url = new URL(`${window.location}`);\n url.searchParams.set(\"action\", \"logout\");\n window.history.replaceState({}, \"\", url);\n };\n\n await this.loginUseCase.execute({\n idTokenProvider: () => this.getOktaAuth().getIdToken(),\n logoutCallback\n });\n } finally {\n runInAction(() => {\n this.loggingIn = false;\n });\n }\n }\n\n private getOktaAuth() {\n if (!this.oktaAuth) {\n throw new Error(\"OktaAuth is not initialized.\");\n }\n return this.oktaAuth;\n }\n\n private isOktaAuthenticated() {\n const currentAuthState = this.getOktaAuth().authStateManager.getAuthState();\n return currentAuthState?.isAuthenticated ?? false;\n }\n}\n\nexport const OktaPresenter = Abstraction.createImplementation({\n implementation: OktaPresenterImpl,\n dependencies: [IdentityContext, LogInUseCase]\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,22 @@
1
+ import { OktaAuth } from "@okta/okta-auth-js";
2
+ export type IOnLogin = (oktaAuth: OktaAuth) => void;
3
+ export interface IOktaPresenter {
4
+ vm: {
5
+ isAuthenticated: boolean;
6
+ isLoggingIn: boolean;
7
+ checkingSession: boolean;
8
+ };
9
+ init(params: IOktaInitParams): Promise<void>;
10
+ authenticate(): void;
11
+ }
12
+ export interface IOktaInitParams {
13
+ issuer: string;
14
+ clientId: string;
15
+ autoLogin: boolean;
16
+ }
17
+ export declare const OktaPresenter: import("@webiny/di").Abstraction<IOktaPresenter>;
18
+ export declare namespace OktaPresenter {
19
+ type Interface = IOktaPresenter;
20
+ type InitParams = IOktaInitParams;
21
+ type OnLogin = IOnLogin;
22
+ }
@@ -0,0 +1,4 @@
1
+ import { createAbstraction } from "@webiny/feature/admin";
2
+ export const OktaPresenter = createAbstraction("OktaPresenter");
3
+
4
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createAbstraction","OktaPresenter"],"sources":["abstractions.ts"],"sourcesContent":["import { OktaAuth } from \"@okta/okta-auth-js\";\nimport { createAbstraction } from \"@webiny/feature/admin\";\n\nexport type IOnLogin = (oktaAuth: OktaAuth) => void;\n\nexport interface IOktaPresenter {\n vm: {\n isAuthenticated: boolean;\n isLoggingIn: boolean;\n checkingSession: boolean;\n };\n init(params: IOktaInitParams): Promise<void>;\n authenticate(): void;\n}\n\nexport interface IOktaInitParams {\n issuer: string;\n clientId: string;\n autoLogin: boolean;\n}\n\nexport const OktaPresenter = createAbstraction<IOktaPresenter>(\"OktaPresenter\");\n\nexport namespace OktaPresenter {\n export type Interface = IOktaPresenter;\n export type InitParams = IOktaInitParams;\n export type OnLogin = IOnLogin;\n}\n"],"mappings":"AACA,SAASA,iBAAiB,QAAQ,uBAAuB;AAoBzD,OAAO,MAAMC,aAAa,GAAGD,iBAAiB,CAAiB,eAAe,CAAC","ignoreList":[]}
@@ -0,0 +1,3 @@
1
+ export declare const OktaFeature: import("@webiny/feature/admin").FeatureDefinition<{
2
+ presenter: import("./abstractions.js").IOktaPresenter;
3
+ }, []>;
@@ -0,0 +1,16 @@
1
+ import { createFeature } from "@webiny/feature/admin";
2
+ import { OktaPresenter } from "./OktaPresenter.js";
3
+ import { OktaPresenter as Presenter } from "./abstractions.js";
4
+ export const OktaFeature = createFeature({
5
+ name: "Okta",
6
+ register(container) {
7
+ container.register(OktaPresenter).inSingletonScope();
8
+ },
9
+ resolve(container) {
10
+ return {
11
+ presenter: container.resolve(Presenter)
12
+ };
13
+ }
14
+ });
15
+
16
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createFeature","OktaPresenter","Presenter","OktaFeature","name","register","container","inSingletonScope","resolve","presenter"],"sources":["feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { OktaPresenter } from \"./OktaPresenter.js\";\nimport { OktaPresenter as Presenter } from \"./abstractions.js\";\n\nexport const OktaFeature = createFeature({\n name: \"Okta\",\n register(container) {\n container.register(OktaPresenter).inSingletonScope();\n },\n resolve(container) {\n return {\n presenter: container.resolve(Presenter)\n };\n }\n});\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,uBAAuB;AACrD,SAASC,aAAa;AACtB,SAASA,aAAa,IAAIC,SAAS;AAEnC,OAAO,MAAMC,WAAW,GAAGH,aAAa,CAAC;EACrCI,IAAI,EAAE,MAAM;EACZC,QAAQA,CAACC,SAAS,EAAE;IAChBA,SAAS,CAACD,QAAQ,CAACJ,aAAa,CAAC,CAACM,gBAAgB,CAAC,CAAC;EACxD,CAAC;EACDC,OAAOA,CAACF,SAAS,EAAE;IACf,OAAO;MACHG,SAAS,EAAEH,SAAS,CAACE,OAAO,CAACN,SAAS;IAC1C,CAAC;EACL;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1 @@
1
+ export { OktaPresenter } from "./abstractions.js";
@@ -0,0 +1,3 @@
1
+ export { OktaPresenter } from "./abstractions.js";
2
+
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["OktaPresenter"],"sources":["index.ts"],"sourcesContent":["export { OktaPresenter } from \"./abstractions.js\";\n"],"mappings":"AAAA,SAASA,aAAa","ignoreList":[]}
@@ -0,0 +1,15 @@
1
+ import { OidcIdentityProvider } from "@webiny/api-core/idp";
2
+ import { OktaIdpConfig } from "./abstractions.js";
3
+ declare class OktaIdentityProviderImpl implements OidcIdentityProvider.Interface {
4
+ private config;
5
+ issuer: string;
6
+ clientId: string;
7
+ constructor(config: OktaIdpConfig.Interface);
8
+ isApplicable(token: OidcIdentityProvider.JwtPayload): boolean;
9
+ getIdentity(jwt: OidcIdentityProvider.JwtPayload): Promise<OidcIdentityProvider.IdentityData>;
10
+ verifyTokenClaims(token: OidcIdentityProvider.JwtPayload): Promise<void>;
11
+ }
12
+ export declare const OktaIIdentityProvider: typeof OktaIdentityProviderImpl & {
13
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/idp/abstractions.js").IOidcIdentityProvider>;
14
+ };
15
+ export {};
@@ -0,0 +1,38 @@
1
+ import { OidcIdentityProvider } from "@webiny/api-core/idp";
2
+ import { OktaIdpConfig } from "./abstractions.js";
3
+ class OktaIdentityProviderImpl {
4
+ issuer = String(process.env.OKTA_ISSUER);
5
+ clientId = String(process.env.OKTA_CLIENT_ID);
6
+ constructor(config) {
7
+ this.config = config;
8
+ }
9
+ isApplicable(token) {
10
+ const issuer = token.iss;
11
+ if (!issuer) {
12
+ return false;
13
+ }
14
+ return new URL(issuer).hostname.endsWith(".okta.com") ?? false;
15
+ }
16
+ async getIdentity(jwt) {
17
+ const identity = await this.config.getIdentity(jwt);
18
+ return {
19
+ ...identity,
20
+ type: "admin",
21
+ profile: {
22
+ ...identity.profile,
23
+ external: true
24
+ }
25
+ };
26
+ }
27
+ async verifyTokenClaims(token) {
28
+ if (this.config.verifyTokenClaims) {
29
+ await this.config.verifyTokenClaims(token);
30
+ }
31
+ }
32
+ }
33
+ export const OktaIIdentityProvider = OidcIdentityProvider.createImplementation({
34
+ implementation: OktaIdentityProviderImpl,
35
+ dependencies: [OktaIdpConfig]
36
+ });
37
+
38
+ //# sourceMappingURL=OktaIIdentityProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["OidcIdentityProvider","OktaIdpConfig","OktaIdentityProviderImpl","issuer","String","process","env","OKTA_ISSUER","clientId","OKTA_CLIENT_ID","constructor","config","isApplicable","token","iss","URL","hostname","endsWith","getIdentity","jwt","identity","type","profile","external","verifyTokenClaims","OktaIIdentityProvider","createImplementation","implementation","dependencies"],"sources":["OktaIIdentityProvider.ts"],"sourcesContent":["import { OidcIdentityProvider } from \"@webiny/api-core/idp\";\nimport { OktaIdpConfig } from \"./abstractions.js\";\n\nclass OktaIdentityProviderImpl implements OidcIdentityProvider.Interface {\n public issuer = String(process.env.OKTA_ISSUER);\n public clientId = String(process.env.OKTA_CLIENT_ID);\n\n constructor(private config: OktaIdpConfig.Interface) {}\n\n isApplicable(token: OidcIdentityProvider.JwtPayload) {\n const issuer = token.iss as string;\n if (!issuer) {\n return false;\n }\n\n return new URL(issuer).hostname.endsWith(\".okta.com\") ?? false;\n }\n\n async getIdentity(\n jwt: OidcIdentityProvider.JwtPayload\n ): Promise<OidcIdentityProvider.IdentityData> {\n const identity = await this.config.getIdentity(jwt);\n\n return {\n ...identity,\n type: \"admin\",\n profile: {\n ...identity.profile,\n external: true\n }\n };\n }\n\n async verifyTokenClaims(token: OidcIdentityProvider.JwtPayload): Promise<void> {\n if (this.config.verifyTokenClaims) {\n await this.config.verifyTokenClaims(token);\n }\n }\n}\n\nexport const OktaIIdentityProvider = OidcIdentityProvider.createImplementation({\n implementation: OktaIdentityProviderImpl,\n dependencies: [OktaIdpConfig]\n});\n"],"mappings":"AAAA,SAASA,oBAAoB,QAAQ,sBAAsB;AAC3D,SAASC,aAAa;AAEtB,MAAMC,wBAAwB,CAA2C;EAC9DC,MAAM,GAAGC,MAAM,CAACC,OAAO,CAACC,GAAG,CAACC,WAAW,CAAC;EACxCC,QAAQ,GAAGJ,MAAM,CAACC,OAAO,CAACC,GAAG,CAACG,cAAc,CAAC;EAEpDC,WAAWA,CAASC,MAA+B,EAAE;IAAA,KAAjCA,MAA+B,GAA/BA,MAA+B;EAAG;EAEtDC,YAAYA,CAACC,KAAsC,EAAE;IACjD,MAAMV,MAAM,GAAGU,KAAK,CAACC,GAAa;IAClC,IAAI,CAACX,MAAM,EAAE;MACT,OAAO,KAAK;IAChB;IAEA,OAAO,IAAIY,GAAG,CAACZ,MAAM,CAAC,CAACa,QAAQ,CAACC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK;EAClE;EAEA,MAAMC,WAAWA,CACbC,GAAoC,EACM;IAC1C,MAAMC,QAAQ,GAAG,MAAM,IAAI,CAACT,MAAM,CAACO,WAAW,CAACC,GAAG,CAAC;IAEnD,OAAO;MACH,GAAGC,QAAQ;MACXC,IAAI,EAAE,OAAO;MACbC,OAAO,EAAE;QACL,GAAGF,QAAQ,CAACE,OAAO;QACnBC,QAAQ,EAAE;MACd;IACJ,CAAC;EACL;EAEA,MAAMC,iBAAiBA,CAACX,KAAsC,EAAiB;IAC3E,IAAI,IAAI,CAACF,MAAM,CAACa,iBAAiB,EAAE;MAC/B,MAAM,IAAI,CAACb,MAAM,CAACa,iBAAiB,CAACX,KAAK,CAAC;IAC9C;EACJ;AACJ;AAEA,OAAO,MAAMY,qBAAqB,GAAGzB,oBAAoB,CAAC0B,oBAAoB,CAAC;EAC3EC,cAAc,EAAEzB,wBAAwB;EACxC0B,YAAY,EAAE,CAAC3B,aAAa;AAChC,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,15 @@
1
+ import type jwt from "jsonwebtoken";
2
+ import type { IdentityData } from "@webiny/api-core/idp";
3
+ export type OktaIdentity = Omit<IdentityData, "type"> & {
4
+ profile: Omit<IdentityData["profile"], "external">;
5
+ };
6
+ export interface IOktaIdpConfig {
7
+ getIdentity(token: jwt.JwtPayload): Promise<OktaIdentity> | OktaIdentity;
8
+ verifyTokenClaims?(token: jwt.JwtPayload): Promise<void> | void;
9
+ }
10
+ export declare const OktaIdpConfig: import("@webiny/di").Abstraction<IOktaIdpConfig>;
11
+ export declare namespace OktaIdpConfig {
12
+ type Interface = IOktaIdpConfig;
13
+ type IdentityData = OktaIdentity;
14
+ type JwtPayload = jwt.JwtPayload;
15
+ }
@@ -0,0 +1,4 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ export const OktaIdpConfig = createAbstraction("OktaIdpConfig");
3
+
4
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createAbstraction","OktaIdpConfig"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type jwt from \"jsonwebtoken\";\nimport type { IdentityData } from \"@webiny/api-core/idp\";\n\nexport type OktaIdentity = Omit<IdentityData, \"type\"> & {\n profile: Omit<IdentityData[\"profile\"], \"external\">;\n};\n\nexport interface IOktaIdpConfig {\n getIdentity(token: jwt.JwtPayload): Promise<OktaIdentity> | OktaIdentity;\n verifyTokenClaims?(token: jwt.JwtPayload): Promise<void> | void;\n}\n\nexport const OktaIdpConfig = createAbstraction<IOktaIdpConfig>(\"OktaIdpConfig\");\n\nexport namespace OktaIdpConfig {\n export type Interface = IOktaIdpConfig;\n export type IdentityData = OktaIdentity;\n export type JwtPayload = jwt.JwtPayload;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAavD,OAAO,MAAMC,aAAa,GAAGD,iBAAiB,CAAiB,eAAe,CAAC","ignoreList":[]}
@@ -0,0 +1 @@
1
+ export declare const OktaIdpFeature: import("@webiny/feature/api/createFeature.js").FeatureDefinition<unknown>;
@@ -0,0 +1,10 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { OktaIIdentityProvider } from "./OktaIIdentityProvider.js";
3
+ export const OktaIdpFeature = createFeature({
4
+ name: "OktaIdp",
5
+ register(container) {
6
+ container.register(OktaIIdentityProvider).inSingletonScope();
7
+ }
8
+ });
9
+
10
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createFeature","OktaIIdentityProvider","OktaIdpFeature","name","register","container","inSingletonScope"],"sources":["feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { OktaIIdentityProvider } from \"./OktaIIdentityProvider.js\";\n\nexport const OktaIdpFeature = createFeature({\n name: \"OktaIdp\",\n register(container) {\n container.register(OktaIIdentityProvider).inSingletonScope();\n }\n});\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,qBAAqB;AACnD,SAASC,qBAAqB;AAE9B,OAAO,MAAMC,cAAc,GAAGF,aAAa,CAAC;EACxCG,IAAI,EAAE,SAAS;EACfC,QAAQA,CAACC,SAAS,EAAE;IAChBA,SAAS,CAACD,QAAQ,CAACH,qBAAqB,CAAC,CAACK,gBAAgB,CAAC,CAAC;EAChE;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1 @@
1
+ export { OktaIdpConfig } from "./abstractions.js";
@@ -0,0 +1,3 @@
1
+ export { OktaIdpConfig } from "./abstractions.js";
2
+
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["OktaIdpConfig"],"sources":["index.ts"],"sourcesContent":["export { OktaIdpConfig } from \"./abstractions.js\";\n"],"mappings":"AAAA,SAASA,aAAa","ignoreList":[]}
package/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { Okta } from "./Okta.js";
2
+ export { OktaIdpConfig } from "./api/features/OktaIdp/abstractions.js";
package/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { Okta } from "./Okta.js";
2
+ export { OktaIdpConfig } from "./api/features/OktaIdp/abstractions.js";
3
+
4
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Okta","OktaIdpConfig"],"sources":["index.ts"],"sourcesContent":["export { Okta } from \"./Okta.js\";\nexport { OktaIdpConfig } from \"./api/features/OktaIdp/abstractions.js\";\n"],"mappings":"AAAA,SAASA,IAAI;AACb,SAASC,aAAa","ignoreList":[]}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@webiny/okta",
3
+ "version": "0.0.0-unstable.61c048f412",
4
+ "type": "module",
5
+ "sideEffects": false,
6
+ "main": "index.js",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/webiny/webiny-js.git"
10
+ },
11
+ "description": "Security plugins for Okta",
12
+ "author": "Webiny Ltd.",
13
+ "license": "Webiny Enterprise",
14
+ "dependencies": {
15
+ "@okta/okta-auth-js": "7.14.1",
16
+ "@webiny/admin-ui": "0.0.0-unstable.61c048f412",
17
+ "@webiny/api-core": "0.0.0-unstable.61c048f412",
18
+ "@webiny/app": "0.0.0-unstable.61c048f412",
19
+ "@webiny/app-admin": "0.0.0-unstable.61c048f412",
20
+ "@webiny/feature": "0.0.0-unstable.61c048f412",
21
+ "@webiny/project": "0.0.0-unstable.61c048f412",
22
+ "@webiny/project-aws": "0.0.0-unstable.61c048f412",
23
+ "jsonwebtoken": "9.0.3",
24
+ "mobx": "6.15.0",
25
+ "mobx-react-lite": "3.4.3",
26
+ "react": "18.2.0",
27
+ "react-dom": "18.2.0",
28
+ "zod": "3.25.76"
29
+ },
30
+ "devDependencies": {
31
+ "@types/jsonwebtoken": "9.0.10",
32
+ "@types/jwk-to-pem": "2.0.3",
33
+ "@webiny/build-tools": "0.0.0-unstable.61c048f412",
34
+ "rimraf": "6.1.2",
35
+ "typescript": "5.9.3"
36
+ },
37
+ "publishConfig": {
38
+ "access": "public",
39
+ "directory": "dist"
40
+ },
41
+ "gitHead": "61c048f412d6b4aa70c1d105aab21e3fa69730f3"
42
+ }