@logto/browser
Advanced tools
Comparing version 0.2.2 to 0.2.3-alpha.0
@@ -1,8 +0,22 @@ | ||
import { IdTokenClaims, Prompt, Requester } from '@logto/js'; | ||
import { Nullable } from '@silverhand/essentials'; | ||
import { Infer } from 'superstruct'; | ||
import { NormalizeKeyPaths, Nullable } from "@silverhand/essentials"; | ||
import { IdTokenClaims, Prompt, Requester } from "@logto/js"; | ||
import { Infer } from "superstruct"; | ||
declare const logtoClientErrorCodes: Readonly<{ | ||
sign_in_session: { | ||
invalid: string; | ||
not_found: string; | ||
}; | ||
not_authenticated: string; | ||
get_access_token_by_refresh_token_failed: string; | ||
invalid_id_token: string; | ||
}>; | ||
export type LogtoClientErrorCode = NormalizeKeyPaths<typeof logtoClientErrorCodes>; | ||
export class LogtoClientError extends Error { | ||
code: LogtoClientErrorCode; | ||
data: unknown; | ||
constructor(code: LogtoClientErrorCode, data?: unknown); | ||
} | ||
export type { IdTokenClaims, LogtoErrorCode } from '@logto/js'; | ||
export { LogtoError, OidcError, Prompt } from '@logto/js'; | ||
export * from './errors'; | ||
export declare type LogtoConfig = { | ||
export type LogtoConfig = { | ||
endpoint: string; | ||
@@ -15,3 +29,3 @@ appId: string; | ||
}; | ||
export declare type AccessToken = { | ||
export type AccessToken = { | ||
token: string; | ||
@@ -21,3 +35,3 @@ scope: string; | ||
}; | ||
export declare const LogtoSignInSessionItemSchema: import("superstruct").Struct<{ | ||
export const LogtoSignInSessionItemSchema: import("superstruct").Struct<{ | ||
redirectUri: string; | ||
@@ -31,13 +45,6 @@ codeVerifier: string; | ||
}>; | ||
export declare type LogtoSignInSessionItem = Infer<typeof LogtoSignInSessionItemSchema>; | ||
export type LogtoSignInSessionItem = Infer<typeof LogtoSignInSessionItemSchema>; | ||
export default class LogtoClient { | ||
protected readonly logtoConfig: LogtoConfig; | ||
protected readonly getOidcConfig: () => Promise<import("@silverhand/essentials").KeysToCamelCase<{ | ||
authorization_endpoint: string; | ||
token_endpoint: string; | ||
end_session_endpoint: string; | ||
revocation_endpoint: string; | ||
jwks_uri: string; | ||
issuer: string; | ||
}>>; | ||
protected readonly getOidcConfig: () => Promise<import("@silverhand/essentials").KeysToCamelCase<import("@logto/js").OidcConfigSnakeCaseResponse>>; | ||
protected readonly getJwtVerifyGetKey: () => Promise<import("jose/dist/types/types").GetKeyFunction<import("jose").JWSHeaderParameters, import("jose").FlattenedJWSInput>>; | ||
@@ -47,4 +54,2 @@ protected readonly logtoStorageKey: string; | ||
protected readonly accessTokenMap: Map<string, AccessToken>; | ||
private readonly getAccessTokenPromiseMap; | ||
private _idToken; | ||
constructor(logtoConfig: LogtoConfig, requester?: <T>(input: RequestInfo, init?: RequestInit | undefined) => Promise<T>); | ||
@@ -64,7 +69,4 @@ get isAuthenticated(): boolean; | ||
signOut(postLogoutRedirectUri?: string): Promise<void>; | ||
private getAccessTokenByRefreshToken; | ||
private _getOidcConfig; | ||
private _getJwtVerifyGetKey; | ||
private verifyIdToken; | ||
private saveCodeToken; | ||
} | ||
//# sourceMappingURL=index.d.ts.map |
357
lib/index.js
@@ -1,47 +0,103 @@ | ||
"use strict"; | ||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||
}) : (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
o[k2] = m[k]; | ||
})); | ||
var __exportStar = (this && this.__exportStar) || function(m, exports) { | ||
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); | ||
var $2FOI4$logtojs = require("@logto/js"); | ||
var $2FOI4$jose = require("jose"); | ||
var $2FOI4$lodashonce = require("lodash.once"); | ||
var $2FOI4$superstruct = require("superstruct"); | ||
var $2FOI4$lodashget = require("lodash.get"); | ||
function $parcel$interopDefault(a) { | ||
return a && a.__esModule ? a.default : a; | ||
} | ||
function $parcel$defineInteropFlag(a) { | ||
Object.defineProperty(a, '__esModule', {value: true, configurable: true}); | ||
} | ||
function $parcel$export(e, n, v, s) { | ||
Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true}); | ||
} | ||
function $parcel$exportWildcard(dest, source) { | ||
Object.keys(source).forEach(function(key) { | ||
if (key === 'default' || key === '__esModule' || dest.hasOwnProperty(key)) { | ||
return; | ||
} | ||
Object.defineProperty(dest, key, { | ||
enumerable: true, | ||
get: function get() { | ||
return source[key]; | ||
} | ||
}); | ||
}); | ||
return dest; | ||
} | ||
$parcel$defineInteropFlag(module.exports); | ||
$parcel$export(module.exports, "LogtoSignInSessionItemSchema", () => $5a30d9203b683831$export$7b65a75f516b80e1); | ||
$parcel$export(module.exports, "default", () => $5a30d9203b683831$export$2e2bcd8739ae039); | ||
$parcel$export(module.exports, "LogtoError", () => $5a30d9203b683831$re_export$LogtoError); | ||
$parcel$export(module.exports, "OidcError", () => $5a30d9203b683831$re_export$OidcError); | ||
$parcel$export(module.exports, "Prompt", () => $2FOI4$logtojs.Prompt); | ||
var $91774f8557d77d78$exports = {}; | ||
$parcel$export($91774f8557d77d78$exports, "LogtoClientError", () => $91774f8557d77d78$export$877962ca249b8fc8); | ||
const $91774f8557d77d78$var$logtoClientErrorCodes = Object.freeze({ | ||
sign_in_session: { | ||
invalid: "Invalid sign-in session.", | ||
not_found: "Sign-in session not found." | ||
}, | ||
not_authenticated: "Not authenticated.", | ||
get_access_token_by_refresh_token_failed: "Failed to get access token by refresh token.", | ||
invalid_id_token: "Invalid id token." | ||
}); | ||
const $91774f8557d77d78$var$getMessageByErrorCode = (errorCode)=>{ | ||
// TODO: linear issue LOG-1419 | ||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment | ||
const message = (0, ($parcel$interopDefault($2FOI4$lodashget)))($91774f8557d77d78$var$logtoClientErrorCodes, errorCode); | ||
if (typeof message === "string") return message; | ||
return errorCode; | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.LogtoSignInSessionItemSchema = exports.Prompt = exports.OidcError = exports.LogtoError = void 0; | ||
const js_1 = require("@logto/js"); | ||
const jose_1 = require("jose"); | ||
const lodash_once_1 = __importDefault(require("lodash.once")); | ||
const superstruct_1 = require("superstruct"); | ||
const errors_1 = require("./errors"); | ||
const utils_1 = require("./utils"); | ||
var js_2 = require("@logto/js"); | ||
Object.defineProperty(exports, "LogtoError", { enumerable: true, get: function () { return js_2.LogtoError; } }); | ||
Object.defineProperty(exports, "OidcError", { enumerable: true, get: function () { return js_2.OidcError; } }); | ||
Object.defineProperty(exports, "Prompt", { enumerable: true, get: function () { return js_2.Prompt; } }); | ||
__exportStar(require("./errors"), exports); | ||
exports.LogtoSignInSessionItemSchema = (0, superstruct_1.type)({ | ||
redirectUri: (0, superstruct_1.string)(), | ||
codeVerifier: (0, superstruct_1.string)(), | ||
state: (0, superstruct_1.string)(), | ||
class $91774f8557d77d78$export$877962ca249b8fc8 extends Error { | ||
constructor(code, data){ | ||
super($91774f8557d77d78$var$getMessageByErrorCode(code)); | ||
this.code = code; | ||
this.data = data; | ||
} | ||
} | ||
const $944e6f79cbd4667b$var$logtoStorageItemKeyPrefix = `logto`; | ||
const $944e6f79cbd4667b$export$bdf1d4f122e17e7b = (key)=>`${$944e6f79cbd4667b$var$logtoStorageItemKeyPrefix}:${key}`; | ||
const $944e6f79cbd4667b$export$79da00f3c12fcb3c = (logtoKey)=>`${logtoKey}:refreshToken`; | ||
const $944e6f79cbd4667b$export$cdb4d35801155147 = (logtoKey)=>`${logtoKey}:idToken`; | ||
const $944e6f79cbd4667b$export$8f595bd2a47bcea6 = (resource = "", scopes = [])=>`${scopes.slice().sort().join(" ")}@${resource}`; | ||
const $944e6f79cbd4667b$export$5d9c34f69c80822b = (endpoint)=>new URL((0, $2FOI4$logtojs.discoveryPath), endpoint).toString(); | ||
const $5a30d9203b683831$export$7b65a75f516b80e1 = (0, $2FOI4$superstruct.type)({ | ||
redirectUri: (0, $2FOI4$superstruct.string)(), | ||
codeVerifier: (0, $2FOI4$superstruct.string)(), | ||
state: (0, $2FOI4$superstruct.string)() | ||
}); | ||
class LogtoClient { | ||
constructor(logtoConfig, requester = (0, js_1.createRequester)()) { | ||
this.getOidcConfig = (0, lodash_once_1.default)(this._getOidcConfig); | ||
this.getJwtVerifyGetKey = (0, lodash_once_1.default)(this._getJwtVerifyGetKey); | ||
this.accessTokenMap = new Map(); | ||
this.getAccessTokenPromiseMap = new Map(); | ||
class $5a30d9203b683831$export$2e2bcd8739ae039 { | ||
getOidcConfig = (0, ($parcel$interopDefault($2FOI4$lodashonce)))(this._getOidcConfig); | ||
getJwtVerifyGetKey = (0, ($parcel$interopDefault($2FOI4$lodashonce)))(this._getJwtVerifyGetKey); | ||
accessTokenMap = new Map(); | ||
getAccessTokenPromiseMap = new Map(); | ||
constructor(logtoConfig, requester = (0, $2FOI4$logtojs.createRequester)()){ | ||
this.logtoConfig = { | ||
...logtoConfig, | ||
prompt: logtoConfig.prompt ?? js_1.Prompt.Consent, | ||
scopes: (0, js_1.withReservedScopes)(logtoConfig.scopes).split(' '), | ||
prompt: logtoConfig.prompt ?? (0, $2FOI4$logtojs.Prompt).Consent, | ||
scopes: (0, $2FOI4$logtojs.withReservedScopes)(logtoConfig.scopes).split(" ") | ||
}; | ||
this.logtoStorageKey = (0, utils_1.buildLogtoKey)(logtoConfig.appId); | ||
this.logtoStorageKey = (0, $944e6f79cbd4667b$export$bdf1d4f122e17e7b)(logtoConfig.appId); | ||
this.requester = requester; | ||
this._idToken = localStorage.getItem((0, utils_1.buildIdTokenKey)(this.logtoStorageKey)); | ||
this._idToken = localStorage.getItem((0, $944e6f79cbd4667b$export$cdb4d35801155147)(this.logtoStorageKey)); | ||
} | ||
@@ -53,13 +109,10 @@ get isAuthenticated() { | ||
const jsonItem = sessionStorage.getItem(this.logtoStorageKey); | ||
if (!jsonItem) { | ||
return null; | ||
} | ||
if (!jsonItem) return null; | ||
try { | ||
const item = JSON.parse(jsonItem); | ||
(0, superstruct_1.assert)(item, exports.LogtoSignInSessionItemSchema); | ||
(0, $2FOI4$superstruct.assert)(item, $5a30d9203b683831$export$7b65a75f516b80e1); | ||
return item; | ||
} catch (error) { | ||
throw new (0, $91774f8557d77d78$export$877962ca249b8fc8)("sign_in_session.invalid", error); | ||
} | ||
catch (error) { | ||
throw new errors_1.LogtoClientError('sign_in_session.invalid', error); | ||
} | ||
} | ||
@@ -75,6 +128,6 @@ set signInSession(logtoSignInSessionItem) { | ||
get refreshToken() { | ||
return localStorage.getItem((0, utils_1.buildRefreshTokenKey)(this.logtoStorageKey)); | ||
return localStorage.getItem((0, $944e6f79cbd4667b$export$79da00f3c12fcb3c)(this.logtoStorageKey)); | ||
} | ||
set refreshToken(refreshToken) { | ||
const refreshTokenKey = (0, utils_1.buildRefreshTokenKey)(this.logtoStorageKey); | ||
const refreshTokenKey = (0, $944e6f79cbd4667b$export$79da00f3c12fcb3c)(this.logtoStorageKey); | ||
if (!refreshToken) { | ||
@@ -91,3 +144,3 @@ localStorage.removeItem(refreshTokenKey); | ||
this._idToken = idToken; | ||
const idTokenKey = (0, utils_1.buildIdTokenKey)(this.logtoStorageKey); | ||
const idTokenKey = (0, $944e6f79cbd4667b$export$cdb4d35801155147)(this.logtoStorageKey); | ||
if (!idToken) { | ||
@@ -101,28 +154,18 @@ localStorage.removeItem(idTokenKey); | ||
async getAccessToken(resource) { | ||
if (!this.idToken) { | ||
throw new errors_1.LogtoClientError('not_authenticated'); | ||
} | ||
const accessTokenKey = (0, utils_1.buildAccessTokenKey)(resource); | ||
if (!this.idToken) throw new (0, $91774f8557d77d78$export$877962ca249b8fc8)("not_authenticated"); | ||
const accessTokenKey = (0, $944e6f79cbd4667b$export$8f595bd2a47bcea6)(resource); | ||
const accessToken = this.accessTokenMap.get(accessTokenKey); | ||
if (accessToken && accessToken.expiresAt > Date.now() / 1000) { | ||
return accessToken.token; | ||
} | ||
if (accessToken && accessToken.expiresAt > Date.now() / 1000) return accessToken.token; | ||
// Since the access token has expired, delete it from the map. | ||
if (accessToken) { | ||
this.accessTokenMap.delete(accessTokenKey); | ||
} | ||
if (accessToken) this.accessTokenMap.delete(accessTokenKey); | ||
/** | ||
* Need to fetch a new access token using refresh token. | ||
* Reuse the cached promise if exists. | ||
*/ | ||
const cachedPromise = this.getAccessTokenPromiseMap.get(accessTokenKey); | ||
if (cachedPromise) { | ||
return cachedPromise; | ||
} | ||
* Need to fetch a new access token using refresh token. | ||
* Reuse the cached promise if exists. | ||
*/ const cachedPromise = this.getAccessTokenPromiseMap.get(accessTokenKey); | ||
if (cachedPromise) return cachedPromise; | ||
/** | ||
* Create a new promise and cache in map to avoid race condition. | ||
* Since we enable "refresh token rotation" by default, | ||
* it will be problematic when calling multiple `getAccessToken()` closely. | ||
*/ | ||
const promise = this.getAccessTokenByRefreshToken(resource); | ||
* Create a new promise and cache in map to avoid race condition. | ||
* Since we enable "refresh token rotation" by default, | ||
* it will be problematic when calling multiple `getAccessToken()` closely. | ||
*/ const promise = this.getAccessTokenByRefreshToken(resource); | ||
this.getAccessTokenPromiseMap.set(accessTokenKey, promise); | ||
@@ -134,24 +177,26 @@ const token = await promise; | ||
getIdTokenClaims() { | ||
if (!this.idToken) { | ||
throw new errors_1.LogtoClientError('not_authenticated'); | ||
} | ||
return (0, js_1.decodeIdToken)(this.idToken); | ||
if (!this.idToken) throw new (0, $91774f8557d77d78$export$877962ca249b8fc8)("not_authenticated"); | ||
return (0, $2FOI4$logtojs.decodeIdToken)(this.idToken); | ||
} | ||
async signIn(redirectUri) { | ||
const { appId: clientId, prompt, resources, scopes } = this.logtoConfig; | ||
const { authorizationEndpoint } = await this.getOidcConfig(); | ||
const codeVerifier = (0, js_1.generateCodeVerifier)(); | ||
const codeChallenge = await (0, js_1.generateCodeChallenge)(codeVerifier); | ||
const state = (0, js_1.generateState)(); | ||
const signInUri = (0, js_1.generateSignInUri)({ | ||
authorizationEndpoint, | ||
clientId, | ||
redirectUri, | ||
codeChallenge, | ||
state, | ||
scopes, | ||
resources, | ||
prompt, | ||
const { appId: clientId , prompt: prompt , resources: resources , scopes: scopes } = this.logtoConfig; | ||
const { authorizationEndpoint: authorizationEndpoint } = await this.getOidcConfig(); | ||
const codeVerifier = (0, $2FOI4$logtojs.generateCodeVerifier)(); | ||
const codeChallenge = await (0, $2FOI4$logtojs.generateCodeChallenge)(codeVerifier); | ||
const state = (0, $2FOI4$logtojs.generateState)(); | ||
const signInUri = (0, $2FOI4$logtojs.generateSignInUri)({ | ||
authorizationEndpoint: authorizationEndpoint, | ||
clientId: clientId, | ||
redirectUri: redirectUri, | ||
codeChallenge: codeChallenge, | ||
state: state, | ||
scopes: scopes, | ||
resources: resources, | ||
prompt: prompt | ||
}); | ||
this.signInSession = { redirectUri, codeVerifier, state }; | ||
this.signInSession = { | ||
redirectUri: redirectUri, | ||
codeVerifier: codeVerifier, | ||
state: state | ||
}; | ||
this.refreshToken = null; | ||
@@ -162,25 +207,21 @@ this.idToken = null; | ||
isSignInRedirected(url) { | ||
const { signInSession } = this; | ||
if (!signInSession) { | ||
return false; | ||
} | ||
const { redirectUri } = signInSession; | ||
const { origin, pathname } = new URL(url); | ||
const { signInSession: signInSession } = this; | ||
if (!signInSession) return false; | ||
const { redirectUri: redirectUri } = signInSession; | ||
const { origin: origin , pathname: pathname } = new URL(url); | ||
return `${origin}${pathname}` === redirectUri; | ||
} | ||
async handleSignInCallback(callbackUri) { | ||
const { signInSession, logtoConfig, requester } = this; | ||
if (!signInSession) { | ||
throw new errors_1.LogtoClientError('sign_in_session.not_found'); | ||
} | ||
const { redirectUri, state, codeVerifier } = signInSession; | ||
const code = (0, js_1.verifyAndParseCodeFromCallbackUri)(callbackUri, redirectUri, state); | ||
const { appId: clientId } = logtoConfig; | ||
const { tokenEndpoint } = await this.getOidcConfig(); | ||
const codeTokenResponse = await (0, js_1.fetchTokenByAuthorizationCode)({ | ||
clientId, | ||
tokenEndpoint, | ||
redirectUri, | ||
codeVerifier, | ||
code, | ||
const { signInSession: signInSession , logtoConfig: logtoConfig , requester: requester } = this; | ||
if (!signInSession) throw new (0, $91774f8557d77d78$export$877962ca249b8fc8)("sign_in_session.not_found"); | ||
const { redirectUri: redirectUri , state: state , codeVerifier: codeVerifier } = signInSession; | ||
const code = (0, $2FOI4$logtojs.verifyAndParseCodeFromCallbackUri)(callbackUri, redirectUri, state); | ||
const { appId: clientId } = logtoConfig; | ||
const { tokenEndpoint: tokenEndpoint } = await this.getOidcConfig(); | ||
const codeTokenResponse = await (0, $2FOI4$logtojs.fetchTokenByAuthorizationCode)({ | ||
clientId: clientId, | ||
tokenEndpoint: tokenEndpoint, | ||
redirectUri: redirectUri, | ||
codeVerifier: codeVerifier, | ||
code: code | ||
}, requester); | ||
@@ -192,19 +233,14 @@ await this.verifyIdToken(codeTokenResponse.idToken); | ||
async signOut(postLogoutRedirectUri) { | ||
if (!this.idToken) { | ||
throw new errors_1.LogtoClientError('not_authenticated'); | ||
if (!this.idToken) throw new (0, $91774f8557d77d78$export$877962ca249b8fc8)("not_authenticated"); | ||
const { appId: clientId } = this.logtoConfig; | ||
const { endSessionEndpoint: endSessionEndpoint , revocationEndpoint: revocationEndpoint } = await this.getOidcConfig(); | ||
if (this.refreshToken) try { | ||
await (0, $2FOI4$logtojs.revoke)(revocationEndpoint, clientId, this.refreshToken, this.requester); | ||
} catch { | ||
// Do nothing at this point, as we don't want to break the sign-out flow even if the revocation is failed | ||
} | ||
const { appId: clientId } = this.logtoConfig; | ||
const { endSessionEndpoint, revocationEndpoint } = await this.getOidcConfig(); | ||
if (this.refreshToken) { | ||
try { | ||
await (0, js_1.revoke)(revocationEndpoint, clientId, this.refreshToken, this.requester); | ||
} | ||
catch { | ||
// Do nothing at this point, as we don't want to break the sign-out flow even if the revocation is failed | ||
} | ||
} | ||
const url = (0, js_1.generateSignOutUri)({ | ||
endSessionEndpoint, | ||
postLogoutRedirectUri, | ||
idToken: this.idToken, | ||
const url = (0, $2FOI4$logtojs.generateSignOutUri)({ | ||
endSessionEndpoint: endSessionEndpoint, | ||
postLogoutRedirectUri: postLogoutRedirectUri, | ||
idToken: this.idToken | ||
}); | ||
@@ -217,20 +253,20 @@ this.accessTokenMap.clear(); | ||
async getAccessTokenByRefreshToken(resource) { | ||
if (!this.refreshToken) { | ||
throw new errors_1.LogtoClientError('not_authenticated'); | ||
} | ||
if (!this.refreshToken) throw new (0, $91774f8557d77d78$export$877962ca249b8fc8)("not_authenticated"); | ||
try { | ||
const accessTokenKey = (0, utils_1.buildAccessTokenKey)(resource); | ||
const { appId: clientId } = this.logtoConfig; | ||
const { tokenEndpoint } = await this.getOidcConfig(); | ||
const { accessToken, refreshToken, idToken, scope, expiresIn } = await (0, js_1.fetchTokenByRefreshToken)({ | ||
clientId, | ||
tokenEndpoint, | ||
const accessTokenKey = (0, $944e6f79cbd4667b$export$8f595bd2a47bcea6)(resource); | ||
const { appId: clientId } = this.logtoConfig; | ||
const { tokenEndpoint: tokenEndpoint } = await this.getOidcConfig(); | ||
const { accessToken: accessToken , refreshToken: refreshToken , idToken: idToken , scope: scope , expiresIn: expiresIn } = await (0, $2FOI4$logtojs.fetchTokenByRefreshToken)({ | ||
clientId: clientId, | ||
tokenEndpoint: tokenEndpoint, | ||
refreshToken: this.refreshToken, | ||
resource, | ||
scopes: resource ? ['offline_access'] : undefined, // Force remove openid scope from the request | ||
resource: resource, | ||
scopes: resource ? [ | ||
"offline_access" | ||
] : undefined | ||
}, this.requester); | ||
this.accessTokenMap.set(accessTokenKey, { | ||
token: accessToken, | ||
scope, | ||
expiresAt: Math.round(Date.now() / 1000) + expiresIn, | ||
scope: scope, | ||
expiresAt: Math.round(Date.now() / 1000) + expiresIn | ||
}); | ||
@@ -243,36 +279,41 @@ this.refreshToken = refreshToken; | ||
return accessToken; | ||
} catch (error) { | ||
throw new (0, $91774f8557d77d78$export$877962ca249b8fc8)("get_access_token_by_refresh_token_failed", error); | ||
} | ||
catch (error) { | ||
throw new errors_1.LogtoClientError('get_access_token_by_refresh_token_failed', error); | ||
} | ||
} | ||
async _getOidcConfig() { | ||
const { endpoint } = this.logtoConfig; | ||
const discoveryEndpoint = (0, utils_1.getDiscoveryEndpoint)(endpoint); | ||
return (0, js_1.fetchOidcConfig)(discoveryEndpoint, this.requester); | ||
const { endpoint: endpoint } = this.logtoConfig; | ||
const discoveryEndpoint = (0, $944e6f79cbd4667b$export$5d9c34f69c80822b)(endpoint); | ||
return (0, $2FOI4$logtojs.fetchOidcConfig)(discoveryEndpoint, this.requester); | ||
} | ||
async _getJwtVerifyGetKey() { | ||
const { jwksUri } = await this.getOidcConfig(); | ||
return (0, jose_1.createRemoteJWKSet)(new URL(jwksUri)); | ||
const { jwksUri: jwksUri } = await this.getOidcConfig(); | ||
return (0, $2FOI4$jose.createRemoteJWKSet)(new URL(jwksUri)); | ||
} | ||
async verifyIdToken(idToken) { | ||
const { appId } = this.logtoConfig; | ||
const { issuer } = await this.getOidcConfig(); | ||
const { appId: appId } = this.logtoConfig; | ||
const { issuer: issuer } = await this.getOidcConfig(); | ||
const jwtVerifyGetKey = await this.getJwtVerifyGetKey(); | ||
try { | ||
await (0, js_1.verifyIdToken)(idToken, appId, issuer, jwtVerifyGetKey); | ||
await (0, $2FOI4$logtojs.verifyIdToken)(idToken, appId, issuer, jwtVerifyGetKey); | ||
} catch (error) { | ||
throw new (0, $91774f8557d77d78$export$877962ca249b8fc8)("invalid_id_token", error); | ||
} | ||
catch (error) { | ||
throw new errors_1.LogtoClientError('invalid_id_token', error); | ||
} | ||
} | ||
saveCodeToken({ refreshToken, idToken, scope, accessToken, expiresIn, }) { | ||
saveCodeToken({ refreshToken: refreshToken , idToken: idToken , scope: scope , accessToken: accessToken , expiresIn: expiresIn }) { | ||
this.refreshToken = refreshToken ?? null; | ||
this.idToken = idToken; | ||
// NOTE: Will add scope to accessTokenKey when needed. (Linear issue LOG-1589) | ||
const accessTokenKey = (0, utils_1.buildAccessTokenKey)(); | ||
const accessTokenKey = (0, $944e6f79cbd4667b$export$8f595bd2a47bcea6)(); | ||
const expiresAt = Date.now() / 1000 + expiresIn; | ||
this.accessTokenMap.set(accessTokenKey, { token: accessToken, scope, expiresAt }); | ||
this.accessTokenMap.set(accessTokenKey, { | ||
token: accessToken, | ||
scope: scope, | ||
expiresAt: expiresAt | ||
}); | ||
} | ||
} | ||
exports.default = LogtoClient; | ||
$parcel$exportWildcard(module.exports, $91774f8557d77d78$exports); | ||
//# sourceMappingURL=index.js.map |
{ | ||
"name": "@logto/browser", | ||
"version": "0.2.2", | ||
"version": "0.2.3-alpha.0", | ||
"source": "./src/index.ts", | ||
"main": "./lib/index.js", | ||
"exports": "./lib/index.js", | ||
"typings": "./lib/index.d.ts", | ||
"exports": { | ||
"require": "./lib/index.js", | ||
"import": "./lib/module.js" | ||
}, | ||
"module": "./lib/module.js", | ||
"types": "./lib/index.d.ts", | ||
"files": [ | ||
@@ -19,3 +24,4 @@ "lib" | ||
"precommit": "lint-staged", | ||
"build": "rm -rf lib/ && tsc -p tsconfig.build.json", | ||
"check": "tsc --noEmit", | ||
"build": "rm -rf lib/ && pnpm check && parcel build", | ||
"lint": "eslint --ext .ts src", | ||
@@ -27,3 +33,3 @@ "test": "jest", | ||
"dependencies": { | ||
"@logto/js": "^0.2.0", | ||
"@logto/js": "^0.2.3-alpha.0", | ||
"@silverhand/essentials": "^1.1.6", | ||
@@ -37,2 +43,5 @@ "jose": "^4.5.0", | ||
"@jest/types": "^27.5.1", | ||
"@parcel/core": "^2.6.2", | ||
"@parcel/packager-ts": "^2.6.2", | ||
"@parcel/transformer-typescript-types": "^2.6.2", | ||
"@silverhand/eslint-config": "^0.14.0", | ||
@@ -48,2 +57,3 @@ "@silverhand/ts-config": "^0.14.0", | ||
"lint-staged": "^13.0.0", | ||
"parcel": "^2.6.2", | ||
"prettier": "^2.3.2", | ||
@@ -61,3 +71,3 @@ "text-encoder": "^0.0.4", | ||
}, | ||
"gitHead": "c8e2ad8ea656887884f9d32c119086d53554c178" | ||
"gitHead": "e9e611773b0e73baa6c05a3f2d545fac64d03707" | ||
} |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
90473
624
19
1
+ Added@logto/js@0.2.3-alpha.0(transitive)
- Removed@logto/js@0.2.0(transitive)
Updated@logto/js@^0.2.3-alpha.0