@equinor/fusion-framework-module-msal-node 4.0.2 → 4.1.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @equinor/fusion-framework-module-msal-node
2
2
 
3
+ ## 4.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 51e6e50: Internal: bump `@azure/msal-node` from `5.0.2` to `5.1.4` and `@azure/msal-node-extensions` from `5.0.2` to `5.1.4`.
8
+
9
+ ## 4.1.0
10
+
11
+ ### Minor Changes
12
+
13
+ - ece8f42: Add `device_code` authentication mode for interactive CLI login.
14
+
15
+ The new `AuthProviderDeviceCode` class prompts the user to visit a URL and enter a code, then exchanges it for tokens. This enables CLI tools to authenticate without a client secret, using the standard MSAL device code flow.
16
+
17
+ Ref: https://github.com/equinor/fusion-framework/issues/1008
18
+
3
19
  ## 4.0.2
4
20
 
5
21
  ### Patch Changes
@@ -80,6 +80,16 @@ export class AuthConfigurator extends BaseConfigBuilder {
80
80
  setAccessToken(token) {
81
81
  this._set('accessToken', token);
82
82
  }
83
+ /**
84
+ * Sets the callback invoked with the device code response during `device_code` authentication.
85
+ *
86
+ * If not set, the default behaviour is `console.log(response.message)`.
87
+ *
88
+ * @param callback - The callback, or `undefined` to restore the default handler.
89
+ */
90
+ setDeviceCodeCallback(callback) {
91
+ this._set('deviceCodeCallback', callback ?? undefined);
92
+ }
83
93
  /**
84
94
  * Prepares and finalizes the authentication configuration before validation and use.
85
95
  *
@@ -140,6 +150,13 @@ export class AuthConfigurator extends BaseConfigBuilder {
140
150
  }
141
151
  break;
142
152
  }
153
+ case 'device_code': {
154
+ // Device code mode requires a valid MSAL client instance
155
+ if (config.client instanceof PublicClientApplication === false) {
156
+ throw new Error('Client is required when mode is device_code');
157
+ }
158
+ break;
159
+ }
143
160
  case 'token_only': {
144
161
  // Token only mode requires a string access token
145
162
  if (typeof config.accessToken !== 'string') {
@@ -1 +1 @@
1
- {"version":3,"file":"AuthConfigurator.js","sourceRoot":"","sources":["../../src/AuthConfigurator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EACL,iBAAiB,GAGlB,MAAM,kCAAkC,CAAC;AAK1C;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,gBAAiB,SAAQ,iBAA6B;IACjE;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,IAAwB;QAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,MAA4B;QACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;;;OAQG;IACH,eAAe,CAAC,QAAgB,EAAE,QAAgB;QAChD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YAC7B,sFAAsF;YACtF,sDAAsD;YACtD,mGAAmG;YACnG,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;YACrE,OAAO,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,IAAY;QACxB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC;IAED;;;;;;OAMG;IACH,eAAe,CAAC,MAA2C;QACzD,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,KAAa;QAC1B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACO,YAAY,CACpB,IAA+B,EAC/B,OAAyC;QAEzC,+EAA+E;QAC/E,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAG,IAAI,CAAC,GAAyC,EAAE,IAAI,CAAC,CAAC;QAC3E,+CAA+C;QAC/C,OAAO,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,cAAc,CAAC,MAAkB;QACrC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,yDAAyD;gBACzD,IAAI,MAAM,CAAC,MAAM,YAAY,uBAAuB,KAAK,KAAK,EAAE,CAAC;oBAC/D,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;gBACjE,CAAC;gBACD,uCAAuC;gBACvC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;oBACnB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;gBACjE,CAAC;gBACD,+BAA+B;gBAC/B,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC3C,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;gBAC3E,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,oDAAoD;gBACpD,IAAI,MAAM,CAAC,MAAM,YAAY,uBAAuB,KAAK,KAAK,EAAE,CAAC;oBAC/D,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBAC5D,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,iDAAiD;gBACjD,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;oBAC3C,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;gBACtE,CAAC;gBACD,MAAM;YACR,CAAC;YACD,gEAAgE;QAClE,CAAC;QACD,oDAAoD;QACpD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"AuthConfigurator.js","sourceRoot":"","sources":["../../src/AuthConfigurator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import { AuthProvider } from './AuthProvider.js';
2
+ import { SilentTokenAcquisitionError } from './error.js';
3
+ /**
4
+ * Authentication provider that uses the OAuth 2.0 device code flow.
5
+ *
6
+ * When an access token cannot be acquired silently, the provider calls
7
+ * `acquireTokenByDeviceCode` and invokes `deviceCodeCallback` with the
8
+ * response containing `userCode`, `verificationUri`, and `message`.
9
+ * The user opens the URL on any device, enters the code, and authenticates.
10
+ * No local HTTP server is required, making this the recommended mode for CLI tools.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const provider = new AuthProviderDeviceCode(msalClient, {
15
+ * deviceCodeCallback: (response) => console.log(response.message),
16
+ * });
17
+ * ```
18
+ *
19
+ * @see AuthProviderInteractive - Browser-based login with a local callback server.
20
+ * @see AuthProvider - Silent-only provider (base class).
21
+ */
22
+ export class AuthProviderDeviceCode extends AuthProvider {
23
+ #deviceCodeCallback;
24
+ /**
25
+ * Creates an instance of `AuthProviderDeviceCode`.
26
+ *
27
+ * @param client - The MSAL `PublicClientApplication` to use for token acquisition.
28
+ * @param options - Configuration options.
29
+ * @param options.deviceCodeCallback - Callback invoked with the device code response.
30
+ * Defaults to printing `response.message` to `console.log`.
31
+ */
32
+ constructor(client, options) {
33
+ super(client);
34
+ this.#deviceCodeCallback =
35
+ options?.deviceCodeCallback ?? ((response) => console.log(response.message));
36
+ }
37
+ /**
38
+ * Acquires an access token for the specified scopes.
39
+ *
40
+ * First attempts silent acquisition using the cached account.
41
+ * If that fails (e.g. no account or new resource requiring consent),
42
+ * falls back to the device code flow — invoking `deviceCodeCallback` so
43
+ * the user can authenticate on any device.
44
+ *
45
+ * @param options - Token request options.
46
+ * @param options.request.scopes - OAuth 2.0 scopes to request.
47
+ * @returns A promise resolving to an `AuthenticationResult`.
48
+ * @throws {@link SilentTokenAcquisitionError} If device code acquisition also fails.
49
+ */
50
+ async acquireToken(options) {
51
+ // Attempt silent acquisition first (uses cached account / refresh token)
52
+ const account = await this.getAccount();
53
+ if (account) {
54
+ try {
55
+ return await this._client.acquireTokenSilent({
56
+ scopes: options.request.scopes,
57
+ account,
58
+ });
59
+ }
60
+ catch {
61
+ // Silent failed — fall through to device code flow below
62
+ }
63
+ }
64
+ // Fall back to device code flow
65
+ try {
66
+ const result = await this._client.acquireTokenByDeviceCode({
67
+ scopes: options.request.scopes,
68
+ deviceCodeCallback: this.#deviceCodeCallback,
69
+ });
70
+ if (!result) {
71
+ throw new SilentTokenAcquisitionError('Device code flow returned no result');
72
+ }
73
+ return result;
74
+ }
75
+ catch (error) {
76
+ throw new SilentTokenAcquisitionError('Device code token acquisition failed', {
77
+ cause: error,
78
+ });
79
+ }
80
+ }
81
+ /**
82
+ * Initiates the device code login flow explicitly.
83
+ *
84
+ * This is equivalent to calling `acquireToken` and is provided to satisfy
85
+ * the `IAuthProvider` contract.
86
+ *
87
+ * @param options - Login options containing the requested scopes.
88
+ * @returns A promise resolving to an `AuthenticationResult`.
89
+ */
90
+ async login(options) {
91
+ return this.acquireToken(options);
92
+ }
93
+ }
94
+ //# sourceMappingURL=AuthProviderDeviceCode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthProviderDeviceCode.js","sourceRoot":"","sources":["../../src/AuthProviderDeviceCode.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAEzD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,sBAAuB,SAAQ,YAAY;IAC7C,mBAAmB,CAA0C;IAEtE;;;;;;;OAOG;IACH,YACE,MAA+B,EAC/B,OAEC;QAED,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,mBAAmB;YACtB,OAAO,EAAE,kBAAkB,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,CAAC;IAED;;;;;;;;;;;;OAYG;IACa,KAAK,CAAC,YAAY,CAAC,OAElC;QACC,yEAAyE;QACzE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;oBAC3C,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;oBAC9B,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,yDAAyD;YAC3D,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC;gBACzD,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;gBAC9B,kBAAkB,EAAE,IAAI,CAAC,mBAAmB;aAC7C,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,2BAA2B,CAAC,qCAAqC,CAAC,CAAC;YAC/E,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,2BAA2B,CAAC,sCAAsC,EAAE;gBAC5E,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACa,KAAK,CAAC,KAAK,CAAC,OAE3B;QACC,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;CACF"}
@@ -103,7 +103,15 @@ export class AuthProviderInteractive extends AuthProvider {
103
103
  if ((await this.getAccount()) === null) {
104
104
  return this.login({ request: { scopes } });
105
105
  }
106
- return super.acquireToken(options);
106
+ try {
107
+ return await super.acquireToken(options);
108
+ }
109
+ catch {
110
+ // Silent acquisition failed (e.g. no cached token for this resource/audience).
111
+ // Fall back to interactive login so the user only needs one browser session
112
+ // rather than seeing an unhandled error or a separate prompted login elsewhere.
113
+ return this.login({ request: { scopes } });
114
+ }
107
115
  }
108
116
  }
