@pnp/nodejs 2.10.0 → 2.13.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/LICENSE +25 -25
- package/index.d.ts +7 -7
- package/index.js +22 -22
- package/net/adalcertificatefetchclient.d.ts +33 -33
- package/net/adalcertificatefetchclient.js +90 -90
- package/net/adalfetchclient.d.ts +13 -13
- package/net/adalfetchclient.js +49 -49
- package/net/bearertokenfetchclient.d.ts +11 -11
- package/net/bearertokenfetchclient.js +30 -30
- package/net/fetch.d.ts +1 -1
- package/net/fetch.js +6 -6
- package/net/index.d.ts +12 -12
- package/net/index.js +6 -6
- package/net/msalfetchclient.d.ts +9 -9
- package/net/msalfetchclient.js +32 -32
- package/net/nodefetchclient.d.ts +23 -23
- package/net/nodefetchclient.js +117 -117
- package/net/proxy.d.ts +17 -17
- package/net/proxy.js +28 -28
- package/net/spfetchclient.d.ts +21 -21
- package/net/spfetchclient.js +110 -110
- package/package.json +5 -5
- package/providerhosted.d.ts +15 -15
- package/providerhosted.js +62 -62
- package/readme.md +21 -21
- package/sp-extensions/index.d.ts +2 -2
- package/sp-extensions/index.js +2 -2
- package/sp-extensions/stream.d.ts +29 -29
- package/sp-extensions/stream.d.ts.map +1 -1
- package/sp-extensions/stream.js +103 -106
- package/sp-extensions/stream.js.map +1 -1
- package/sptokenutils.d.ts +11 -11
- package/sptokenutils.js +111 -111
- package/types.d.ts +33 -33
- package/types.js +9 -9
package/sp-extensions/stream.js
CHANGED
|
@@ -1,107 +1,104 @@
|
|
|
1
|
-
import { __awaiter, __extends, __generator } from "tslib";
|
|
2
|
-
import { getGUID, isFunc, stringIsNullOrEmpty } from "@pnp/common";
|
|
3
|
-
import { ODataParser, extendFactory, headers } from "@pnp/odata";
|
|
4
|
-
import { File, Files } from "@pnp/sp/files/index.js";
|
|
5
|
-
import { spPost, odataUrlFrom, escapeQueryStrValue } from "@pnp/sp";
|
|
6
|
-
var StreamParser = /** @class */ (function (_super) {
|
|
7
|
-
__extends(StreamParser, _super);
|
|
8
|
-
function StreamParser() {
|
|
9
|
-
return _super !== null && _super.apply(this, arguments) || this;
|
|
10
|
-
}
|
|
11
|
-
StreamParser.prototype.parseImpl = function (r, resolve) {
|
|
12
|
-
resolve({ body: r.body, knownLength: parseInt(r.headers.get("content-length"), 10) });
|
|
13
|
-
};
|
|
14
|
-
return StreamParser;
|
|
15
|
-
}(ODataParser));
|
|
16
|
-
export { StreamParser };
|
|
17
|
-
extendFactory(File, {
|
|
18
|
-
getStream: function () {
|
|
19
|
-
return this.clone(File, "$value", false).usingParser(new StreamParser())(headers({ "binaryStringResponseBody": "true" }));
|
|
20
|
-
},
|
|
21
|
-
/**
|
|
22
|
-
* Sets the contents of a file using a chunked upload approach. Not supported in batching.
|
|
23
|
-
*
|
|
24
|
-
* @param stream The file to upload (as readable stream)
|
|
25
|
-
* @param progress A callback function which can be used to track the progress of the upload
|
|
26
|
-
* @param chunkSize The size of each file chunks, in bytes (default: 10485760)
|
|
27
|
-
*/
|
|
28
|
-
setStreamContentChunked: function (stream, progress
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
var
|
|
32
|
-
return __generator(this, function (_a) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* @param
|
|
76
|
-
* @param
|
|
77
|
-
* @
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
});
|
|
105
|
-
},
|
|
106
|
-
});
|
|
1
|
+
import { __awaiter, __extends, __generator } from "tslib";
|
|
2
|
+
import { getGUID, isFunc, stringIsNullOrEmpty } from "@pnp/common";
|
|
3
|
+
import { ODataParser, extendFactory, headers } from "@pnp/odata";
|
|
4
|
+
import { File, Files } from "@pnp/sp/files/index.js";
|
|
5
|
+
import { spPost, odataUrlFrom, escapeQueryStrValue } from "@pnp/sp";
|
|
6
|
+
var StreamParser = /** @class */ (function (_super) {
|
|
7
|
+
__extends(StreamParser, _super);
|
|
8
|
+
function StreamParser() {
|
|
9
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
10
|
+
}
|
|
11
|
+
StreamParser.prototype.parseImpl = function (r, resolve) {
|
|
12
|
+
resolve({ body: r.body, knownLength: parseInt(r.headers.get("content-length"), 10) });
|
|
13
|
+
};
|
|
14
|
+
return StreamParser;
|
|
15
|
+
}(ODataParser));
|
|
16
|
+
export { StreamParser };
|
|
17
|
+
extendFactory(File, {
|
|
18
|
+
getStream: function () {
|
|
19
|
+
return this.clone(File, "$value", false).usingParser(new StreamParser())(headers({ "binaryStringResponseBody": "true" }));
|
|
20
|
+
},
|
|
21
|
+
/**
|
|
22
|
+
* Sets the contents of a file using a chunked upload approach. Not supported in batching.
|
|
23
|
+
*
|
|
24
|
+
* @param stream The file to upload (as readable stream)
|
|
25
|
+
* @param progress A callback function which can be used to track the progress of the upload
|
|
26
|
+
* @param chunkSize The size of each file chunks, in bytes (default: 10485760)
|
|
27
|
+
*/
|
|
28
|
+
setStreamContentChunked: function (stream, progress) {
|
|
29
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
30
|
+
var uploadId, blockNumber, promise;
|
|
31
|
+
var _this = this;
|
|
32
|
+
return __generator(this, function (_a) {
|
|
33
|
+
if (!isFunc(progress)) {
|
|
34
|
+
progress = function () { return null; };
|
|
35
|
+
}
|
|
36
|
+
uploadId = getGUID();
|
|
37
|
+
blockNumber = -1;
|
|
38
|
+
promise = Promise.resolve(0);
|
|
39
|
+
return [2 /*return*/, new Promise(function (resolve) {
|
|
40
|
+
stream.on("data", function (chunk) {
|
|
41
|
+
blockNumber += 1;
|
|
42
|
+
if (blockNumber === 0) {
|
|
43
|
+
promise = promise.then(function () {
|
|
44
|
+
progress({ uploadId: uploadId, blockNumber: blockNumber, chunkSize: chunk.length, currentPointer: 0, fileSize: -1, stage: "starting", totalBlocks: -1 });
|
|
45
|
+
return File(_this).startUpload(uploadId, chunk);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
promise = promise.then(function (cp) {
|
|
50
|
+
progress({ uploadId: uploadId, blockNumber: blockNumber, chunkSize: chunk.length, currentPointer: cp, fileSize: -1, stage: "continue", totalBlocks: -1 });
|
|
51
|
+
return File(_this).continueUpload(uploadId, cp, chunk);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
stream.on("end", function () { return __awaiter(_this, void 0, void 0, function () {
|
|
56
|
+
var _this = this;
|
|
57
|
+
return __generator(this, function (_a) {
|
|
58
|
+
progress({ uploadId: uploadId, blockNumber: blockNumber, chunkSize: -1, currentPointer: -1, fileSize: -1, stage: "finishing", totalBlocks: -1 });
|
|
59
|
+
promise.then(function (cp) { return resolve(File(_this).finishUpload(uploadId, cp, Buffer.from([]))); });
|
|
60
|
+
return [2 /*return*/];
|
|
61
|
+
});
|
|
62
|
+
}); });
|
|
63
|
+
})];
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
extendFactory(Files, {
|
|
69
|
+
/**
|
|
70
|
+
* Uploads a file. Not supported for batching
|
|
71
|
+
*
|
|
72
|
+
* @param url The folder-relative url of the file
|
|
73
|
+
* @param content The Blob file content or File readable stream to add
|
|
74
|
+
* @param progress A callback function which can be used to track the progress of the upload
|
|
75
|
+
* @param shouldOverWrite Should a file with the same name in the same location be overwritten? (default: true)
|
|
76
|
+
* @param chunkSize The size of each file slice, in bytes (default: 10485760)
|
|
77
|
+
* @returns The new File and the raw response.
|
|
78
|
+
*/
|
|
79
|
+
// @tag("fis.addChunked")
|
|
80
|
+
addChunked: function (url, content, progress, shouldOverWrite, chunkSize) {
|
|
81
|
+
if (shouldOverWrite === void 0) { shouldOverWrite = true; }
|
|
82
|
+
if (chunkSize === void 0) { chunkSize = 10485760; }
|
|
83
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
84
|
+
var response, odataUrl, file;
|
|
85
|
+
return __generator(this, function (_a) {
|
|
86
|
+
switch (_a.label) {
|
|
87
|
+
case 0: return [4 /*yield*/, spPost(this.clone(Files, "add(overwrite=" + shouldOverWrite + ",url='" + escapeQueryStrValue(url) + "')", false))];
|
|
88
|
+
case 1:
|
|
89
|
+
response = _a.sent();
|
|
90
|
+
odataUrl = odataUrlFrom(response);
|
|
91
|
+
if (!stringIsNullOrEmpty(odataUrl) && /%27/i.test(odataUrl)) {
|
|
92
|
+
odataUrl = odataUrl.replace(/%27/ig, "''");
|
|
93
|
+
}
|
|
94
|
+
file = File(odataUrl);
|
|
95
|
+
if ("function" === typeof content.read) {
|
|
96
|
+
return [2 /*return*/, file.setStreamContentChunked(content, progress, chunkSize)];
|
|
97
|
+
}
|
|
98
|
+
return [2 /*return*/, file.setContentChunked(content, progress, chunkSize)];
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
},
|
|
103
|
+
});
|
|
107
104
|
//# sourceMappingURL=stream.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../../packages/nodejs/sp-extensions/stream.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,KAAK,EAA8D,MAAM,wBAAwB,CAAC;AACjH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../../packages/nodejs/sp-extensions/stream.ts"],"names":[],"mappings":"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"}
|
package/sptokenutils.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { ITypedHash } from "@pnp/common";
|
|
2
|
-
import { AuthToken } from "./types.js";
|
|
3
|
-
export declare function validateProviderHostedRequestToken(requestToken: string, clientSecret: string): Promise<ITypedHash<string>>;
|
|
4
|
-
/**
|
|
5
|
-
* Gets an add-in only authentication token based on the supplied site url, client id and secret
|
|
6
|
-
*/
|
|
7
|
-
export declare function getAddInOnlyAccessToken(siteUrl: string, clientId: string, clientSecret: string, realm: string, stsUri: string): Promise<AuthToken>;
|
|
8
|
-
/**
|
|
9
|
-
* Gets a user authentication token based on the supplied site url, client id, client secret, and refresh token
|
|
10
|
-
*/
|
|
11
|
-
export declare function getUserAccessToken(siteUrl: string, clientId: string, clientSecret: string, refreshToken: string, realm: string, stsUri: string, cacheKey: string): Promise<AuthToken>;
|
|
1
|
+
import { ITypedHash } from "@pnp/common";
|
|
2
|
+
import { AuthToken } from "./types.js";
|
|
3
|
+
export declare function validateProviderHostedRequestToken(requestToken: string, clientSecret: string): Promise<ITypedHash<string>>;
|
|
4
|
+
/**
|
|
5
|
+
* Gets an add-in only authentication token based on the supplied site url, client id and secret
|
|
6
|
+
*/
|
|
7
|
+
export declare function getAddInOnlyAccessToken(siteUrl: string, clientId: string, clientSecret: string, realm: string, stsUri: string): Promise<AuthToken>;
|
|
8
|
+
/**
|
|
9
|
+
* Gets a user authentication token based on the supplied site url, client id, client secret, and refresh token
|
|
10
|
+
*/
|
|
11
|
+
export declare function getUserAccessToken(siteUrl: string, clientId: string, clientSecret: string, refreshToken: string, realm: string, stsUri: string, cacheKey: string): Promise<AuthToken>;
|
|
12
12
|
//# sourceMappingURL=sptokenutils.d.ts.map
|
package/sptokenutils.js
CHANGED
|
@@ -1,112 +1,112 @@
|
|
|
1
|
-
import { __awaiter, __generator } from "tslib";
|
|
2
|
-
import { parse } from "url";
|
|
3
|
-
import * as jwt from "jsonwebtoken";
|
|
4
|
-
import { SharePointServicePrincipal } from "./types.js";
|
|
5
|
-
import { fetch } from "./net/fetch.js";
|
|
6
|
-
var MapCacheManager = /** @class */ (function () {
|
|
7
|
-
function MapCacheManager() {
|
|
8
|
-
this.map = new Map();
|
|
9
|
-
}
|
|
10
|
-
MapCacheManager.prototype.getAccessToken = function (realm, cacheKey) {
|
|
11
|
-
return this.map.get(this.buildKey(realm, cacheKey));
|
|
12
|
-
};
|
|
13
|
-
MapCacheManager.prototype.setAccessToken = function (realm, cacheKey, token) {
|
|
14
|
-
this.map.set(this.buildKey(realm, cacheKey), token);
|
|
15
|
-
};
|
|
16
|
-
MapCacheManager.prototype.buildKey = function (realm, cacheKey) {
|
|
17
|
-
return realm + ":" + cacheKey;
|
|
18
|
-
};
|
|
19
|
-
return MapCacheManager;
|
|
20
|
-
}());
|
|
21
|
-
var tokenCache = new MapCacheManager();
|
|
22
|
-
export function validateProviderHostedRequestToken(requestToken, clientSecret) {
|
|
23
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
24
|
-
return __generator(this, function (_a) {
|
|
25
|
-
return [2 /*return*/, new Promise(function (resolve, reject) {
|
|
26
|
-
var secret = Buffer.from(clientSecret, "base64");
|
|
27
|
-
jwt.verify(requestToken, secret, function (err, decoded) {
|
|
28
|
-
if (err) {
|
|
29
|
-
return reject(err);
|
|
30
|
-
}
|
|
31
|
-
resolve(decoded);
|
|
32
|
-
});
|
|
33
|
-
})];
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Gets an add-in only authentication token based on the supplied site url, client id and secret
|
|
39
|
-
*/
|
|
40
|
-
export function getAddInOnlyAccessToken(siteUrl, clientId, clientSecret, realm, stsUri) {
|
|
41
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
42
|
-
return __generator(this, function (_a) {
|
|
43
|
-
return [2 /*return*/, getTokenInternal({ siteUrl: siteUrl, clientId: clientId, clientSecret: clientSecret, refreshToken: null, realm: realm, stsUri: stsUri, cacheKey: "addinonly:" + clientId })];
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Gets a user authentication token based on the supplied site url, client id, client secret, and refresh token
|
|
49
|
-
*/
|
|
50
|
-
// eslint-disable-next-line max-len
|
|
51
|
-
export function getUserAccessToken(siteUrl, clientId, clientSecret, refreshToken, realm, stsUri, cacheKey) {
|
|
52
|
-
return getTokenInternal({ siteUrl: siteUrl, clientId: clientId, clientSecret: clientSecret, refreshToken: refreshToken, realm: realm, stsUri: stsUri, cacheKey: "user:" + cacheKey });
|
|
53
|
-
}
|
|
54
|
-
function getTokenInternal(params) {
|
|
55
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
56
|
-
var accessToken, resource, formattedClientId, body, r;
|
|
57
|
-
return __generator(this, function (_a) {
|
|
58
|
-
switch (_a.label) {
|
|
59
|
-
case 0:
|
|
60
|
-
accessToken = tokenCache.getAccessToken(params.realm, params.cacheKey);
|
|
61
|
-
if (accessToken && new Date() < toDate(accessToken.expires_on)) {
|
|
62
|
-
return [2 /*return*/, accessToken];
|
|
63
|
-
}
|
|
64
|
-
resource = getFormattedPrincipal(SharePointServicePrincipal, parse(params.siteUrl).hostname, params.realm);
|
|
65
|
-
formattedClientId = getFormattedPrincipal(params.clientId, "", params.realm);
|
|
66
|
-
body = [];
|
|
67
|
-
if (params.refreshToken) {
|
|
68
|
-
body.push("grant_type=refresh_token");
|
|
69
|
-
body.push("refresh_token=" + encodeURIComponent(params.refreshToken));
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
body.push("grant_type=client_credentials");
|
|
73
|
-
}
|
|
74
|
-
body.push("client_id=" + formattedClientId);
|
|
75
|
-
body.push("client_secret=" + encodeURIComponent(params.clientSecret));
|
|
76
|
-
body.push("resource=" + resource);
|
|
77
|
-
return [4 /*yield*/, fetch(params.stsUri, {
|
|
78
|
-
body: body.join("&"),
|
|
79
|
-
headers: {
|
|
80
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
81
|
-
},
|
|
82
|
-
method: "POST",
|
|
83
|
-
})];
|
|
84
|
-
case 1:
|
|
85
|
-
r = _a.sent();
|
|
86
|
-
return [4 /*yield*/, r.json()];
|
|
87
|
-
case 2:
|
|
88
|
-
accessToken = _a.sent();
|
|
89
|
-
tokenCache.setAccessToken(params.realm, params.cacheKey, accessToken);
|
|
90
|
-
return [2 /*return*/, accessToken];
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
function getFormattedPrincipal(principalName, hostName, realm) {
|
|
96
|
-
var resource = principalName;
|
|
97
|
-
if (hostName !== null && hostName !== "") {
|
|
98
|
-
resource += "/" + hostName;
|
|
99
|
-
}
|
|
100
|
-
resource += "@" + realm;
|
|
101
|
-
return resource;
|
|
102
|
-
}
|
|
103
|
-
function toDate(epoch) {
|
|
104
|
-
var tmp = parseInt(epoch, 10);
|
|
105
|
-
if (tmp < 10000000000) {
|
|
106
|
-
tmp *= 1000;
|
|
107
|
-
}
|
|
108
|
-
var d = new Date();
|
|
109
|
-
d.setTime(tmp);
|
|
110
|
-
return d;
|
|
111
|
-
}
|
|
1
|
+
import { __awaiter, __generator } from "tslib";
|
|
2
|
+
import { parse } from "url";
|
|
3
|
+
import * as jwt from "jsonwebtoken";
|
|
4
|
+
import { SharePointServicePrincipal } from "./types.js";
|
|
5
|
+
import { fetch } from "./net/fetch.js";
|
|
6
|
+
var MapCacheManager = /** @class */ (function () {
|
|
7
|
+
function MapCacheManager() {
|
|
8
|
+
this.map = new Map();
|
|
9
|
+
}
|
|
10
|
+
MapCacheManager.prototype.getAccessToken = function (realm, cacheKey) {
|
|
11
|
+
return this.map.get(this.buildKey(realm, cacheKey));
|
|
12
|
+
};
|
|
13
|
+
MapCacheManager.prototype.setAccessToken = function (realm, cacheKey, token) {
|
|
14
|
+
this.map.set(this.buildKey(realm, cacheKey), token);
|
|
15
|
+
};
|
|
16
|
+
MapCacheManager.prototype.buildKey = function (realm, cacheKey) {
|
|
17
|
+
return realm + ":" + cacheKey;
|
|
18
|
+
};
|
|
19
|
+
return MapCacheManager;
|
|
20
|
+
}());
|
|
21
|
+
var tokenCache = new MapCacheManager();
|
|
22
|
+
export function validateProviderHostedRequestToken(requestToken, clientSecret) {
|
|
23
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
24
|
+
return __generator(this, function (_a) {
|
|
25
|
+
return [2 /*return*/, new Promise(function (resolve, reject) {
|
|
26
|
+
var secret = Buffer.from(clientSecret, "base64");
|
|
27
|
+
jwt.verify(requestToken, secret, function (err, decoded) {
|
|
28
|
+
if (err) {
|
|
29
|
+
return reject(err);
|
|
30
|
+
}
|
|
31
|
+
resolve(decoded);
|
|
32
|
+
});
|
|
33
|
+
})];
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Gets an add-in only authentication token based on the supplied site url, client id and secret
|
|
39
|
+
*/
|
|
40
|
+
export function getAddInOnlyAccessToken(siteUrl, clientId, clientSecret, realm, stsUri) {
|
|
41
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
42
|
+
return __generator(this, function (_a) {
|
|
43
|
+
return [2 /*return*/, getTokenInternal({ siteUrl: siteUrl, clientId: clientId, clientSecret: clientSecret, refreshToken: null, realm: realm, stsUri: stsUri, cacheKey: "addinonly:" + clientId })];
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Gets a user authentication token based on the supplied site url, client id, client secret, and refresh token
|
|
49
|
+
*/
|
|
50
|
+
// eslint-disable-next-line max-len
|
|
51
|
+
export function getUserAccessToken(siteUrl, clientId, clientSecret, refreshToken, realm, stsUri, cacheKey) {
|
|
52
|
+
return getTokenInternal({ siteUrl: siteUrl, clientId: clientId, clientSecret: clientSecret, refreshToken: refreshToken, realm: realm, stsUri: stsUri, cacheKey: "user:" + cacheKey });
|
|
53
|
+
}
|
|
54
|
+
function getTokenInternal(params) {
|
|
55
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
56
|
+
var accessToken, resource, formattedClientId, body, r;
|
|
57
|
+
return __generator(this, function (_a) {
|
|
58
|
+
switch (_a.label) {
|
|
59
|
+
case 0:
|
|
60
|
+
accessToken = tokenCache.getAccessToken(params.realm, params.cacheKey);
|
|
61
|
+
if (accessToken && new Date() < toDate(accessToken.expires_on)) {
|
|
62
|
+
return [2 /*return*/, accessToken];
|
|
63
|
+
}
|
|
64
|
+
resource = getFormattedPrincipal(SharePointServicePrincipal, parse(params.siteUrl).hostname, params.realm);
|
|
65
|
+
formattedClientId = getFormattedPrincipal(params.clientId, "", params.realm);
|
|
66
|
+
body = [];
|
|
67
|
+
if (params.refreshToken) {
|
|
68
|
+
body.push("grant_type=refresh_token");
|
|
69
|
+
body.push("refresh_token=" + encodeURIComponent(params.refreshToken));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
body.push("grant_type=client_credentials");
|
|
73
|
+
}
|
|
74
|
+
body.push("client_id=" + formattedClientId);
|
|
75
|
+
body.push("client_secret=" + encodeURIComponent(params.clientSecret));
|
|
76
|
+
body.push("resource=" + resource);
|
|
77
|
+
return [4 /*yield*/, fetch(params.stsUri, {
|
|
78
|
+
body: body.join("&"),
|
|
79
|
+
headers: {
|
|
80
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
81
|
+
},
|
|
82
|
+
method: "POST",
|
|
83
|
+
})];
|
|
84
|
+
case 1:
|
|
85
|
+
r = _a.sent();
|
|
86
|
+
return [4 /*yield*/, r.json()];
|
|
87
|
+
case 2:
|
|
88
|
+
accessToken = _a.sent();
|
|
89
|
+
tokenCache.setAccessToken(params.realm, params.cacheKey, accessToken);
|
|
90
|
+
return [2 /*return*/, accessToken];
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function getFormattedPrincipal(principalName, hostName, realm) {
|
|
96
|
+
var resource = principalName;
|
|
97
|
+
if (hostName !== null && hostName !== "") {
|
|
98
|
+
resource += "/" + hostName;
|
|
99
|
+
}
|
|
100
|
+
resource += "@" + realm;
|
|
101
|
+
return resource;
|
|
102
|
+
}
|
|
103
|
+
function toDate(epoch) {
|
|
104
|
+
var tmp = parseInt(epoch, 10);
|
|
105
|
+
if (tmp < 10000000000) {
|
|
106
|
+
tmp *= 1000;
|
|
107
|
+
}
|
|
108
|
+
var d = new Date();
|
|
109
|
+
d.setTime(tmp);
|
|
110
|
+
return d;
|
|
111
|
+
}
|
|
112
112
|
//# sourceMappingURL=sptokenutils.js.map
|
package/types.d.ts
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
export declare const SharePointServicePrincipal = "00000003-0000-0ff1-ce00-000000000000";
|
|
2
|
-
export interface AADToken {
|
|
3
|
-
accessToken: string;
|
|
4
|
-
expiresIn: number;
|
|
5
|
-
expiresOn: string | Date;
|
|
6
|
-
isMRRT?: boolean;
|
|
7
|
-
resource: string;
|
|
8
|
-
tokenType: string;
|
|
9
|
-
}
|
|
10
|
-
export declare enum SPOAuthEnv {
|
|
11
|
-
SPO = 0,
|
|
12
|
-
China = 1,
|
|
13
|
-
Germany = 2,
|
|
14
|
-
USDef = 3,
|
|
15
|
-
USGov = 4
|
|
16
|
-
}
|
|
17
|
-
export interface AuthToken {
|
|
18
|
-
token_type: string;
|
|
19
|
-
expires_in: string;
|
|
20
|
-
not_before: string;
|
|
21
|
-
expires_on: string;
|
|
22
|
-
resource: string;
|
|
23
|
-
access_token: string;
|
|
24
|
-
}
|
|
25
|
-
export interface ProviderHostedConfigurationOptions {
|
|
26
|
-
headers: {
|
|
27
|
-
Authorization: string;
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
export interface ITokenCacheManager {
|
|
31
|
-
getAccessToken(realm: string, cacheKey: string): AuthToken;
|
|
32
|
-
setAccessToken(realm: string, cacheKey: string, token: AuthToken): void;
|
|
33
|
-
}
|
|
1
|
+
export declare const SharePointServicePrincipal = "00000003-0000-0ff1-ce00-000000000000";
|
|
2
|
+
export interface AADToken {
|
|
3
|
+
accessToken: string;
|
|
4
|
+
expiresIn: number;
|
|
5
|
+
expiresOn: string | Date;
|
|
6
|
+
isMRRT?: boolean;
|
|
7
|
+
resource: string;
|
|
8
|
+
tokenType: string;
|
|
9
|
+
}
|
|
10
|
+
export declare enum SPOAuthEnv {
|
|
11
|
+
SPO = 0,
|
|
12
|
+
China = 1,
|
|
13
|
+
Germany = 2,
|
|
14
|
+
USDef = 3,
|
|
15
|
+
USGov = 4
|
|
16
|
+
}
|
|
17
|
+
export interface AuthToken {
|
|
18
|
+
token_type: string;
|
|
19
|
+
expires_in: string;
|
|
20
|
+
not_before: string;
|
|
21
|
+
expires_on: string;
|
|
22
|
+
resource: string;
|
|
23
|
+
access_token: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ProviderHostedConfigurationOptions {
|
|
26
|
+
headers: {
|
|
27
|
+
Authorization: string;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export interface ITokenCacheManager {
|
|
31
|
+
getAccessToken(realm: string, cacheKey: string): AuthToken;
|
|
32
|
+
setAccessToken(realm: string, cacheKey: string, token: AuthToken): void;
|
|
33
|
+
}
|
|
34
34
|
//# sourceMappingURL=types.d.ts.map
|
package/types.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export var SharePointServicePrincipal = "00000003-0000-0ff1-ce00-000000000000";
|
|
2
|
-
export var SPOAuthEnv;
|
|
3
|
-
(function (SPOAuthEnv) {
|
|
4
|
-
SPOAuthEnv[SPOAuthEnv["SPO"] = 0] = "SPO";
|
|
5
|
-
SPOAuthEnv[SPOAuthEnv["China"] = 1] = "China";
|
|
6
|
-
SPOAuthEnv[SPOAuthEnv["Germany"] = 2] = "Germany";
|
|
7
|
-
SPOAuthEnv[SPOAuthEnv["USDef"] = 3] = "USDef";
|
|
8
|
-
SPOAuthEnv[SPOAuthEnv["USGov"] = 4] = "USGov";
|
|
9
|
-
})(SPOAuthEnv || (SPOAuthEnv = {}));
|
|
1
|
+
export var SharePointServicePrincipal = "00000003-0000-0ff1-ce00-000000000000";
|
|
2
|
+
export var SPOAuthEnv;
|
|
3
|
+
(function (SPOAuthEnv) {
|
|
4
|
+
SPOAuthEnv[SPOAuthEnv["SPO"] = 0] = "SPO";
|
|
5
|
+
SPOAuthEnv[SPOAuthEnv["China"] = 1] = "China";
|
|
6
|
+
SPOAuthEnv[SPOAuthEnv["Germany"] = 2] = "Germany";
|
|
7
|
+
SPOAuthEnv[SPOAuthEnv["USDef"] = 3] = "USDef";
|
|
8
|
+
SPOAuthEnv[SPOAuthEnv["USGov"] = 4] = "USGov";
|
|
9
|
+
})(SPOAuthEnv || (SPOAuthEnv = {}));
|
|
10
10
|
//# sourceMappingURL=types.js.map
|