UNPKG

angular-simple-oidc

Version:

Angular Library implementing Open Id Connect specification. Code Flow, Refresh Tokens, Session Management, Discovery Document.

100 lines 16.3 kB
import { SimpleOidcError } from './errors'; export class TokenValidationError extends SimpleOidcError { } export class IdentityTokenMalformedError extends TokenValidationError { constructor(context) { super('Identity token format invalid: it needs to have three dots. (header.payload.signature)', 'id-token-invalid-format', context); } } export class JWTKeysMissingError extends TokenValidationError { constructor(context) { super('Provided JWT Keys are empty or invalid', 'jwt-keys-empty', context); } } export class JWTKeysInvalidError extends TokenValidationError { constructor(context) { super('Failed to find a valid key from provided JWT Keys. No key with kty=RSA and use=sig found.', 'jwt-keys-invalid', context); } } export class InvalidSignatureError extends TokenValidationError { constructor(context) { super('Failed to validate signature against any of the JWT keys', 'invalid-signature', context); } } export class SignatureAlgorithmNotSupportedError extends TokenValidationError { constructor(context) { super('Only "RS256" alg is currently supported', 'signature-alg-not-supported', context); } } export class ClaimRequiredError extends TokenValidationError { constructor(claim, context) { super(`Required claim ${claim} is missing`, `missing-claim`, context); } } export class ClaimTypeInvalidError extends TokenValidationError { constructor(claim, expectedType, actualType, context) { super(`Claim ${claim} is expected to be ${expectedType} got ${actualType} instead.`, `invalid-claim-type`, context); } } export class DateClaimInvalidError extends TokenValidationError { constructor(claim, context) { super(`Failed to parse claim ${claim} value into a Date object.`, `invalid-date-claim`, context); } } export class IssuedAtValidationFailedError extends TokenValidationError { constructor(offset, context) { super(`Issued at (iat claim) validation failed. Token was expected to have been issued between ${offset} seconds offset`, `iat-validation-failed`, context); } } export class IssuerValidationFailedError extends TokenValidationError { constructor(identityTokenIssuer, discoveryIssuer, context) { super( // tslint:disable-next-line: max-line-length `Issuer (iss) validation failed. Identity Token's iss (${identityTokenIssuer}) does not match discovery document's issuer (${discoveryIssuer})`, `iss-validation-failed`, context); } } export class AudienceValidationFailedError extends TokenValidationError { constructor(identityTokenAud, clientId, context) { super( // tslint:disable-next-line: max-line-length `Audience (aud) validation failed. Identity Token's aud (${identityTokenAud}) does not include this client's ID (${clientId}). The token may not intended for this client.`, `aud-validation-failed`, context); } } export class TokenExpiredError extends TokenValidationError { constructor(expiration, context) { super(`The token has already expired at ${expiration}`, `token-expired`, context); } } export class AccessTokenHashValidationFailedError extends TokenValidationError { constructor(context) { super(`Access Token Hash (at_hash) validation has failed. at_hash does not match hash of access token`, `access-token-validation-failed`, context); } } export class InvalidStateError extends SimpleOidcError { constructor(context) { super('State returned by IDP does not match local stored state.' + 'Are you performing multiple authorize calls at the same time?', 'invalid-state', context); } } export class InvalidNonceError extends TokenValidationError { constructor(context) { super('Nonce returned by IDP does not match local stored nonce.' + 'Are you performing multiple authorize calls at the same time?', 'invalid-nonce', context); } } export class AuthorizationCallbackFormatError extends SimpleOidcError { constructor(context) { super(`IDP redirected with invalid URL`, `authorize-callback-format`, context); } } export class AuthorizationCallbackMissingParameterError extends SimpleOidcError { constructor(param, context) { super(`IDP redirected with invalid/missing parameters on the URL: ${param}`, `authorize-callback-missing-${param}`, context); } } export class AuthorizationCallbackError extends SimpleOidcError { constructor(error, context) { super(`IDP returned an error after authorization redirection: ${error}`, `authorize-callback-error`, context); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tdmFsaWRhdGlvbi1lcnJvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXNpbXBsZS1vaWRjL2NvcmUvbGliL3Rva2VuLXZhbGlkYXRpb24tZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFM0MsTUFBTSxPQUFnQixvQkFBcUIsU0FBUSxlQUFlO0NBQUk7QUFFdEUsTUFBTSxPQUFPLDJCQUE0QixTQUFRLG9CQUFvQjtJQUNqRSxZQUFZLE9BQVk7UUFDcEIsS0FBSyxDQUNELHdGQUF3RixFQUN4Rix5QkFBeUIsRUFDekIsT0FBTyxDQUNWLENBQUM7SUFDTixDQUFDO0NBQ0o7QUFFRCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsb0JBQW9CO0lBQ3pELFlBQVksT0FBWTtRQUNwQixLQUFLLENBQ0Qsd0NBQXdDLEVBQ3hDLGdCQUFnQixFQUNoQixPQUFPLENBQ1YsQ0FBQztJQUNOLENBQUM7Q0FDSjtBQUVELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxvQkFBb0I7SUFDekQsWUFBWSxPQUFZO1FBQ3BCLEtBQUssQ0FDRCwyRkFBMkYsRUFDM0Ysa0JBQWtCLEVBQ2xCLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztDQUNKO0FBRUQsTUFBTSxPQUFPLHFCQUFzQixTQUFRLG9CQUFvQjtJQUMzRCxZQUFZLE9BQVk7UUFDcEIsS0FBSyxDQUNELDBEQUEwRCxFQUMxRCxtQkFBbUIsRUFDbkIsT0FBTyxDQUNWLENBQUM7SUFDTixDQUFDO0NBQ0o7QUFFRCxNQUFNLE9BQU8sbUNBQW9DLFNBQVEsb0JBQW9CO0lBQ3pFLFlBQVksT0FBWTtRQUNwQixLQUFLLENBQ0QseUNBQXlDLEVBQ3pDLDZCQUE2QixFQUM3QixPQUFPLENBQ1YsQ0FBQztJQUNOLENBQUM7Q0FDSjtBQUVELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxv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O1FBQ25DLEtBQUssQ0FDRCwwREFBMEQsS0FBSyxFQUFFLEVBQ2pFLDBCQUEwQixFQUMxQixPQUFPLENBQ1YsQ0FBQztJQUNOLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNpbXBsZU9pZGNFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRva2VuVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgU2ltcGxlT2lkY0Vycm9yIHsgfVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlUb2tlbk1hbGZvcm1lZEVycm9yIGV4dGVuZHMgVG9rZW5WYWxpZGF0aW9uRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IGFueSkge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgICdJZGVudGl0eSB0b2tlbiBmb3JtYXQgaW52YWxpZDogaXQgbmVlZHMgdG8gaGF2ZSB0aHJlZSBkb3RzLiAoaGVhZGVyLnBheWxvYWQuc2lnbmF0dXJlKScsXG4gICAgICAgICAgICAnaWQtdG9rZW4taW52YWxpZC1mb3JtYXQnLFxuICAgICAgICAgICAgY29udGV4dFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEpXVEtleXNNaXNzaW5nRXJyb3IgZXh0ZW5kcyBUb2tlblZhbGlkYXRpb25FcnJvciB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dDogYW55KSB7XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgICAgJ1Byb3ZpZGVkIEpXVCBLZXlzIGFyZSBlbXB0eSBvciBpbnZhbGlkJyxcbiAgICAgICAgICAgICdqd3Qta2V5cy1lbXB0eScsXG4gICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSldUS2V5c0ludmFsaWRFcnJvciBleHRlbmRzIFRva2VuVmFsaWRhdGlvbkVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBhbnkpIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICAnRmFpbGVkIHRvIGZpbmQgYSB2YWxpZCBrZXkgZnJvbSBwcm92aWRlZCBKV1QgS2V5cy4gTm8ga2V5IHdpdGgga3R5PVJTQSBhbmQgdXNlPXNpZyBmb3VuZC4nLFxuICAgICAgICAgICAgJ2p3dC1rZXlzLWludmFsaWQnLFxuICAgICAgICAgICAgY29udGV4dFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRTaWduYXR1cmVFcnJvciBleHRlbmRzIFRva2VuVmFsaWRhdGlvbkVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBhbnkpIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICAnRmFpbGVkIHRvIHZhbGlkYXRlIHNpZ25hdHVyZSBhZ2FpbnN0IGFueSBvZiB0aGUgSldUIGtleXMnLFxuICAgICAgICAgICAgJ2ludmFsaWQtc2lnbmF0dXJlJyxcbiAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTaWduYXR1cmVBbGdvcml0aG1Ob3RTdXBwb3J0ZWRFcnJvciBleHRlbmRzIFRva2VuVmFsaWRhdGlvbkVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBhbnkpIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICAnT25seSBcIlJTMjU2XCIgYWxnIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQnLFxuICAgICAgICAgICAgJ3NpZ25hdHVyZS1hbGctbm90LXN1cHBvcnRlZCcsXG4gICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xhaW1SZXF1aXJlZEVycm9yIGV4dGVuZHMgVG9rZW5WYWxpZGF0aW9uRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNsYWltOiBzdHJpbmcsIGNvbnRleHQ6IGFueSkge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgIGBSZXF1aXJlZCBjbGFpbSAke2NsYWltfSBpcyBtaXNzaW5nYCxcbiAgICAgICAgICAgIGBtaXNzaW5nLWNsYWltYCxcbiAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGFpbVR5cGVJbnZhbGlkRXJyb3IgZXh0ZW5kcyBUb2tlblZhbGlkYXRpb25FcnJvciB7XG4gICAgY29uc3RydWN0b3IoY2xhaW06IHN0cmluZywgZXhwZWN0ZWRUeXBlOiBzdHJpbmcsIGFjdHVhbFR5cGU6IHN0cmluZywgY29udGV4dDogYW55KSB7XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgICAgYENsYWltICR7Y2xhaW19IGlzIGV4cGVjdGVkIHRvIGJlICR7ZXhwZWN0ZWRUeXBlfSBnb3QgJHthY3R1YWxUeXBlfSBpbnN0ZWFkLmAsXG4gICAgICAgICAgICBgaW52YWxpZC1jbGFpbS10eXBlYCxcbiAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRlQ2xhaW1JbnZhbGlkRXJyb3IgZXh0ZW5kcyBUb2tlblZhbGlkYXRpb25FcnJvciB7XG4gICAgY29uc3RydWN0b3IoY2xhaW06IHN0cmluZywgY29udGV4dDogYW55KSB7XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBwYXJzZSBjbGFpbSAke2NsYWltfSB2YWx1ZSBpbnRvIGEgRGF0ZSBvYmplY3QuYCxcbiAgICAgICAgICAgIGBpbnZhbGlkLWRhdGUtY2xhaW1gLFxuICAgICAgICAgICAgY29udGV4dFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElzc3VlZEF0VmFsaWRhdGlvbkZhaWxlZEVycm9yIGV4dGVuZHMgVG9rZW5WYWxpZGF0aW9uRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG9mZnNldDogbnVtYmVyLCBjb250ZXh0OiBhbnkpIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICBgSXNzdWVkIGF0IChpYXQgY2xhaW0pIHZhbGlkYXRpb24gZmFpbGVkLiBUb2tlbiB3YXMgZXhwZWN0ZWQgdG8gaGF2ZSBiZWVuIGlzc3VlZCBiZXR3ZWVuICR7b2Zmc2V0fSBzZWNvbmRzIG9mZnNldGAsXG4gICAgICAgICAgICBgaWF0LXZhbGlkYXRpb24tZmFpbGVkYCxcbiAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJc3N1ZXJWYWxpZGF0aW9uRmFpbGVkRXJyb3IgZXh0ZW5kcyBUb2tlblZhbGlkYXRpb25FcnJvciB7XG4gICAgY29uc3RydWN0b3IoaWRlbnRpdHlUb2tlbklzc3Vlcjogc3RyaW5nLCBkaXNjb3ZlcnlJc3N1ZXI6IHN0cmluZywgY29udGV4dDogYW55KSB7XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgIGBJc3N1ZXIgKGlzcykgdmFsaWRhdGlvbiBmYWlsZWQuIElkZW50aXR5IFRva2VuJ3MgaXNzICgke2lkZW50aXR5VG9rZW5Jc3N1ZXJ9KSBkb2VzIG5vdCBtYXRjaCBkaXNjb3ZlcnkgZG9jdW1lbnQncyBpc3N1ZXIgKCR7ZGlzY292ZXJ5SXNzdWVyfSlgLFxuICAgICAgICAgICAgYGlzcy12YWxpZGF0aW9uLWZhaWxlZGAsXG4gICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXVkaWVuY2VWYWxpZGF0aW9uRmFpbGVkRXJyb3IgZXh0ZW5kcyBUb2tlblZhbGlkYXRpb25FcnJvciB7XG4gICAgY29uc3RydWN0b3IoaWRlbnRpdHlUb2tlbkF1ZDogc3RyaW5nLCBjbGllbnRJZDogc3RyaW5nLCBjb250ZXh0OiBhbnkpIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgYEF1ZGllbmNlIChhdWQpIHZhbGlkYXRpb24gZmFpbGVkLiBJZGVudGl0eSBUb2tlbidzIGF1ZCAoJHtpZGVudGl0eVRva2VuQXVkfSkgZG9lcyBub3QgaW5jbHVkZSB0aGlzIGNsaWVudCdzIElEICgke2NsaWVudElkfSkuIFRoZSB0b2tlbiBtYXkgbm90IGludGVuZGVkIGZvciB0aGlzIGNsaWVudC5gLFxuICAgICAgICAgICAgYGF1ZC12YWxpZGF0aW9uLWZhaWxlZGAsXG4gICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVG9rZW5FeHBpcmVkRXJyb3IgZXh0ZW5kcyBUb2tlblZhbGlkYXRpb25FcnJvciB7XG4gICAgY29uc3RydWN0b3IoZXhwaXJhdGlvbjogRGF0ZSwgY29udGV4dDogYW55KSB7XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgICAgYFRoZSB0b2tlbiBoYXMgYWxyZWFkeSBleHBpcmVkIGF0ICR7ZXhwaXJhdGlvbn1gLFxuICAgICAgICAgICAgYHRva2VuLWV4cGlyZWRgLFxuICAgICAgICAgICAgY29udGV4dFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjY2Vzc1Rva2VuSGFzaFZhbGlkYXRpb25GYWlsZWRFcnJvciBleHRlbmRzIFRva2VuVmFsaWRhdGlvbkVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBhbnkpIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICBgQWNjZXNzIFRva2VuIEhhc2ggKGF0X2hhc2gpIHZhbGlkYXRpb24gaGFzIGZhaWxlZC4gYXRfaGFzaCBkb2VzIG5vdCBtYXRjaCBoYXNoIG9mIGFjY2VzcyB0b2tlbmAsXG4gICAgICAgICAgICBgYWNjZXNzLXRva2VuLXZhbGlkYXRpb24tZmFpbGVkYCxcbiAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkU3RhdGVFcnJvciBleHRlbmRzIFNpbXBsZU9pZGNFcnJvciB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dDogYW55KSB7XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgICAgJ1N0YXRlIHJldHVybmVkIGJ5IElEUCBkb2VzIG5vdCBtYXRjaCBsb2NhbCBzdG9yZWQgc3RhdGUuJyArXG4gICAgICAgICAgICAnQXJlIHlvdSBwZXJmb3JtaW5nIG11bHRpcGxlIGF1dGhvcml6ZSBjYWxscyBhdCB0aGUgc2FtZSB0aW1lPycsXG4gICAgICAgICAgICAnaW52YWxpZC1zdGF0ZScsXG4gICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZE5vbmNlRXJyb3IgZXh0ZW5kcyBUb2tlblZhbGlkYXRpb25FcnJvciB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dDogYW55KSB7XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgICAgJ05vbmNlIHJldHVybmVkIGJ5IElEUCBkb2VzIG5vdCBtYXRjaCBsb2NhbCBzdG9yZWQgbm9uY2UuJyArXG4gICAgICAgICAgICAnQXJlIHlvdSBwZXJmb3JtaW5nIG11bHRpcGxlIGF1dGhvcml6ZSBjYWxscyBhdCB0aGUgc2FtZSB0aW1lPycsXG4gICAgICAgICAgICAnaW52YWxpZC1ub25jZScsXG4gICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXV0aG9yaXphdGlvbkNhbGxiYWNrRm9ybWF0RXJyb3IgZXh0ZW5kcyBTaW1wbGVPaWRjRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IGFueSkge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgIGBJRFAgcmVkaXJlY3RlZCB3aXRoIGludmFsaWQgVVJMYCxcbiAgICAgICAgICAgIGBhdXRob3JpemUtY2FsbGJhY2stZm9ybWF0YCxcbiAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRob3JpemF0aW9uQ2FsbGJhY2tNaXNzaW5nUGFyYW1ldGVyRXJyb3IgZXh0ZW5kcyBTaW1wbGVPaWRjRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtOiBzdHJpbmcsIGNvbnRleHQ6IGFueSkge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgIGBJRFAgcmVkaXJlY3RlZCB3aXRoIGludmFsaWQvbWlzc2luZyBwYXJhbWV0ZXJzIG9uIHRoZSBVUkw6ICR7cGFyYW19YCxcbiAgICAgICAgICAgIGBhdXRob3JpemUtY2FsbGJhY2stbWlzc2luZy0ke3BhcmFtfWAsXG4gICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXV0aG9yaXphdGlvbkNhbGxiYWNrRXJyb3IgZXh0ZW5kcyBTaW1wbGVPaWRjRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGVycm9yOiBzdHJpbmcsIGNvbnRleHQ6IGFueSkge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgIGBJRFAgcmV0dXJuZWQgYW4gZXJyb3IgYWZ0ZXIgYXV0aG9yaXphdGlvbiByZWRpcmVjdGlvbjogJHtlcnJvcn1gLFxuICAgICAgICAgICAgYGF1dGhvcml6ZS1jYWxsYmFjay1lcnJvcmAsXG4gICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG4gICAgfVxufVxuIl19