@glamtime/oauth-oidc-client
Version:
Secure your Angular app using the latest standards for OpenID Connect & OAuth2. Provides support for token refresh, all modern OIDC Identity Providers and more.
80 lines • 10 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { from } from 'rxjs';
import * as i0 from "@angular/core";
export class OAuthCryptoService {
constructor(_document) {
this._document = _document;
}
generateState() {
let result = '';
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
const crypto = this._getCrypto();
if (crypto) {
let bytes = new Uint8Array(32);
crypto.getRandomValues(bytes);
result = Array.from(bytes, (v) => {
return characters[v % characters.length];
}).join('');
}
return result;
}
/**
* Generate code verifier
* See also: https://tools.ietf.org/html/rfc7636#section-4.1
*/
generatePKCECodeVerifier() {
let result = '';
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';
const crypto = this._getCrypto();
if (crypto) {
let bytes = new Uint8Array(32);
crypto.getRandomValues(bytes);
result = Array.from(bytes, (v) => {
return characters[v % characters.length];
}).join('');
}
return this._base64UrlEncode(result);
}
generatePKCECodeChallenge(codeVerifier) {
const crypto = this._getCrypto();
return from(new Promise((resolve, reject) => {
if (crypto && codeVerifier) {
const bytes = new Uint8Array(codeVerifier.length);
for (let i = 0; i < codeVerifier.length; i++) {
bytes[i] = codeVerifier.charCodeAt(i);
}
crypto.subtle.digest('SHA-256', bytes).then((buffer) => {
const bytesArray = new Uint8Array(buffer);
const s = Array.from(bytesArray, (v) => {
return String.fromCharCode(v);
}).join('');
resolve(this._base64UrlEncode(s));
});
}
else {
reject();
}
}));
}
_getCrypto() {
// support for IE, (window.crypto || window.msCrypto)
return this._document.defaultView.crypto || this._document.defaultView.msCrypto;
}
_base64UrlEncode(str) {
const base64 = self.btoa(str);
return base64
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '');
}
}
OAuthCryptoService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: OAuthCryptoService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
OAuthCryptoService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: OAuthCryptoService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: OAuthCryptoService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgtY3J5cHRvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vYXV0aC1vaWRjLWNsaWVudC9zcmMvbGliL2NyeXB0by9vYXV0aC1jcnlwdG8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLElBQUksRUFBYSxNQUFNLE1BQU0sQ0FBQzs7QUFHdEMsTUFBTSxPQUFPLGtCQUFrQjtJQUU3QixZQUFzQyxTQUFjO1FBQWQsY0FBUyxHQUFULFNBQVMsQ0FBSztJQUNwRCxDQUFDO0lBRU0sYUFBYTtRQUNsQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsTUFBTSxVQUFVLEdBQUcsZ0VBQWdFLENBQUM7UUFFcEYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWpDLElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QixNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDL0IsT0FBTyxVQUFVLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDYjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7O09BR0c7SUFDSSx3QkFBd0I7UUFDN0IsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sVUFBVSxHQUFHLG9FQUFvRSxDQUFDO1FBRXhGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVqQyxJQUFJLE1BQU0sRUFBRTtZQUNWLElBQUksS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUIsTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQy9CLE9BQU8sVUFBVSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0MsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2I7UUFFRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU0seUJBQXlCLENBQUMsWUFBb0I7UUFDbkQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWpDLE9BQU8sSUFBSSxDQUFDLElBQUksT0FBTyxDQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ2xELElBQUksTUFBTSxJQUFJLFlBQVksRUFBRTtnQkFDMUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDNUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZDO2dCQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDckQsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7d0JBQ3JDLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsQ0FBQyxDQUFDLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxNQUFNLEVBQUUsQ0FBQzthQUNWO1FBQ0gsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTyxVQUFVO1FBQ2hCLHNEQUFzRDtRQUN0RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQW1CLENBQUMsUUFBUSxDQUFDO0lBQzNGLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxHQUFXO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsT0FBTyxNQUFNO2FBQ1YsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7YUFDbkIsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7YUFDbkIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2QixDQUFDOzsrR0E1RVUsa0JBQWtCLGtCQUVULFFBQVE7bUhBRmpCLGtCQUFrQjsyRkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVOzswQkFHSSxNQUFNOzJCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtmcm9tLCBPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9BdXRoQ3J5cHRvU2VydmljZSB7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQ6IGFueSkge1xuICB9XG5cbiAgcHVibGljIGdlbmVyYXRlU3RhdGUoKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgY29uc3QgY2hhcmFjdGVycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7XG5cbiAgICBjb25zdCBjcnlwdG8gPSB0aGlzLl9nZXRDcnlwdG8oKTtcblxuICAgIGlmIChjcnlwdG8pIHtcbiAgICAgIGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYnl0ZXMpO1xuICAgICAgcmVzdWx0ID0gQXJyYXkuZnJvbShieXRlcywgKHYpID0+IHtcbiAgICAgICAgcmV0dXJuIGNoYXJhY3RlcnNbdiAlIGNoYXJhY3RlcnMubGVuZ3RoXTtcbiAgICAgIH0pLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgY29kZSB2ZXJpZmllclxuICAgKiBTZWUgYWxzbzogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc2MzYjc2VjdGlvbi00LjFcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZVBLQ0VDb2RlVmVyaWZpZXIoKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgY29uc3QgY2hhcmFjdGVycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS0uX34nO1xuXG4gICAgY29uc3QgY3J5cHRvID0gdGhpcy5fZ2V0Q3J5cHRvKCk7XG5cbiAgICBpZiAoY3J5cHRvKSB7XG4gICAgICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheSgzMik7XG4gICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGJ5dGVzKTtcbiAgICAgIHJlc3VsdCA9IEFycmF5LmZyb20oYnl0ZXMsICh2KSA9PiB7XG4gICAgICAgIHJldHVybiBjaGFyYWN0ZXJzW3YgJSBjaGFyYWN0ZXJzLmxlbmd0aF07XG4gICAgICB9KS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYmFzZTY0VXJsRW5jb2RlKHJlc3VsdCk7XG4gIH1cblxuICBwdWJsaWMgZ2VuZXJhdGVQS0NFQ29kZUNoYWxsZW5nZShjb2RlVmVyaWZpZXI6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgY29uc3QgY3J5cHRvID0gdGhpcy5fZ2V0Q3J5cHRvKCk7XG5cbiAgICByZXR1cm4gZnJvbShuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmIChjcnlwdG8gJiYgY29kZVZlcmlmaWVyKSB7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoY29kZVZlcmlmaWVyLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZVZlcmlmaWVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgYnl0ZXNbaV0gPSBjb2RlVmVyaWZpZXIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgfVxuICAgICAgICBjcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIGJ5dGVzKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBieXRlc0FycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgICBjb25zdCBzID0gQXJyYXkuZnJvbShieXRlc0FycmF5LCAodikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodik7XG4gICAgICAgICAgfSkuam9pbignJyk7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9iYXNlNjRVcmxFbmNvZGUocykpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENyeXB0bygpOiBDcnlwdG8ge1xuICAgIC8vIHN1cHBvcnQgZm9yIElFLCAgKHdpbmRvdy5jcnlwdG8gfHwgd2luZG93Lm1zQ3J5cHRvKVxuICAgIHJldHVybiB0aGlzLl9kb2N1bWVudC5kZWZhdWx0Vmlldy5jcnlwdG8gfHwgKHRoaXMuX2RvY3VtZW50LmRlZmF1bHRWaWV3IGFzIGFueSkubXNDcnlwdG87XG4gIH1cblxuICBwcml2YXRlIF9iYXNlNjRVcmxFbmNvZGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2U2NCA9IHNlbGYuYnRvYShzdHIpO1xuICAgIHJldHVybiBiYXNlNjRcbiAgICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuICAgICAgLnJlcGxhY2UoL1xcLy9nLCAnXycpXG4gICAgICAucmVwbGFjZSgvPS9nLCAnJyk7XG4gIH1cblxufVxuIl19