node-nlp
Version:
Library for NLU (Natural Language Understanding) done in Node.js
95 lines • 3.44 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
/**
* @module botbuilder
*/
/**
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
const request = require("request");
// tslint:disable-next-line:no-var-requires no-require-imports
const getPem = require('rsa-pem-from-mod-exp');
// tslint:disable-next-line:no-var-requires no-require-imports
const base64url = require('base64url');
class OpenIdMetadata {
constructor(url) {
this.lastUpdated = 0;
this.url = url;
}
getKey(keyId) {
return new Promise((resolve, reject) => {
// If keys are more than 5 days old, refresh them
const now = new Date().getTime();
if (this.lastUpdated < (now - 1000 * 60 * 60 * 24 * 5)) {
this.refreshCache((err) => {
if (err) {
//logger.error('Error retrieving OpenId metadata at ' + this.url + ', error: ' + err.toString());
// fall through and return cached key on error
reject(err);
}
// Search the cache even if we failed to refresh
const key = this.findKey(keyId);
resolve(key);
});
}
else {
// Otherwise read from cache
const key = this.findKey(keyId);
resolve(key);
}
});
}
refreshCache(cb) {
const options = {
method: 'GET',
url: this.url,
json: true
};
request(options, (err, response, body) => {
if (!err && (response.statusCode && response.statusCode >= 400 || !body)) {
err = new Error(`Failed to load openID config: ${response.statusCode}`);
}
if (err) {
cb(err);
}
else {
const openIdConfig = body;
const get_key_options = {
method: 'GET',
url: openIdConfig.jwks_uri,
json: true
};
request(get_key_options, (get_key_error, get_key_response, get_key_body) => {
if (!get_key_error && (get_key_response.statusCode && get_key_response.statusCode >= 400 || !get_key_body)) {
get_key_error = new Error(`Failed to load Keys: ${get_key_response.statusCode}`);
}
if (!get_key_error) {
this.lastUpdated = new Date().getTime();
this.keys = get_key_body.keys;
}
cb(get_key_error);
});
}
});
}
findKey(keyId) {
if (!this.keys) {
return null;
}
for (const key of this.keys) {
if (key.kid === keyId) {
if (!key.n || !key.e) {
// Return null for non-RSA keys
return null;
}
const modulus = base64url.toBase64(key.n);
const exponent = key.e;
return { key: getPem(modulus, exponent), endorsements: key.endorsements };
}
}
return null;
}
}
exports.OpenIdMetadata = OpenIdMetadata;
//# sourceMappingURL=openIdMetadata.js.map
;