109
117
  //# sourceMappingURL=AuthProviderInteractive.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthProviderInteractive.js","sourceRoot":"","sources":["../../src/AuthProviderInteractive.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,WAAW,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,eAAe,GAAG,CAAC,MAAc,EAAU,EAAE,CACjD,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAExF;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAAG,GAA4C,EAAE;IACtE,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAClF,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC,CAAC;AAkBF;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,uBAAwB,SAAQ,YAAY;IACvD,QAAQ,CAAsB;IAE9B,YAAY,MAA+B,EAAE,OAA4B;QACvE,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACI,KAAK,CAAC,KAAK,CAAC,OAA0C;QAC3D,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;QACnC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAE9C,kDAAkD;QAClD,kEAAkE;QAClE,yDAAyD;QACzD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,iBAAiB,EAAE,CAAC;QACpD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;YACpD,MAAM;YACN,WAAW,EAAE,oBAAoB,IAAI,EAAE;YACvC,aAAa,EAAE,SAAS;YACxB,mBAAmB,EAAE,MAAM;SAC5B,CAAC,CAAC;QAEH,uCAAuC;QACvC,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;QAE/B,qCAAqC;QACrC,IAAI,MAAM;YAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QAEhC,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE;YAC5C,YAAY,EAAE,QAAQ;YACtB,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACI,KAAK,CAAC,YAAY,CAAC,OAEzB;QACC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACrD,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;CACF"}
