@conduit-d365/auth 0.1.0 → 0.2.0
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.
- package/dist/AuthProvider.d.ts +8 -1
- package/dist/AuthProvider.d.ts.map +1 -1
- package/dist/AuthProvider.js +15 -2
- package/dist/AuthProvider.js.map +1 -1
- package/dist/useAuth.d.ts.map +1 -1
- package/dist/useAuth.js +10 -9
- package/dist/useAuth.js.map +1 -1
- package/package.json +1 -1
package/dist/AuthProvider.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
/** Context for passing custom scopes from AuthProvider to useAuth */
|
|
3
3
|
export declare const ScopesContext: React.Context<string[] | undefined>;
|
|
4
|
+
/** Context for tracking whether MSAL initialisation is complete */
|
|
5
|
+
export declare const MsalReadyContext: React.Context<boolean>;
|
|
4
6
|
interface AuthProviderProps {
|
|
5
7
|
/** Entra ID app registration client ID */
|
|
6
8
|
clientId: string;
|
|
@@ -17,11 +19,16 @@ interface AuthProviderProps {
|
|
|
17
19
|
* management. All child components can use the useAuth() hook to access
|
|
18
20
|
* the authenticated user.
|
|
19
21
|
*
|
|
22
|
+
* Children are NOT rendered until MSAL has initialised and any pending
|
|
23
|
+
* redirect promise has been processed. This prevents the race condition
|
|
24
|
+
* where ProtectedRoute calls login() before handleRedirectPromise()
|
|
25
|
+
* completes, causing an infinite redirect loop.
|
|
26
|
+
*
|
|
20
27
|
* Usage:
|
|
21
28
|
* <AuthProvider clientId={import.meta.env.VITE_ENTRA_CLIENT_ID}>
|
|
22
29
|
* <App />
|
|
23
30
|
* </AuthProvider>
|
|
24
31
|
*/
|
|
25
|
-
export declare function AuthProvider({ clientId, redirectUri, scopes, children, }: AuthProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
32
|
+
export declare function AuthProvider({ clientId, redirectUri, scopes, children, }: AuthProviderProps): import("react/jsx-runtime").JSX.Element | null;
|
|
26
33
|
export {};
|
|
27
34
|
//# sourceMappingURL=AuthProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../src/AuthProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../src/AuthProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqD,MAAM,OAAO,CAAC;AAa1E,qEAAqE;AACrE,eAAO,MAAM,aAAa,qCAAiD,CAAC;AAE5E,mEAAmE;AACnE,eAAO,MAAM,gBAAgB,wBAAgC,CAAC;AAE9D,UAAU,iBAAiB;IACzB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,WAAW,EACX,MAAM,EACN,QAAQ,GACT,EAAE,iBAAiB,kDAyDnB"}
|
package/dist/AuthProvider.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createContext, useEffect, useRef } from "react";
|
|
2
|
+
import { createContext, useEffect, useRef, useState } from "react";
|
|
3
3
|
import { MsalProvider, } from "@azure/msal-react";
|
|
4
4
|
import { EventType, PublicClientApplication, } from "@azure/msal-browser";
|
|
5
5
|
import { createMsalConfig } from "./authConfig";
|
|
6
6
|
/** Context for passing custom scopes from AuthProvider to useAuth */
|
|
7
7
|
export const ScopesContext = createContext(undefined);
|
|
8
|
+
/** Context for tracking whether MSAL initialisation is complete */
|
|
9
|
+
export const MsalReadyContext = createContext(false);
|
|
8
10
|
/**
|
|
9
11
|
* Wraps the app in an MSAL authentication context.
|
|
10
12
|
*
|
|
@@ -12,6 +14,11 @@ export const ScopesContext = createContext(undefined);
|
|
|
12
14
|
* management. All child components can use the useAuth() hook to access
|
|
13
15
|
* the authenticated user.
|
|
14
16
|
*
|
|
17
|
+
* Children are NOT rendered until MSAL has initialised and any pending
|
|
18
|
+
* redirect promise has been processed. This prevents the race condition
|
|
19
|
+
* where ProtectedRoute calls login() before handleRedirectPromise()
|
|
20
|
+
* completes, causing an infinite redirect loop.
|
|
21
|
+
*
|
|
15
22
|
* Usage:
|
|
16
23
|
* <AuthProvider clientId={import.meta.env.VITE_ENTRA_CLIENT_ID}>
|
|
17
24
|
* <App />
|
|
@@ -19,6 +26,7 @@ export const ScopesContext = createContext(undefined);
|
|
|
19
26
|
*/
|
|
20
27
|
export function AuthProvider({ clientId, redirectUri, scopes, children, }) {
|
|
21
28
|
const msalInstanceRef = useRef(null);
|
|
29
|
+
const [msalReady, setMsalReady] = useState(false);
|
|
22
30
|
if (!msalInstanceRef.current) {
|
|
23
31
|
const config = createMsalConfig({ clientId, redirectUri });
|
|
24
32
|
msalInstanceRef.current = new PublicClientApplication(config);
|
|
@@ -43,9 +51,14 @@ export function AuthProvider({ clientId, redirectUri, scopes, children, }) {
|
|
|
43
51
|
}
|
|
44
52
|
}
|
|
45
53
|
});
|
|
54
|
+
setMsalReady(true);
|
|
46
55
|
};
|
|
47
56
|
init();
|
|
48
57
|
}, [msalInstance]);
|
|
49
|
-
|
|
58
|
+
// Block rendering until MSAL has initialised and processed any redirect
|
|
59
|
+
if (!msalReady) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return (_jsx(MsalProvider, { instance: msalInstance, children: _jsx(MsalReadyContext.Provider, { value: msalReady, children: _jsx(ScopesContext.Provider, { value: scopes, children: children }) }) }));
|
|
50
63
|
}
|
|
51
64
|
//# sourceMappingURL=AuthProvider.js.map
|
package/dist/AuthProvider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthProvider.js","sourceRoot":"","sources":["../src/AuthProvider.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AuthProvider.js","sourceRoot":"","sources":["../src/AuthProvider.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,EACL,YAAY,GAEb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,SAAS,EACT,uBAAuB,GAGxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,qEAAqE;AACrE,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAuB,SAAS,CAAC,CAAC;AAE5E,mEAAmE;AACnE,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAU,KAAK,CAAC,CAAC;AAY9D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,QAAQ,EACR,WAAW,EACX,MAAM,EACN,QAAQ,GACU;IAClB,MAAM,eAAe,GAAG,MAAM,CAAiC,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElD,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3D,eAAe,CAAC,OAAO,GAAG,IAAI,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;IAE7C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;YACtB,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;YAChC,MAAM,YAAY,CAAC,qBAAqB,EAAE,CAAC;YAE3C,iDAAiD;YACjD,IACE,CAAC,YAAY,CAAC,gBAAgB,EAAE;gBAChC,YAAY,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC,EACxC,CAAC;gBACD,YAAY,CAAC,gBAAgB,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,CAAC;YAED,yCAAyC;YACzC,YAAY,CAAC,gBAAgB,CAAC,CAAC,KAAmB,EAAE,EAAE;gBACpD,IACE,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,aAAa;oBAC3C,KAAK,CAAC,OAAO,EACb,CAAC;oBACD,MAAM,MAAM,GAAG,KAAK,CAAC,OAA+B,CAAC;oBACrD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACnB,YAAY,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAChD,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,YAAY,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC,CAAC;QAEF,IAAI,EAAE,CAAC;IACT,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,wEAAwE;IACxE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,KAAC,YAAY,IAAC,QAAQ,EAAE,YAAY,YAClC,KAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,SAAS,YACzC,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,MAAM,YAClC,QAAQ,GACc,GACC,GACf,CAChB,CAAC;AACJ,CAAC"}
|
package/dist/useAuth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../src/useAuth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIxC,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,wCAAwC;IACxC,eAAe,EAAE,OAAO,CAAC;IACzB,yCAAyC;IACzC,SAAS,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,gCAAgC;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,wEAAwE;IACxE,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACvC;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,IAAI,aAAa,
|
|
1
|
+
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../src/useAuth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIxC,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,wCAAwC;IACxC,eAAe,EAAE,OAAO,CAAC;IACzB,yCAAyC;IACzC,SAAS,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,gCAAgC;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,wEAAwE;IACxE,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACvC;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,IAAI,aAAa,CA0DvC"}
|
package/dist/useAuth.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { useContext } from "react";
|
|
1
|
+
import { useContext, useCallback } from "react";
|
|
2
2
|
import { useMsal, useAccount } from "@azure/msal-react";
|
|
3
3
|
import { InteractionRequiredAuthError } from "@azure/msal-browser";
|
|
4
4
|
import { getDefaultScopes } from "./authConfig";
|
|
5
|
-
import { ScopesContext } from "./AuthProvider";
|
|
5
|
+
import { ScopesContext, MsalReadyContext } from "./AuthProvider";
|
|
6
6
|
/**
|
|
7
7
|
* Hook for accessing auth state and operations.
|
|
8
8
|
*
|
|
@@ -16,7 +16,8 @@ import { ScopesContext } from "./AuthProvider";
|
|
|
16
16
|
export function useAuth() {
|
|
17
17
|
const { instance, accounts, inProgress } = useMsal();
|
|
18
18
|
const account = useAccount(accounts[0] ?? null);
|
|
19
|
-
const
|
|
19
|
+
const msalReady = useContext(MsalReadyContext);
|
|
20
|
+
const isLoading = !msalReady || inProgress !== "none";
|
|
20
21
|
const customScopes = useContext(ScopesContext);
|
|
21
22
|
const user = account
|
|
22
23
|
? {
|
|
@@ -26,16 +27,16 @@ export function useAuth() {
|
|
|
26
27
|
displayName: account.name ?? "",
|
|
27
28
|
}
|
|
28
29
|
: null;
|
|
29
|
-
const login = async () => {
|
|
30
|
+
const login = useCallback(async () => {
|
|
30
31
|
const clientId = instance.getConfiguration().auth.clientId;
|
|
31
32
|
await instance.loginRedirect({
|
|
32
33
|
scopes: customScopes ?? getDefaultScopes(clientId),
|
|
33
34
|
});
|
|
34
|
-
};
|
|
35
|
-
const logout = async () => {
|
|
35
|
+
}, [instance, customScopes]);
|
|
36
|
+
const logout = useCallback(async () => {
|
|
36
37
|
await instance.logoutRedirect();
|
|
37
|
-
};
|
|
38
|
-
const getAccessToken = async () => {
|
|
38
|
+
}, [instance]);
|
|
39
|
+
const getAccessToken = useCallback(async () => {
|
|
39
40
|
if (!account) {
|
|
40
41
|
throw new Error("No authenticated account");
|
|
41
42
|
}
|
|
@@ -57,7 +58,7 @@ export function useAuth() {
|
|
|
57
58
|
}
|
|
58
59
|
throw error;
|
|
59
60
|
}
|
|
60
|
-
};
|
|
61
|
+
}, [instance, account, customScopes]);
|
|
61
62
|
return {
|
|
62
63
|
user,
|
|
63
64
|
isAuthenticated: !!account,
|
package/dist/useAuth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuth.js","sourceRoot":"","sources":["../src/useAuth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useAuth.js","sourceRoot":"","sources":["../src/useAuth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAiBjE;;;;;;;;;GASG;AACH,MAAM,UAAU,OAAO;IACrB,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,CAAC;IACrD,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,CAAC,SAAS,IAAI,UAAU,KAAK,MAAM,CAAC;IACtD,MAAM,YAAY,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAE/C,MAAM,IAAI,GAAoB,OAAO;QACnC,CAAC,CAAC;YACE,QAAQ,EAAG,OAAO,CAAC,aAAa,EAAE,GAAc,IAAI,EAAE;YACtD,MAAM,EAAG,OAAO,CAAC,aAAa,EAAE,GAAc,IAAI,EAAE;YACpD,KAAK,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;YAC7B,WAAW,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;SAChC;QACH,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC3D,MAAM,QAAQ,CAAC,aAAa,CAAC;YAC3B,MAAM,EAAE,YAAY,IAAI,gBAAgB,CAAC,QAAQ,CAAC;SACnD,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAE7B,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACpC,MAAM,QAAQ,CAAC,cAAc,EAAE,CAAC;IAClC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,IAAqB,EAAE;QAC7D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC;gBAC/C,MAAM,EAAE,YAAY,IAAI,gBAAgB,CAAC,QAAQ,CAAC;gBAClD,OAAO;aACR,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,WAAW,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,4BAA4B,EAAE,CAAC;gBAClD,wDAAwD;gBACxD,MAAM,QAAQ,CAAC,oBAAoB,CAAC;oBAClC,MAAM,EAAE,YAAY,IAAI,gBAAgB,CAAC,QAAQ,CAAC;oBAClD,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAEtC,OAAO;QACL,IAAI;QACJ,eAAe,EAAE,CAAC,CAAC,OAAO;QAC1B,SAAS;QACT,KAAK;QACL,MAAM;QACN,cAAc;KACf,CAAC;AACJ,CAAC"}
|