UNPKG

@azure/msal-browser

Version:
228 lines (225 loc) 12.8 kB
/*! @azure/msal-browser v2.34.0 2023-03-07 */ 'use strict'; import { AuthToken, CacheRecord, Authority, AccountEntity, IdTokenEntity, ScopeSet, AccessTokenEntity, RefreshTokenEntity, Constants } from '@azure/msal-common'; import { BrowserAuthError } from '../error/BrowserAuthError.js'; /* * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. */ /** * Token cache manager */ var TokenCache = /** @class */ (function () { function TokenCache(configuration, storage, logger, cryptoObj) { this.isBrowserEnvironment = typeof window !== "undefined"; this.config = configuration; this.storage = storage; this.logger = logger; this.cryptoObj = cryptoObj; } // Move getAllAccounts here and cache utility APIs /** * API to load tokens to msal-browser cache. * @param request * @param response * @param options * @returns `AuthenticationResult` for the response that was loaded. */ TokenCache.prototype.loadExternalTokens = function (request, response, options) { this.logger.info("TokenCache - loadExternalTokens called"); if (!response.id_token) { throw BrowserAuthError.createUnableToLoadTokenError("Please ensure server response includes id token."); } var idToken = new AuthToken(response.id_token, this.cryptoObj); var cacheRecord; var authority; if (request.account) { var cacheRecordAccount = this.loadAccount(idToken, request.account.environment, undefined, undefined, request.account.homeAccountId); cacheRecord = new CacheRecord(cacheRecordAccount, this.loadIdToken(idToken, cacheRecordAccount.homeAccountId, request.account.environment, request.account.tenantId), this.loadAccessToken(request, response, cacheRecordAccount.homeAccountId, request.account.environment, request.account.tenantId, options), this.loadRefreshToken(request, response, cacheRecordAccount.homeAccountId, request.account.environment)); } else if (request.authority) { var authorityUrl = Authority.generateAuthority(request.authority, request.azureCloudOptions); var authorityOptions = { protocolMode: this.config.auth.protocolMode, knownAuthorities: this.config.auth.knownAuthorities, cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata, authorityMetadata: this.config.auth.authorityMetadata, skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache, }; authority = new Authority(authorityUrl, this.config.system.networkClient, this.storage, authorityOptions, this.logger); // "clientInfo" from options takes precedence over "clientInfo" in response if (options.clientInfo) { this.logger.trace("TokenCache - homeAccountId from options"); var cacheRecordAccount = this.loadAccount(idToken, authority.hostnameAndPort, options.clientInfo, authority.authorityType); cacheRecord = new CacheRecord(cacheRecordAccount, this.loadIdToken(idToken, cacheRecordAccount.homeAccountId, authority.hostnameAndPort, authority.tenant), this.loadAccessToken(request, response, cacheRecordAccount.homeAccountId, authority.hostnameAndPort, authority.tenant, options), this.loadRefreshToken(request, response, cacheRecordAccount.homeAccountId, authority.hostnameAndPort)); } else if (response.client_info) { this.logger.trace("TokenCache - homeAccountId from response"); var cacheRecordAccount = this.loadAccount(idToken, authority.hostnameAndPort, response.client_info, authority.authorityType); cacheRecord = new CacheRecord(cacheRecordAccount, this.loadIdToken(idToken, cacheRecordAccount.homeAccountId, authority.hostnameAndPort, authority.tenant), this.loadAccessToken(request, response, cacheRecordAccount.homeAccountId, authority.hostnameAndPort, authority.tenant, options), this.loadRefreshToken(request, response, cacheRecordAccount.homeAccountId, authority.hostnameAndPort)); } else { throw BrowserAuthError.createUnableToLoadTokenError("Please provide clientInfo in the response or options."); } } else { throw BrowserAuthError.createUnableToLoadTokenError("Please provide a request with an account or a request with authority."); } return this.generateAuthenticationResult(request, idToken, cacheRecord, authority); }; /** * Helper function to load account to msal-browser cache * @param idToken * @param environment * @param clientInfo * @param authorityType * @param requestHomeAccountId * @returns `AccountEntity` */ TokenCache.prototype.loadAccount = function (idToken, environment, clientInfo, authorityType, requestHomeAccountId) { var homeAccountId; if (requestHomeAccountId) { homeAccountId = requestHomeAccountId; } else if (authorityType !== undefined && clientInfo) { homeAccountId = AccountEntity.generateHomeAccountId(clientInfo, authorityType, this.logger, this.cryptoObj, idToken); } if (!homeAccountId) { throw BrowserAuthError.createUnableToLoadTokenError("Unexpected missing homeAccountId"); } var accountEntity = clientInfo ? AccountEntity.createAccount(clientInfo, homeAccountId, idToken, undefined, undefined, undefined, environment) : AccountEntity.createGenericAccount(homeAccountId, idToken, undefined, undefined, undefined, environment); if (this.isBrowserEnvironment) { this.logger.verbose("TokenCache - loading account"); this.storage.setAccount(accountEntity); return accountEntity; } else { throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only."); } }; /** * Helper function to load id tokens to msal-browser cache * @param idToken * @param homeAccountId * @param environment * @param tenantId * @returns `IdTokenEntity` */ TokenCache.prototype.loadIdToken = function (idToken, homeAccountId, environment, tenantId) { var idTokenEntity = IdTokenEntity.createIdTokenEntity(homeAccountId, environment, idToken.rawToken, this.config.auth.clientId, tenantId); if (this.isBrowserEnvironment) { this.logger.verbose("TokenCache - loading id token"); this.storage.setIdTokenCredential(idTokenEntity); return idTokenEntity; } else { throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only."); } }; /** * Helper function to load access tokens to msal-browser cache * @param request * @param response * @param homeAccountId * @param environment * @param tenantId * @returns `AccessTokenEntity` */ TokenCache.prototype.loadAccessToken = function (request, response, homeAccountId, environment, tenantId, options) { if (!response.access_token) { this.logger.verbose("TokenCache - No access token provided for caching"); return null; } if (!response.expires_in) { throw BrowserAuthError.createUnableToLoadTokenError("Please ensure server response includes expires_in value."); } if (!options.extendedExpiresOn) { throw BrowserAuthError.createUnableToLoadTokenError("Please provide an extendedExpiresOn value in the options."); } var scopes = new ScopeSet(request.scopes).printScopes(); var expiresOn = options.expiresOn || (response.expires_in + new Date().getTime() / 1000); var extendedExpiresOn = options.extendedExpiresOn; var accessTokenEntity = AccessTokenEntity.createAccessTokenEntity(homeAccountId, environment, response.access_token, this.config.auth.clientId, tenantId, scopes, expiresOn, extendedExpiresOn, this.cryptoObj); if (this.isBrowserEnvironment) { this.logger.verbose("TokenCache - loading access token"); this.storage.setAccessTokenCredential(accessTokenEntity); return accessTokenEntity; } else { throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only."); } }; /** * Helper function to load refresh tokens to msal-browser cache * @param request * @param response * @param homeAccountId * @param environment * @returns `RefreshTokenEntity` */ TokenCache.prototype.loadRefreshToken = function (request, response, homeAccountId, environment) { if (!response.refresh_token) { this.logger.verbose("TokenCache - No refresh token provided for caching"); return null; } var refreshTokenEntity = RefreshTokenEntity.createRefreshTokenEntity(homeAccountId, environment, response.refresh_token, this.config.auth.clientId); if (this.isBrowserEnvironment) { this.logger.verbose("TokenCache - loading refresh token"); this.storage.setRefreshTokenCredential(refreshTokenEntity); return refreshTokenEntity; } else { throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only."); } }; /** * Helper function to generate an `AuthenticationResult` for the result. * @param request * @param idTokenObj * @param cacheRecord * @param authority * @returns `AuthenticationResult` */ TokenCache.prototype.generateAuthenticationResult = function (request, idTokenObj, cacheRecord, authority) { var _a, _b, _c; var accessToken = Constants.EMPTY_STRING; var responseScopes = []; var expiresOn = null; var extExpiresOn; if (cacheRecord === null || cacheRecord === void 0 ? void 0 : cacheRecord.accessToken) { accessToken = cacheRecord.accessToken.secret; responseScopes = ScopeSet.fromString(cacheRecord.accessToken.target).asArray(); expiresOn = new Date(Number(cacheRecord.accessToken.expiresOn) * 1000); extExpiresOn = new Date(Number(cacheRecord.accessToken.extendedExpiresOn) * 1000); } var uid = (idTokenObj === null || idTokenObj === void 0 ? void 0 : idTokenObj.claims.oid) || (idTokenObj === null || idTokenObj === void 0 ? void 0 : idTokenObj.claims.sub) || Constants.EMPTY_STRING; var tid = (idTokenObj === null || idTokenObj === void 0 ? void 0 : idTokenObj.claims.tid) || Constants.EMPTY_STRING; return { authority: authority ? authority.canonicalAuthority : Constants.EMPTY_STRING, uniqueId: uid, tenantId: tid, scopes: responseScopes, account: (cacheRecord === null || cacheRecord === void 0 ? void 0 : cacheRecord.account) ? cacheRecord.account.getAccountInfo() : null, idToken: idTokenObj ? idTokenObj.rawToken : Constants.EMPTY_STRING, idTokenClaims: idTokenObj ? idTokenObj.claims : {}, accessToken: accessToken, fromCache: true, expiresOn: expiresOn, correlationId: request.correlationId || Constants.EMPTY_STRING, requestId: Constants.EMPTY_STRING, extExpiresOn: extExpiresOn, familyId: Constants.EMPTY_STRING, tokenType: ((_a = cacheRecord === null || cacheRecord === void 0 ? void 0 : cacheRecord.accessToken) === null || _a === void 0 ? void 0 : _a.tokenType) || Constants.EMPTY_STRING, state: Constants.EMPTY_STRING, cloudGraphHostName: ((_b = cacheRecord === null || cacheRecord === void 0 ? void 0 : cacheRecord.account) === null || _b === void 0 ? void 0 : _b.cloudGraphHostName) || Constants.EMPTY_STRING, msGraphHost: ((_c = cacheRecord === null || cacheRecord === void 0 ? void 0 : cacheRecord.account) === null || _c === void 0 ? void 0 : _c.msGraphHost) || Constants.EMPTY_STRING, code: undefined, fromNativeBroker: false }; }; return TokenCache; }()); export { TokenCache }; //# sourceMappingURL=TokenCache.js.map