angular-simple-oidc
Version:
Angular Library implementing Open Id Connect specification. Code Flow, Refresh Tokens, Session Management, Discovery Document.
49 lines • 6.02 kB
JavaScript
import { Injectable } from '@angular/core';
import { b64utoutf8 } from 'jsrsasign';
/**
* Inspired on https://github.com/damienbod/angular-auth-oidc-client
*/
export class TokenHelperService {
convertTokenClaimToDate(claim) {
if (!claim) {
return null;
}
const date = new Date(0); // The 0 here is the key, which sets the date to the epoch
date.setUTCSeconds(claim);
return date;
}
isTokenExpired(expiresAt) {
return new Date().getTime() > expiresAt;
}
getExpirationFromExpiresIn(expiresIn) {
const now = new Date();
// expires_in = access token expiration in seconds (optional)
// 3.2.2.5. Successful Authentication Response
// https://openid.net/specs/openid-connect-core-1_0.html#TokenResponse
now.setSeconds(now.getSeconds() + expiresIn);
return now;
}
getHeaderFromToken(idToken) {
return this.getTokenSlice(idToken, 0);
}
getPayloadFromToken(idToken) {
return this.getTokenSlice(idToken, 1);
}
getSignatureFromToken(idToken) {
return this.getTokenSlice(idToken, 2);
}
getTokenSlice(idToken, index) {
if (!idToken || idToken.split('.').length !== 3) {
// Quick and dirty validation.
// The caller is expcetd to validate the token properly
return null;
}
const slice = idToken.split('.')[index];
const result = b64utoutf8(slice);
return JSON.parse(result);
}
}
TokenHelperService.decorators = [
{ type: Injectable }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4taGVscGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXNpbXBsZS1vaWRjL2NvcmUvbGliL3Rva2VuLWhlbHBlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUd2Qzs7R0FFRztBQUVILE1BQU0sT0FBTyxrQkFBa0I7SUFFcEIsdUJBQXVCLENBQUMsS0FBYTtRQUN4QyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1IsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMERBQTBEO1FBQ3BGLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLGNBQWMsQ0FBQyxTQUFpQjtRQUNuQyxPQUFPLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBQzVDLENBQUM7SUFFTSwwQkFBMEIsQ0FBQyxTQUFpQjtRQUMvQyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLDZEQUE2RDtRQUM3RCwrQ0FBK0M7UUFDL0Msc0VBQXNFO1FBQ3RFLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVNLGtCQUFrQixDQUFDLE9BQWU7UUFDckMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQXdCLENBQUM7SUFDakUsQ0FBQztJQUVNLG1CQUFtQixDQUFDLE9BQWU7UUFDdEMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQXlCLENBQUM7SUFDbEUsQ0FBQztJQUVNLHFCQUFxQixDQUFDLE9BQWU7UUFDeEMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQVcsQ0FBQztJQUNwRCxDQUFDO0lBRVMsYUFBYSxDQUFDLE9BQWUsRUFBRSxLQUFhO1FBQ2xELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzdDLDhCQUE4QjtZQUM5Qix1REFBdUQ7WUFDdkQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QixDQUFDOzs7WUFoREosVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGI2NHV0b3V0ZjggfSBmcm9tICdqc3JzYXNpZ24nO1xuaW1wb3J0IHsgSWRlbnRpdHlUb2tlbkhlYWRlciwgRGVjb2RlZElkZW50aXR5VG9rZW4gfSBmcm9tICcuL21vZGVscyc7XG5cbi8qKlxuICogSW5zcGlyZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2RhbWllbmJvZC9hbmd1bGFyLWF1dGgtb2lkYy1jbGllbnRcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRva2VuSGVscGVyU2VydmljZSB7XG5cbiAgICBwdWJsaWMgY29udmVydFRva2VuQ2xhaW1Ub0RhdGUoY2xhaW06IG51bWJlcikge1xuICAgICAgICBpZiAoIWNsYWltKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgwKTsgLy8gVGhlIDAgaGVyZSBpcyB0aGUga2V5LCB3aGljaCBzZXRzIHRoZSBkYXRlIHRvIHRoZSBlcG9jaFxuICAgICAgICBkYXRlLnNldFVUQ1NlY29uZHMoY2xhaW0pO1xuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNUb2tlbkV4cGlyZWQoZXhwaXJlc0F0OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpID4gZXhwaXJlc0F0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFeHBpcmF0aW9uRnJvbUV4cGlyZXNJbihleHBpcmVzSW46IG51bWJlcikge1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAvLyBleHBpcmVzX2luID0gYWNjZXNzIHRva2VuIGV4cGlyYXRpb24gaW4gc2Vjb25kcyAob3B0aW9uYWwpXG4gICAgICAgIC8vIDMuMi4yLjUuICBTdWNjZXNzZnVsIEF1dGhlbnRpY2F0aW9uIFJlc3BvbnNlXG4gICAgICAgIC8vIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1jb3JlLTFfMC5odG1sI1Rva2VuUmVzcG9uc2VcbiAgICAgICAgbm93LnNldFNlY29uZHMobm93LmdldFNlY29uZHMoKSArIGV4cGlyZXNJbik7XG4gICAgICAgIHJldHVybiBub3c7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEhlYWRlckZyb21Ub2tlbihpZFRva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5TbGljZShpZFRva2VuLCAwKSBhcyBJZGVudGl0eVRva2VuSGVhZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXlsb2FkRnJvbVRva2VuKGlkVG9rZW46IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlblNsaWNlKGlkVG9rZW4sIDEpIGFzIERlY29kZWRJZGVudGl0eVRva2VuO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTaWduYXR1cmVGcm9tVG9rZW4oaWRUb2tlbjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuU2xpY2UoaWRUb2tlbiwgMikgYXMgc3RyaW5nO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRUb2tlblNsaWNlKGlkVG9rZW46IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAoIWlkVG9rZW4gfHwgaWRUb2tlbi5zcGxpdCgnLicpLmxlbmd0aCAhPT0gMykge1xuICAgICAgICAgICAgLy8gUXVpY2sgYW5kIGRpcnR5IHZhbGlkYXRpb24uXG4gICAgICAgICAgICAvLyBUaGUgY2FsbGVyIGlzIGV4cGNldGQgdG8gdmFsaWRhdGUgdGhlIHRva2VuIHByb3Blcmx5XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNsaWNlID0gaWRUb2tlbi5zcGxpdCgnLicpW2luZGV4XTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYjY0dXRvdXRmOChzbGljZSk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdCk7XG4gICAgfVxufVxuIl19