1
+ {"version":3,"file":"AuthProviderInteractive.js","sourceRoot":"","sources":["../../src/AuthProviderInteractive.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,WAAW,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,eAAe,GAAG,CAAC,MAAc,EAAU,EAAE,CACjD,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAExF;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAAG,GAA4C,EAAE;IACtE,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAClF,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC,CAAC;AAkBF;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,uBAAwB,SAAQ,YAAY;IACvD,QAAQ,CAAsB;IAE9B,YAAY,MAA+B,EAAE,OAA4B;QACvE,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACI,KAAK,CAAC,KAAK,CAAC,OAA0C;QAC3D,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;QACnC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAE9C,kDAAkD;QAClD,kEAAkE;QAClE,yDAAyD;QACzD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,iBAAiB,EAAE,CAAC;QACpD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;YACpD,MAAM;YACN,WAAW,EAAE,oBAAoB,IAAI,EAAE;YACvC,aAAa,EAAE,SAAS;YACxB,mBAAmB,EAAE,MAAM;SAC5B,CAAC,CAAC;QAEH,uCAAuC;QACvC,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;QAE/B,qCAAqC;QACrC,IAAI,MAAM;YAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QAEhC,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE;YAC5C,YAAY,EAAE,QAAQ;YACtB,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACI,KAAK,CAAC,YAAY,CAAC,OAEzB;QACC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACrD,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC;YACH,OAAO,MAAM,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,+EAA+E;YAC/E,4EAA4E;YAC5E,gFAAgF;YAChF,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;CACF"}
package/dist/esm/index.js CHANGED
@@ -2,8 +2,9 @@
2
2
  * `@equinor/fusion-framework-module-msal-node` provides Azure AD authentication
3
3
  * for Node.js applications using Microsoft's MSAL library.
4
4
  *
5
- * Supports three authentication modes:
5
+ * Supports four authentication modes:
6
6
  * - **interactive** — browser-based login with a local callback server (CLI tools, development)
7
+ * - **device_code** — prints a short code for the user to enter at a URL; no server needed (**recommended for CLI tools**)
7
8
  * - **silent** — cached credential reuse without user interaction (background services)
8
9
  * - **token_only** — static pre-obtained token passthrough (CI/CD, automation)
9
10
  *
@@ -20,6 +21,7 @@
20
21
  * @packageDocumentation
21
22
  */
22
23
  export { AuthProvider } from './AuthProvider.js';
24
+ export { AuthProviderDeviceCode } from './AuthProviderDeviceCode.js';
23
25
  export { module as authModule } from './module.js';
24
26
  export { enableModule as enableAuthModule } from './enable-module.js';
25
27
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAMjD,OAAO,EAAE,MAAM,IAAI,UAAU,EAAuB,MAAM,aAAa,CAAC;AAExE,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAMrE,OAAO,EAAE,MAAM,IAAI,UAAU,EAAuB,MAAM,aAAa,CAAC;AAExE,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -2,6 +2,7 @@ import { AuthConfigurator } from './AuthConfigurator.js';
2
2
  import { AuthProvider } from './AuthProvider.js';
3
3
  import { AuthTokenProvider } from './AuthTokenProvider.js';
4
4
  import { AuthProviderInteractive } from './AuthProviderInteractive.js';
5
+ import { AuthProviderDeviceCode } from './AuthProviderDeviceCode.js';
5
6
  export const module = {
6
7
  name: 'auth',
7
8
  configure: () => new AuthConfigurator(),
@@ -17,6 +18,10 @@ export const module = {
17
18
  }
18
19
  return new AuthProviderInteractive(client, { server });
19
20
  }
21
+ case 'device_code': {
22
+ const { client, deviceCodeCallback } = config;
23
+ return new AuthProviderDeviceCode(client, { deviceCodeCallback });
24
+ }
20
25
  default:
21
26
  return new AuthProvider(config.client);
22
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/module.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAuBvE,MAAM,CAAC,MAAM,MAAM,GAAmB;IACpC,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,gBAAgB,EAAE;IACvC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEzD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,YAAY;gBACf,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAEnD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;gBAClC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;gBAC3E,CAAC;gBACD,OAAO,IAAI,uBAAuB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACzD,CAAC;YAED;gBACE,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;CACF,CAAC;AAEF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/module.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAwBrE,MAAM,CAAC,MAAM,MAAM,GAAmB;IACpC,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,gBAAgB,EAAE;IACvC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEzD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,YAAY;gBACf,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAEnD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;gBAClC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;gBAC3E,CAAC;gBACD,OAAO,IAAI,uBAAuB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACzD,CAAC;YAED,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAC;gBAC9C,OAAO,IAAI,sBAAsB,CAAC,MAAM,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACpE,CAAC;YAED;gBACE,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;CACF,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -1,3 +1,3 @@
1
1
  // Generated by genversion.
2
- export const version = '4.0.2';
2
+ export const version = '4.1.1';
3
3
  //# sourceMappingURL=version.js.map