@emilgroup/accounting-sdk 1.34.1-beta.47 → 1.34.1-beta.49
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/README.md +2 -2
- package/base.ts +36 -15
- package/configuration.ts +11 -0
- package/dist/base.d.ts +1 -0
- package/dist/base.js +36 -16
- package/dist/configuration.d.ts +9 -0
- package/dist/configuration.js +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,11 +17,11 @@ Although this package can be used in both TypeScript and JavaScript, it is inten
|
|
|
17
17
|
Navigate to the folder of your consuming project and run one of the following commands:
|
|
18
18
|
|
|
19
19
|
```
|
|
20
|
-
npm install @emilgroup/accounting-sdk@1.34.1-beta.
|
|
20
|
+
npm install @emilgroup/accounting-sdk@1.34.1-beta.49 --save
|
|
21
21
|
```
|
|
22
22
|
or
|
|
23
23
|
```
|
|
24
|
-
yarn add @emilgroup/accounting-sdk@1.34.1-beta.
|
|
24
|
+
yarn add @emilgroup/accounting-sdk@1.34.1-beta.49
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
And then you can import `FinancialAccountsApi`.
|
package/base.ts
CHANGED
|
@@ -102,10 +102,14 @@ export class BaseAPI {
|
|
|
102
102
|
this.configuration = configuration;
|
|
103
103
|
this.basePath = configuration.basePath || this.basePath;
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
105
|
+
if (configuration.cookieAuth) {
|
|
106
|
+
this.useCookieAuth();
|
|
107
|
+
} else {
|
|
108
|
+
// Use config token if provided, otherwise use tokenData token
|
|
109
|
+
const configToken = this.configuration.accessToken;
|
|
110
|
+
const storedToken = accessToken ? `Bearer ${accessToken}` : '';
|
|
111
|
+
this.configuration.accessToken = configToken || storedToken;
|
|
112
|
+
}
|
|
109
113
|
} else {
|
|
110
114
|
const { accessToken, username } = this.tokenData;
|
|
111
115
|
|
|
@@ -119,6 +123,12 @@ export class BaseAPI {
|
|
|
119
123
|
this.attachInterceptor(axios);
|
|
120
124
|
}
|
|
121
125
|
|
|
126
|
+
// Cookie mode: the browser sends the HttpOnly access cookie, so no token is read from storage.
|
|
127
|
+
private useCookieAuth() {
|
|
128
|
+
this.configuration.username = this.configuration.username || this.tokenData.username;
|
|
129
|
+
this.configuration.baseOptions = { ...this.configuration.baseOptions, withCredentials: true };
|
|
130
|
+
}
|
|
131
|
+
|
|
122
132
|
selectEnvironment(env: Environment) {
|
|
123
133
|
this.selectBasePath(env);
|
|
124
134
|
}
|
|
@@ -152,10 +162,12 @@ export class BaseAPI {
|
|
|
152
162
|
const { data: { accessToken, permissions } } = response;
|
|
153
163
|
|
|
154
164
|
this.configuration.username = username;
|
|
155
|
-
this.configuration.accessToken = `Bearer ${accessToken}`;
|
|
156
165
|
this.tokenData.username = username;
|
|
157
|
-
this.tokenData.accessToken = accessToken;
|
|
158
166
|
this.tokenData.permissions = permissions;
|
|
167
|
+
if (!this.configuration.cookieAuth) {
|
|
168
|
+
this.configuration.accessToken = `Bearer ${accessToken}`;
|
|
169
|
+
this.tokenData.accessToken = accessToken;
|
|
170
|
+
}
|
|
159
171
|
|
|
160
172
|
// Switch workspace if provided
|
|
161
173
|
if (targetWorkspace) {
|
|
@@ -178,7 +190,7 @@ export class BaseAPI {
|
|
|
178
190
|
url: `${this.configuration.basePath}/authservice/v1/workspaces/switch`,
|
|
179
191
|
headers: {
|
|
180
192
|
'Content-Type': 'application/json',
|
|
181
|
-
'Authorization': `Bearer ${this.configuration.accessToken}
|
|
193
|
+
...(this.configuration.cookieAuth ? {} : { 'Authorization': `Bearer ${this.configuration.accessToken}` }),
|
|
182
194
|
},
|
|
183
195
|
data: {
|
|
184
196
|
username: this.configuration.username,
|
|
@@ -190,10 +202,12 @@ export class BaseAPI {
|
|
|
190
202
|
const response = await globalAxios.request<SwitchWorkspaceResponseClass>(options);
|
|
191
203
|
|
|
192
204
|
const { data: { accessToken, permissions } } = response;
|
|
193
|
-
|
|
194
|
-
this.configuration.accessToken = `Bearer ${accessToken}`;
|
|
195
|
-
this.tokenData.accessToken = accessToken;
|
|
205
|
+
|
|
196
206
|
this.tokenData.permissions = permissions;
|
|
207
|
+
if (!this.configuration.cookieAuth) {
|
|
208
|
+
this.configuration.accessToken = `Bearer ${accessToken}`;
|
|
209
|
+
this.tokenData.accessToken = accessToken;
|
|
210
|
+
}
|
|
197
211
|
|
|
198
212
|
this.storeTokenData({
|
|
199
213
|
...this.tokenData
|
|
@@ -233,6 +247,11 @@ export class BaseAPI {
|
|
|
233
247
|
|
|
234
248
|
private storeTokenData(tokenData?: TokenData) {
|
|
235
249
|
if (typeof window !== 'undefined') {
|
|
250
|
+
if (tokenData && this.configuration?.cookieAuth) {
|
|
251
|
+
// Cookie mode saves who is logged in, never the token; a token saved by apps not yet migrated stays.
|
|
252
|
+
const { username, permissions } = tokenData;
|
|
253
|
+
tokenData = { ...(defaultStorage().get<TokenData>(TOKEN_DATA) || {}), username, permissions };
|
|
254
|
+
}
|
|
236
255
|
defaultStorage().set<TokenData>(TOKEN_DATA, tokenData);
|
|
237
256
|
}
|
|
238
257
|
}
|
|
@@ -263,15 +282,17 @@ export class BaseAPI {
|
|
|
263
282
|
originalConfig._retry = true;
|
|
264
283
|
try {
|
|
265
284
|
const { accessToken: tokenString, permissions } = await this.refreshTokenInternal();
|
|
266
|
-
const accessToken = `Bearer ${tokenString}`;
|
|
267
285
|
this.tokenData.permissions = permissions;
|
|
268
286
|
|
|
269
287
|
delete originalConfig.headers['Authorization']
|
|
270
288
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
289
|
+
// In cookie mode the refresh reply renewed the access cookie, so retry without a header.
|
|
290
|
+
if (!this.configuration.cookieAuth) {
|
|
291
|
+
const accessToken = `Bearer ${tokenString}`;
|
|
292
|
+
originalConfig.headers['Authorization'] = accessToken;
|
|
293
|
+
this.configuration.accessToken = accessToken;
|
|
294
|
+
this.tokenData.accessToken = tokenString;
|
|
295
|
+
}
|
|
275
296
|
|
|
276
297
|
this.storeTokenData(this.tokenData);
|
|
277
298
|
|
package/configuration.ts
CHANGED
|
@@ -21,6 +21,7 @@ export interface ConfigurationParameters {
|
|
|
21
21
|
basePath?: string;
|
|
22
22
|
baseOptions?: any;
|
|
23
23
|
formDataCtor?: new () => any;
|
|
24
|
+
cookieAuth?: boolean;
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
export class Configuration {
|
|
@@ -74,6 +75,15 @@ export class Configuration {
|
|
|
74
75
|
*/
|
|
75
76
|
formDataCtor?: new () => any;
|
|
76
77
|
|
|
78
|
+
/**
|
|
79
|
+
* Authenticate with the HttpOnly access cookie instead of a stored token: every call sends credentials.
|
|
80
|
+
* The browser holds one cookie, so use it with one logged-in account; log out through the auth service.
|
|
81
|
+
*
|
|
82
|
+
* @type {boolean}
|
|
83
|
+
* @memberof Configuration
|
|
84
|
+
*/
|
|
85
|
+
cookieAuth?: boolean;
|
|
86
|
+
|
|
77
87
|
constructor(param: ConfigurationParameters = {}) {
|
|
78
88
|
this.apiKey = param.apiKey;
|
|
79
89
|
this.username = param.username;
|
|
@@ -82,6 +92,7 @@ export class Configuration {
|
|
|
82
92
|
this.basePath = param.basePath;
|
|
83
93
|
this.baseOptions = param.baseOptions;
|
|
84
94
|
this.formDataCtor = param.formDataCtor;
|
|
95
|
+
this.cookieAuth = param.cookieAuth;
|
|
85
96
|
}
|
|
86
97
|
|
|
87
98
|
/**
|
package/dist/base.d.ts
CHANGED
|
@@ -63,6 +63,7 @@ export declare class BaseAPI {
|
|
|
63
63
|
protected configuration: Configuration | undefined;
|
|
64
64
|
private tokenData?;
|
|
65
65
|
constructor(configuration?: Configuration, basePath?: string, axios?: AxiosInstance);
|
|
66
|
+
private useCookieAuth;
|
|
66
67
|
selectEnvironment(env: Environment): void;
|
|
67
68
|
selectBasePath(path: string): void;
|
|
68
69
|
getPermissions(): Array<string>;
|
package/dist/base.js
CHANGED
|
@@ -128,10 +128,15 @@ var BaseAPI = /** @class */ (function () {
|
|
|
128
128
|
var accessToken = this.tokenData.accessToken;
|
|
129
129
|
this.configuration = configuration;
|
|
130
130
|
this.basePath = configuration.basePath || this.basePath;
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
131
|
+
if (configuration.cookieAuth) {
|
|
132
|
+
this.useCookieAuth();
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
// Use config token if provided, otherwise use tokenData token
|
|
136
|
+
var configToken = this.configuration.accessToken;
|
|
137
|
+
var storedToken = accessToken ? "Bearer ".concat(accessToken) : '';
|
|
138
|
+
this.configuration.accessToken = configToken || storedToken;
|
|
139
|
+
}
|
|
135
140
|
}
|
|
136
141
|
else {
|
|
137
142
|
var _a = this.tokenData, accessToken = _a.accessToken, username = _a.username;
|
|
@@ -143,6 +148,11 @@ var BaseAPI = /** @class */ (function () {
|
|
|
143
148
|
}
|
|
144
149
|
this.attachInterceptor(axios);
|
|
145
150
|
}
|
|
151
|
+
// Cookie mode: the browser sends the HttpOnly access cookie, so no token is read from storage.
|
|
152
|
+
BaseAPI.prototype.useCookieAuth = function () {
|
|
153
|
+
this.configuration.username = this.configuration.username || this.tokenData.username;
|
|
154
|
+
this.configuration.baseOptions = __assign(__assign({}, this.configuration.baseOptions), { withCredentials: true });
|
|
155
|
+
};
|
|
146
156
|
BaseAPI.prototype.selectEnvironment = function (env) {
|
|
147
157
|
this.selectBasePath(env);
|
|
148
158
|
};
|
|
@@ -177,10 +187,12 @@ var BaseAPI = /** @class */ (function () {
|
|
|
177
187
|
response = _b.sent();
|
|
178
188
|
_a = response.data, accessToken = _a.accessToken, permissions = _a.permissions;
|
|
179
189
|
this.configuration.username = username;
|
|
180
|
-
this.configuration.accessToken = "Bearer ".concat(accessToken);
|
|
181
190
|
this.tokenData.username = username;
|
|
182
|
-
this.tokenData.accessToken = accessToken;
|
|
183
191
|
this.tokenData.permissions = permissions;
|
|
192
|
+
if (!this.configuration.cookieAuth) {
|
|
193
|
+
this.configuration.accessToken = "Bearer ".concat(accessToken);
|
|
194
|
+
this.tokenData.accessToken = accessToken;
|
|
195
|
+
}
|
|
184
196
|
if (!targetWorkspace) return [3 /*break*/, 3];
|
|
185
197
|
return [4 /*yield*/, this.switchWorkspace(targetWorkspace)];
|
|
186
198
|
case 2:
|
|
@@ -206,10 +218,7 @@ var BaseAPI = /** @class */ (function () {
|
|
|
206
218
|
options = {
|
|
207
219
|
method: 'POST',
|
|
208
220
|
url: "".concat(this.configuration.basePath, "/authservice/v1/workspaces/switch"),
|
|
209
|
-
headers: {
|
|
210
|
-
'Content-Type': 'application/json',
|
|
211
|
-
'Authorization': "Bearer ".concat(this.configuration.accessToken),
|
|
212
|
-
},
|
|
221
|
+
headers: __assign({ 'Content-Type': 'application/json' }, (this.configuration.cookieAuth ? {} : { 'Authorization': "Bearer ".concat(this.configuration.accessToken) })),
|
|
213
222
|
data: {
|
|
214
223
|
username: this.configuration.username,
|
|
215
224
|
targetWorkspace: targetWorkspace,
|
|
@@ -220,9 +229,11 @@ var BaseAPI = /** @class */ (function () {
|
|
|
220
229
|
case 1:
|
|
221
230
|
response = _b.sent();
|
|
222
231
|
_a = response.data, accessToken = _a.accessToken, permissions = _a.permissions;
|
|
223
|
-
this.configuration.accessToken = "Bearer ".concat(accessToken);
|
|
224
|
-
this.tokenData.accessToken = accessToken;
|
|
225
232
|
this.tokenData.permissions = permissions;
|
|
233
|
+
if (!this.configuration.cookieAuth) {
|
|
234
|
+
this.configuration.accessToken = "Bearer ".concat(accessToken);
|
|
235
|
+
this.tokenData.accessToken = accessToken;
|
|
236
|
+
}
|
|
226
237
|
this.storeTokenData(__assign({}, this.tokenData));
|
|
227
238
|
return [2 /*return*/];
|
|
228
239
|
}
|
|
@@ -265,7 +276,13 @@ var BaseAPI = /** @class */ (function () {
|
|
|
265
276
|
});
|
|
266
277
|
};
|
|
267
278
|
BaseAPI.prototype.storeTokenData = function (tokenData) {
|
|
279
|
+
var _a;
|
|
268
280
|
if (typeof window !== 'undefined') {
|
|
281
|
+
if (tokenData && ((_a = this.configuration) === null || _a === void 0 ? void 0 : _a.cookieAuth)) {
|
|
282
|
+
// Cookie mode saves who is logged in, never the token; a token saved by apps not yet migrated stays.
|
|
283
|
+
var username = tokenData.username, permissions = tokenData.permissions;
|
|
284
|
+
tokenData = __assign(__assign({}, ((0, common_1.defaultStorage)().get(TOKEN_DATA) || {})), { username: username, permissions: permissions });
|
|
285
|
+
}
|
|
269
286
|
(0, common_1.defaultStorage)().set(TOKEN_DATA, tokenData);
|
|
270
287
|
}
|
|
271
288
|
};
|
|
@@ -300,12 +317,15 @@ var BaseAPI = /** @class */ (function () {
|
|
|
300
317
|
return [4 /*yield*/, this.refreshTokenInternal()];
|
|
301
318
|
case 2:
|
|
302
319
|
_a = _c.sent(), tokenString = _a.accessToken, permissions = _a.permissions;
|
|
303
|
-
accessToken = "Bearer ".concat(tokenString);
|
|
304
320
|
this.tokenData.permissions = permissions;
|
|
305
321
|
delete originalConfig.headers['Authorization'];
|
|
306
|
-
|
|
307
|
-
this.configuration.
|
|
308
|
-
|
|
322
|
+
// In cookie mode the refresh reply renewed the access cookie, so retry without a header.
|
|
323
|
+
if (!this.configuration.cookieAuth) {
|
|
324
|
+
accessToken = "Bearer ".concat(tokenString);
|
|
325
|
+
originalConfig.headers['Authorization'] = accessToken;
|
|
326
|
+
this.configuration.accessToken = accessToken;
|
|
327
|
+
this.tokenData.accessToken = tokenString;
|
|
328
|
+
}
|
|
309
329
|
this.storeTokenData(this.tokenData);
|
|
310
330
|
return [2 /*return*/, axios(originalConfig)];
|
|
311
331
|
case 3:
|
package/dist/configuration.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export interface ConfigurationParameters {
|
|
|
17
17
|
basePath?: string;
|
|
18
18
|
baseOptions?: any;
|
|
19
19
|
formDataCtor?: new () => any;
|
|
20
|
+
cookieAuth?: boolean;
|
|
20
21
|
}
|
|
21
22
|
export declare class Configuration {
|
|
22
23
|
/**
|
|
@@ -68,6 +69,14 @@ export declare class Configuration {
|
|
|
68
69
|
* @type {new () => FormData}
|
|
69
70
|
*/
|
|
70
71
|
formDataCtor?: new () => any;
|
|
72
|
+
/**
|
|
73
|
+
* Authenticate with the HttpOnly access cookie instead of a stored token: every call sends credentials.
|
|
74
|
+
* The browser holds one cookie, so use it with one logged-in account; log out through the auth service.
|
|
75
|
+
*
|
|
76
|
+
* @type {boolean}
|
|
77
|
+
* @memberof Configuration
|
|
78
|
+
*/
|
|
79
|
+
cookieAuth?: boolean;
|
|
71
80
|
constructor(param?: ConfigurationParameters);
|
|
72
81
|
/**
|
|
73
82
|
* Check if the given MIME is a JSON MIME.
|
package/dist/configuration.js
CHANGED
|
@@ -24,6 +24,7 @@ var Configuration = /** @class */ (function () {
|
|
|
24
24
|
this.basePath = param.basePath;
|
|
25
25
|
this.baseOptions = param.baseOptions;
|
|
26
26
|
this.formDataCtor = param.formDataCtor;
|
|
27
|
+
this.cookieAuth = param.cookieAuth;
|
|
27
28
|
}
|
|
28
29
|
/**
|
|
29
30
|
* Check if the given MIME is a JSON MIME.
|