Comparing version 0.2.0 to 1.0.0-alpha.0
@@ -1,3 +0,187 @@ | ||
export * from './core'; | ||
export * from './utils'; | ||
export * from './consts'; | ||
import { NormalizeKeyPaths, KeysToCamelCase } from "@silverhand/essentials"; | ||
import { JWTVerifyGetKey } from "jose"; | ||
import * as s from "superstruct"; | ||
export const ContentType: { | ||
formUrlEncoded: { | ||
'Content-Type': string; | ||
}; | ||
}; | ||
export enum TokenGrantType { | ||
AuthorizationCode = "authorization_code", | ||
RefreshToken = "refresh_token" | ||
} | ||
export enum QueryKey { | ||
ClientId = "client_id", | ||
Code = "code", | ||
CodeChallenge = "code_challenge", | ||
CodeChallengeMethod = "code_challenge_method", | ||
CodeVerifier = "code_verifier", | ||
Error = "error", | ||
ErrorDescription = "error_description", | ||
GrantType = "grant_type", | ||
IdToken = "id_token", | ||
IdTokenHint = "id_token_hint", | ||
PostLogoutRedirectUri = "post_logout_redirect_uri", | ||
Prompt = "prompt", | ||
RedirectUri = "redirect_uri", | ||
RefreshToken = "refresh_token", | ||
Resource = "resource", | ||
ResponseType = "response_type", | ||
Scope = "scope", | ||
State = "state", | ||
Token = "token" | ||
} | ||
export enum Prompt { | ||
Consent = "consent", | ||
Login = "login" | ||
} | ||
declare const logtoErrorCodes: Readonly<{ | ||
id_token: { | ||
invalid_iat: string; | ||
invalid_token: string; | ||
}; | ||
callback_uri_verification: { | ||
redirect_uri_mismatched: string; | ||
error_found: string; | ||
missing_state: string; | ||
state_mismatched: string; | ||
missing_code: string; | ||
}; | ||
requester: { | ||
not_provide_fetch: string; | ||
}; | ||
}>; | ||
export type LogtoErrorCode = NormalizeKeyPaths<typeof logtoErrorCodes>; | ||
export class LogtoError extends Error { | ||
code: LogtoErrorCode; | ||
data: unknown; | ||
constructor(code: LogtoErrorCode, data?: unknown); | ||
} | ||
export class LogtoRequestError extends Error { | ||
code: string; | ||
constructor(code: string, message: string); | ||
} | ||
export class OidcError { | ||
error: string; | ||
errorDescription?: string; | ||
constructor(error: string, errorDescription?: string); | ||
} | ||
export const parseUriParameters: (uri: string) => URLSearchParams; | ||
export const verifyAndParseCodeFromCallbackUri: (callbackUri: string, redirectUri: string, state: string) => string; | ||
/** | ||
* Generates random string for state and encodes them in url safe base64 | ||
*/ | ||
export const generateState: () => string; | ||
/** | ||
* Generates code verifier | ||
* | ||
* @link [Client Creates a Code Verifier](https://datatracker.ietf.org/doc/html/rfc7636#section-4.1) | ||
*/ | ||
export const generateCodeVerifier: () => string; | ||
/** | ||
* Calculates the S256 PKCE code challenge for an arbitrary code verifier and encodes it in url safe base64 | ||
* | ||
* @param {String} codeVerifier Code verifier to calculate the S256 code challenge for | ||
* @link [Client Creates the Code Challenge](https://datatracker.ietf.org/doc/html/rfc7636#section-4.2) | ||
*/ | ||
export const generateCodeChallenge: (codeVerifier: string) => Promise<string>; | ||
/** | ||
* @link [ID Token](https://openid.net/specs/openid-connect-core-1_0.html#IDToken) | ||
*/ | ||
declare const IdTokenClaimsSchema: s.Struct<{ | ||
iss: string; | ||
sub: string; | ||
aud: string; | ||
exp: number; | ||
iat: number; | ||
at_hash?: string | null | undefined; | ||
name?: string | null | undefined; | ||
username?: string | null | undefined; | ||
avatar?: string | null | undefined; | ||
role_names?: string[] | null | undefined; | ||
}, { | ||
iss: s.Struct<string, null>; | ||
sub: s.Struct<string, null>; | ||
aud: s.Struct<string, null>; | ||
exp: s.Struct<number, null>; | ||
iat: s.Struct<number, null>; | ||
at_hash: s.Struct<string | null | undefined, null>; | ||
name: s.Struct<string | null | undefined, null>; | ||
username: s.Struct<string | null | undefined, null>; | ||
avatar: s.Struct<string | null | undefined, null>; | ||
role_names: s.Struct<string[] | null | undefined, s.Struct<string, null>>; | ||
}>; | ||
export type IdTokenClaims = s.Infer<typeof IdTokenClaimsSchema>; | ||
export const verifyIdToken: (idToken: string, clientId: string, issuer: string, jwks: JWTVerifyGetKey) => Promise<void>; | ||
export const decodeIdToken: (token: string) => IdTokenClaims; | ||
export const createRequester: (fetchFunction?: typeof fetch | undefined) => <T>(input: RequestInfo, init?: RequestInit | undefined) => Promise<T>; | ||
export type Requester = ReturnType<typeof createRequester>; | ||
/** | ||
* @param originalScopes | ||
* @return scopes should contain all reserved scopes ( Logto requires `openid` and `offline_access` ) | ||
*/ | ||
export const withReservedScopes: (originalScopes?: string[] | undefined) => string; | ||
export type FetchTokenByAuthorizationCodeParameters = { | ||
clientId: string; | ||
tokenEndpoint: string; | ||
redirectUri: string; | ||
codeVerifier: string; | ||
code: string; | ||
resource?: string; | ||
}; | ||
export type FetchTokenByRefreshTokenParameters = { | ||
clientId: string; | ||
tokenEndpoint: string; | ||
refreshToken: string; | ||
resource?: string; | ||
scopes?: string[]; | ||
}; | ||
type SnakeCaseCodeTokenResponse = { | ||
access_token: string; | ||
refresh_token?: string; | ||
id_token: string; | ||
scope: string; | ||
expires_in: number; | ||
}; | ||
export type CodeTokenResponse = KeysToCamelCase<SnakeCaseCodeTokenResponse>; | ||
type SnakeCaseRefreshTokenTokenResponse = { | ||
access_token: string; | ||
refresh_token: string; | ||
id_token?: string; | ||
scope: string; | ||
expires_in: number; | ||
}; | ||
export type RefreshTokenTokenResponse = KeysToCamelCase<SnakeCaseRefreshTokenTokenResponse>; | ||
export const fetchTokenByAuthorizationCode: ({ clientId, tokenEndpoint, redirectUri, codeVerifier, code, resource, }: FetchTokenByAuthorizationCodeParameters, requester: Requester) => Promise<CodeTokenResponse>; | ||
export const fetchTokenByRefreshToken: ({ clientId, tokenEndpoint, refreshToken, resource, scopes }: FetchTokenByRefreshTokenParameters, requester: Requester) => Promise<RefreshTokenTokenResponse>; | ||
type OidcConfigSnakeCaseResponse = { | ||
authorization_endpoint: string; | ||
token_endpoint: string; | ||
end_session_endpoint: string; | ||
revocation_endpoint: string; | ||
jwks_uri: string; | ||
issuer: string; | ||
}; | ||
export const discoveryPath = "/oidc/.well-known/openid-configuration"; | ||
export type OidcConfigResponse = KeysToCamelCase<OidcConfigSnakeCaseResponse>; | ||
export const fetchOidcConfig: (endpoint: string, requester: Requester) => Promise<OidcConfigResponse>; | ||
export const revoke: (revocationEndpoint: string, clientId: string, token: string, requester: Requester) => Promise<void>; | ||
export type SignInUriParameters = { | ||
authorizationEndpoint: string; | ||
clientId: string; | ||
redirectUri: string; | ||
codeChallenge: string; | ||
state: string; | ||
scopes?: string[]; | ||
resources?: string[]; | ||
prompt?: Prompt; | ||
}; | ||
export const generateSignInUri: ({ authorizationEndpoint, clientId, redirectUri, codeChallenge, state, scopes, resources, prompt, }: SignInUriParameters) => string; | ||
type SignOutUriParameters = { | ||
endSessionEndpoint: string; | ||
idToken: string; | ||
postLogoutRedirectUri?: string; | ||
}; | ||
export const generateSignOutUri: ({ endSessionEndpoint, idToken, postLogoutRedirectUri, }: SignOutUriParameters) => string; | ||
//# sourceMappingURL=index.d.ts.map |
375
lib/index.js
@@ -1,16 +0,361 @@ | ||
"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 $eVySA$camelcasekeys = require("camelcase-keys"); | ||
var $eVySA$silverhandessentials = require("@silverhand/essentials"); | ||
var $eVySA$lodashget = require("lodash.get"); | ||
var $eVySA$jsbase64 = require("js-base64"); | ||
var $eVySA$jose = require("jose"); | ||
var $eVySA$superstruct = require("superstruct"); | ||
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; | ||
} | ||
function $parcel$interopDefault(a) { | ||
return a && a.__esModule ? a.default : a; | ||
} | ||
function $parcel$export(e, n, v, s) { | ||
Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true}); | ||
} | ||
var $a722dce254028e46$exports = {}; | ||
var $e6b305c1e572373d$exports = {}; | ||
$parcel$export($e6b305c1e572373d$exports, "fetchTokenByAuthorizationCode", () => $e6b305c1e572373d$export$684f740cd70532d4); | ||
$parcel$export($e6b305c1e572373d$exports, "fetchTokenByRefreshToken", () => $e6b305c1e572373d$export$9909137b467efb8b); | ||
var $5c367c11270b61f6$exports = {}; | ||
$parcel$export($5c367c11270b61f6$exports, "ContentType", () => $5c367c11270b61f6$export$e2e108cbe2e4f865); | ||
$parcel$export($5c367c11270b61f6$exports, "TokenGrantType", () => $5c367c11270b61f6$export$3f2aafdd1ccae76c); | ||
$parcel$export($5c367c11270b61f6$exports, "QueryKey", () => $5c367c11270b61f6$export$65f63a8bc3cba53d); | ||
$parcel$export($5c367c11270b61f6$exports, "Prompt", () => $5c367c11270b61f6$export$83716a4aa1642908); | ||
const $5c367c11270b61f6$export$e2e108cbe2e4f865 = { | ||
formUrlEncoded: { | ||
"Content-Type": "application/x-www-form-urlencoded" | ||
} | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
/* istanbul ignore file */ | ||
__exportStar(require("./core"), exports); | ||
__exportStar(require("./utils"), exports); | ||
__exportStar(require("./consts"), exports); | ||
let $5c367c11270b61f6$export$3f2aafdd1ccae76c; | ||
(function(TokenGrantType1) { | ||
TokenGrantType1["AuthorizationCode"] = "authorization_code"; | ||
TokenGrantType1["RefreshToken"] = "refresh_token"; | ||
})($5c367c11270b61f6$export$3f2aafdd1ccae76c || ($5c367c11270b61f6$export$3f2aafdd1ccae76c = {})); | ||
let $5c367c11270b61f6$export$65f63a8bc3cba53d; | ||
(function(QueryKey1) { | ||
QueryKey1["ClientId"] = "client_id"; | ||
QueryKey1["Code"] = "code"; | ||
QueryKey1["CodeChallenge"] = "code_challenge"; | ||
QueryKey1["CodeChallengeMethod"] = "code_challenge_method"; | ||
QueryKey1["CodeVerifier"] = "code_verifier"; | ||
QueryKey1["Error"] = "error"; | ||
QueryKey1["ErrorDescription"] = "error_description"; | ||
QueryKey1["GrantType"] = "grant_type"; | ||
QueryKey1["IdToken"] = "id_token"; | ||
QueryKey1["IdTokenHint"] = "id_token_hint"; | ||
QueryKey1["PostLogoutRedirectUri"] = "post_logout_redirect_uri"; | ||
QueryKey1["Prompt"] = "prompt"; | ||
QueryKey1["RedirectUri"] = "redirect_uri"; | ||
QueryKey1["RefreshToken"] = "refresh_token"; | ||
QueryKey1["Resource"] = "resource"; | ||
QueryKey1["ResponseType"] = "response_type"; | ||
QueryKey1["Scope"] = "scope"; | ||
QueryKey1["State"] = "state"; | ||
QueryKey1["Token"] = "token"; | ||
})($5c367c11270b61f6$export$65f63a8bc3cba53d || ($5c367c11270b61f6$export$65f63a8bc3cba53d = {})); | ||
let $5c367c11270b61f6$export$83716a4aa1642908; | ||
(function(Prompt1) { | ||
Prompt1["Consent"] = "consent"; | ||
Prompt1["Login"] = "login"; | ||
})($5c367c11270b61f6$export$83716a4aa1642908 || ($5c367c11270b61f6$export$83716a4aa1642908 = {})); | ||
const $e6b305c1e572373d$export$684f740cd70532d4 = async ({ clientId: clientId , tokenEndpoint: tokenEndpoint , redirectUri: redirectUri , codeVerifier: codeVerifier , code: code , resource: resource }, requester)=>{ | ||
const parameters = new URLSearchParams(); | ||
parameters.append((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).ClientId, clientId); | ||
parameters.append((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).Code, code); | ||
parameters.append((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).CodeVerifier, codeVerifier); | ||
parameters.append((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).RedirectUri, redirectUri); | ||
parameters.append((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).GrantType, (0, $5c367c11270b61f6$export$3f2aafdd1ccae76c).AuthorizationCode); | ||
if (resource) parameters.append((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).Resource, resource); | ||
const snakeCaseCodeTokenResponse = await requester(tokenEndpoint, { | ||
method: "POST", | ||
headers: (0, $5c367c11270b61f6$export$e2e108cbe2e4f865).formUrlEncoded, | ||
body: parameters | ||
}); | ||
return (0, ($parcel$interopDefault($eVySA$camelcasekeys)))(snakeCaseCodeTokenResponse); | ||
}; | ||
const $e6b305c1e572373d$export$9909137b467efb8b = async ({ clientId: clientId , tokenEndpoint: tokenEndpoint , refreshToken: refreshToken , resource: resource , scopes: scopes }, requester)=>{ | ||
const parameters = new URLSearchParams(); | ||
parameters.append((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).ClientId, clientId); | ||
parameters.append((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).RefreshToken, refreshToken); | ||
parameters.append((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).GrantType, (0, $5c367c11270b61f6$export$3f2aafdd1ccae76c).RefreshToken); | ||
if (resource) parameters.append((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).Resource, resource); | ||
if (scopes?.length) parameters.append((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).Scope, scopes.join(" ")); | ||
const snakeCaseRefreshTokenTokenResponse = await requester(tokenEndpoint, { | ||
method: "POST", | ||
headers: (0, $5c367c11270b61f6$export$e2e108cbe2e4f865).formUrlEncoded, | ||
body: parameters | ||
}); | ||
return (0, ($parcel$interopDefault($eVySA$camelcasekeys)))(snakeCaseRefreshTokenTokenResponse); | ||
}; | ||
var $945b1d0ce7f8f44a$exports = {}; | ||
$parcel$export($945b1d0ce7f8f44a$exports, "discoveryPath", () => $945b1d0ce7f8f44a$export$815bda5ead26b243); | ||
$parcel$export($945b1d0ce7f8f44a$exports, "fetchOidcConfig", () => $945b1d0ce7f8f44a$export$98242d8e822ad11f); | ||
const $945b1d0ce7f8f44a$export$815bda5ead26b243 = "/oidc/.well-known/openid-configuration"; | ||
const $945b1d0ce7f8f44a$export$98242d8e822ad11f = async (endpoint, requester)=>(0, ($parcel$interopDefault($eVySA$camelcasekeys)))(await requester(endpoint)); | ||
var $de840481123b2c25$exports = {}; | ||
$parcel$export($de840481123b2c25$exports, "revoke", () => $de840481123b2c25$export$573f8dbbf6fbef75); | ||
const $de840481123b2c25$export$573f8dbbf6fbef75 = async (revocationEndpoint, clientId, token, requester)=>requester(revocationEndpoint, { | ||
method: "POST", | ||
headers: (0, $5c367c11270b61f6$export$e2e108cbe2e4f865).formUrlEncoded, | ||
body: new URLSearchParams({ | ||
[(0, $5c367c11270b61f6$export$65f63a8bc3cba53d).ClientId]: clientId, | ||
[(0, $5c367c11270b61f6$export$65f63a8bc3cba53d).Token]: token | ||
}) | ||
}); | ||
var $1e17092ca3413c94$exports = {}; | ||
$parcel$export($1e17092ca3413c94$exports, "generateSignInUri", () => $1e17092ca3413c94$export$b01a187f12b774c6); | ||
var $10615ba3cc8a78f8$exports = {}; | ||
var $d3a7a037fd1d9433$exports = {}; | ||
$parcel$export($d3a7a037fd1d9433$exports, "parseUriParameters", () => $d3a7a037fd1d9433$export$4851e69315d5b72c); | ||
$parcel$export($d3a7a037fd1d9433$exports, "verifyAndParseCodeFromCallbackUri", () => $d3a7a037fd1d9433$export$dc3fae3c99763885); | ||
var $47fe17290a91cd19$exports = {}; | ||
$parcel$export($47fe17290a91cd19$exports, "LogtoError", () => $47fe17290a91cd19$export$ba60d77e6748b659); | ||
$parcel$export($47fe17290a91cd19$exports, "LogtoRequestError", () => $47fe17290a91cd19$export$e6e15b8ba42b9b70); | ||
$parcel$export($47fe17290a91cd19$exports, "OidcError", () => $47fe17290a91cd19$export$d4832bcf9ce430e0); | ||
const $47fe17290a91cd19$var$logtoErrorCodes = Object.freeze({ | ||
id_token: { | ||
invalid_iat: "Invalid issued at time", | ||
invalid_token: "Invalid token" | ||
}, | ||
callback_uri_verification: { | ||
redirect_uri_mismatched: "Redirect URI mismatched", | ||
error_found: "Error found", | ||
missing_state: "Missing state", | ||
state_mismatched: "State mismatched", | ||
missing_code: "Missing code" | ||
}, | ||
requester: { | ||
not_provide_fetch: "Should provide a fetch function under Node.js" | ||
} | ||
}); | ||
const $47fe17290a91cd19$var$getMessageByErrorCode = (errorCode)=>{ | ||
// TODO: linear issue LOG-1419 | ||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment | ||
const message = (0, ($parcel$interopDefault($eVySA$lodashget)))($47fe17290a91cd19$var$logtoErrorCodes, errorCode); | ||
if (typeof message === "string") return message; | ||
return errorCode; | ||
}; | ||
class $47fe17290a91cd19$export$ba60d77e6748b659 extends Error { | ||
constructor(code, data){ | ||
super($47fe17290a91cd19$var$getMessageByErrorCode(code)); | ||
this.code = code; | ||
this.data = data; | ||
} | ||
} | ||
class $47fe17290a91cd19$export$e6e15b8ba42b9b70 extends Error { | ||
constructor(code, message){ | ||
super(message); | ||
this.code = code; | ||
} | ||
} | ||
class $47fe17290a91cd19$export$d4832bcf9ce430e0 { | ||
constructor(error, errorDescription){ | ||
this.error = error; | ||
this.errorDescription = errorDescription; | ||
} | ||
} | ||
const $d3a7a037fd1d9433$export$4851e69315d5b72c = (uri)=>{ | ||
const [, queryString = ""] = uri.split("?"); | ||
return new URLSearchParams(queryString); | ||
}; | ||
const $d3a7a037fd1d9433$export$dc3fae3c99763885 = (callbackUri, redirectUri, state)=>{ | ||
if (!callbackUri.startsWith(redirectUri)) throw new (0, $47fe17290a91cd19$export$ba60d77e6748b659)("callback_uri_verification.redirect_uri_mismatched"); | ||
const uriParameters = $d3a7a037fd1d9433$export$4851e69315d5b72c(callbackUri); | ||
const error = (0, $eVySA$silverhandessentials.conditional)(uriParameters.get((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).Error)); | ||
const errorDescription = (0, $eVySA$silverhandessentials.conditional)(uriParameters.get((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).ErrorDescription)); | ||
if (error) throw new (0, $47fe17290a91cd19$export$ba60d77e6748b659)("callback_uri_verification.error_found", new (0, $47fe17290a91cd19$export$d4832bcf9ce430e0)(error, errorDescription)); | ||
const stateFromCallbackUri = uriParameters.get((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).State); | ||
if (!stateFromCallbackUri) throw new (0, $47fe17290a91cd19$export$ba60d77e6748b659)("callback_uri_verification.missing_state"); | ||
if (stateFromCallbackUri !== state) throw new (0, $47fe17290a91cd19$export$ba60d77e6748b659)("callback_uri_verification.state_mismatched"); | ||
const code = uriParameters.get((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).Code); | ||
if (!code) throw new (0, $47fe17290a91cd19$export$ba60d77e6748b659)("callback_uri_verification.missing_code"); | ||
return code; | ||
}; | ||
var $06fff6f93a1f66aa$exports = {}; | ||
$parcel$export($06fff6f93a1f66aa$exports, "generateState", () => $06fff6f93a1f66aa$export$9ccd2716e53a229b); | ||
$parcel$export($06fff6f93a1f66aa$exports, "generateCodeVerifier", () => $06fff6f93a1f66aa$export$cf1891f923f5943a); | ||
$parcel$export($06fff6f93a1f66aa$exports, "generateCodeChallenge", () => $06fff6f93a1f66aa$export$414b01b1f867308a); | ||
/** | ||
* @param length The length of the raw random data. | ||
*/ const $06fff6f93a1f66aa$var$generateRandomString = (length = 64)=>(0, $eVySA$jsbase64.fromUint8Array)(crypto.getRandomValues(new Uint8Array(length)), true); | ||
const $06fff6f93a1f66aa$export$9ccd2716e53a229b = ()=>$06fff6f93a1f66aa$var$generateRandomString(); | ||
const $06fff6f93a1f66aa$export$cf1891f923f5943a = ()=>$06fff6f93a1f66aa$var$generateRandomString(); | ||
const $06fff6f93a1f66aa$export$414b01b1f867308a = async (codeVerifier)=>{ | ||
const encodedCodeVerifier = new TextEncoder().encode(codeVerifier); | ||
// TODO: crypto related to linear issue LOG-1517 | ||
const codeChallenge = new Uint8Array(await crypto.subtle.digest("SHA-256", encodedCodeVerifier)); | ||
return (0, $eVySA$jsbase64.fromUint8Array)(codeChallenge, true); | ||
}; | ||
var $c2fd0c04c48199e2$exports = {}; | ||
$parcel$export($c2fd0c04c48199e2$exports, "verifyIdToken", () => $c2fd0c04c48199e2$export$b5b3317c8aecbcd5); | ||
$parcel$export($c2fd0c04c48199e2$exports, "decodeIdToken", () => $c2fd0c04c48199e2$export$aac2d5b7f5cd16d5); | ||
const $c2fd0c04c48199e2$var$issuedAtTimeTolerance = 60; | ||
/** | ||
* @link [ID Token](https://openid.net/specs/openid-connect-core-1_0.html#IDToken) | ||
*/ const $c2fd0c04c48199e2$var$IdTokenClaimsSchema = $eVySA$superstruct.type({ | ||
iss: $eVySA$superstruct.string(), | ||
sub: $eVySA$superstruct.string(), | ||
aud: $eVySA$superstruct.string(), | ||
exp: $eVySA$superstruct.number(), | ||
iat: $eVySA$superstruct.number(), | ||
at_hash: $eVySA$superstruct.nullable($eVySA$superstruct.optional($eVySA$superstruct.string())), | ||
name: $eVySA$superstruct.nullable($eVySA$superstruct.optional($eVySA$superstruct.string())), | ||
username: $eVySA$superstruct.nullable($eVySA$superstruct.optional($eVySA$superstruct.string())), | ||
avatar: $eVySA$superstruct.nullable($eVySA$superstruct.optional($eVySA$superstruct.string())), | ||
role_names: $eVySA$superstruct.nullable($eVySA$superstruct.optional($eVySA$superstruct.array($eVySA$superstruct.string()))) | ||
}); | ||
const $c2fd0c04c48199e2$export$b5b3317c8aecbcd5 = async (idToken, clientId, issuer, jwks)=>{ | ||
const result = await (0, $eVySA$jose.jwtVerify)(idToken, jwks, { | ||
audience: clientId, | ||
issuer: issuer | ||
}); | ||
if (Math.abs((result.payload.iat ?? 0) - Date.now() / 1000) > $c2fd0c04c48199e2$var$issuedAtTimeTolerance) throw new (0, $47fe17290a91cd19$export$ba60d77e6748b659)("id_token.invalid_iat"); | ||
}; | ||
const $c2fd0c04c48199e2$export$aac2d5b7f5cd16d5 = (token)=>{ | ||
const { 1: encodedPayload } = token.split("."); | ||
if (!encodedPayload) throw new (0, $47fe17290a91cd19$export$ba60d77e6748b659)("id_token.invalid_token"); | ||
const json = (0, $eVySA$silverhandessentials.UrlSafeBase64).decode(encodedPayload); | ||
const idTokenClaims = JSON.parse(json); | ||
$eVySA$superstruct.assert(idTokenClaims, $c2fd0c04c48199e2$var$IdTokenClaimsSchema); | ||
return idTokenClaims; | ||
}; | ||
var $4eeb0328a47154bc$exports = {}; | ||
$parcel$export($4eeb0328a47154bc$exports, "createRequester", () => $4eeb0328a47154bc$export$8d54726fdbf08e0a); | ||
const $4eeb0328a47154bc$export$8d54726fdbf08e0a = (fetchFunction)=>{ | ||
if (!fetchFunction && (0, $eVySA$silverhandessentials.isNode)()) throw new (0, $47fe17290a91cd19$export$ba60d77e6748b659)("requester.not_provide_fetch"); | ||
return async (...args)=>{ | ||
const response = await (fetchFunction ?? fetch)(...args); | ||
if (!response.ok) { | ||
// Expected request error from server | ||
const { code: code , message: message } = await response.json(); | ||
throw new (0, $47fe17290a91cd19$export$e6e15b8ba42b9b70)(code, message); | ||
} | ||
return response.json(); | ||
}; | ||
}; | ||
var $b85bdeea0b1e81a5$exports = {}; | ||
$parcel$export($b85bdeea0b1e81a5$exports, "withReservedScopes", () => $b85bdeea0b1e81a5$export$887ed125f549a57); | ||
const $b85bdeea0b1e81a5$export$887ed125f549a57 = (originalScopes)=>{ | ||
const uniqueScopes = new Set([ | ||
"openid", | ||
"offline_access", | ||
"profile", | ||
...originalScopes ?? [] | ||
]); | ||
return Array.from(uniqueScopes).join(" "); | ||
}; | ||
$parcel$exportWildcard($10615ba3cc8a78f8$exports, $d3a7a037fd1d9433$exports); | ||
$parcel$exportWildcard($10615ba3cc8a78f8$exports, $47fe17290a91cd19$exports); | ||
$parcel$exportWildcard($10615ba3cc8a78f8$exports, $06fff6f93a1f66aa$exports); | ||
$parcel$exportWildcard($10615ba3cc8a78f8$exports, $c2fd0c04c48199e2$exports); | ||
$parcel$exportWildcard($10615ba3cc8a78f8$exports, $4eeb0328a47154bc$exports); | ||
$parcel$exportWildcard($10615ba3cc8a78f8$exports, $b85bdeea0b1e81a5$exports); | ||
const $1e17092ca3413c94$var$codeChallengeMethod = "S256"; | ||
const $1e17092ca3413c94$var$responseType = "code"; | ||
const $1e17092ca3413c94$export$b01a187f12b774c6 = ({ authorizationEndpoint: authorizationEndpoint , clientId: clientId , redirectUri: redirectUri , codeChallenge: codeChallenge , state: state , scopes: scopes , resources: resources , prompt: prompt })=>{ | ||
const urlSearchParameters = new URLSearchParams({ | ||
[(0, $5c367c11270b61f6$export$65f63a8bc3cba53d).ClientId]: clientId, | ||
[(0, $5c367c11270b61f6$export$65f63a8bc3cba53d).RedirectUri]: redirectUri, | ||
[(0, $5c367c11270b61f6$export$65f63a8bc3cba53d).CodeChallenge]: codeChallenge, | ||
[(0, $5c367c11270b61f6$export$65f63a8bc3cba53d).CodeChallengeMethod]: $1e17092ca3413c94$var$codeChallengeMethod, | ||
[(0, $5c367c11270b61f6$export$65f63a8bc3cba53d).State]: state, | ||
[(0, $5c367c11270b61f6$export$65f63a8bc3cba53d).ResponseType]: $1e17092ca3413c94$var$responseType, | ||
[(0, $5c367c11270b61f6$export$65f63a8bc3cba53d).Prompt]: prompt ?? (0, $5c367c11270b61f6$export$83716a4aa1642908).Consent, | ||
[(0, $5c367c11270b61f6$export$65f63a8bc3cba53d).Scope]: (0, $b85bdeea0b1e81a5$export$887ed125f549a57)(scopes) | ||
}); | ||
for (const resource of resources ?? [])urlSearchParameters.append((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).Resource, resource); | ||
return `${authorizationEndpoint}?${urlSearchParameters.toString()}`; | ||
}; | ||
var $1dac903ccb175f85$exports = {}; | ||
$parcel$export($1dac903ccb175f85$exports, "generateSignOutUri", () => $1dac903ccb175f85$export$b3c9a2bd2330de28); | ||
const $1dac903ccb175f85$export$b3c9a2bd2330de28 = ({ endSessionEndpoint: endSessionEndpoint , idToken: idToken , postLogoutRedirectUri: postLogoutRedirectUri })=>{ | ||
const urlSearchParameters = new URLSearchParams({ | ||
[(0, $5c367c11270b61f6$export$65f63a8bc3cba53d).IdTokenHint]: idToken | ||
}); | ||
if (postLogoutRedirectUri) urlSearchParameters.append((0, $5c367c11270b61f6$export$65f63a8bc3cba53d).PostLogoutRedirectUri, postLogoutRedirectUri); | ||
return `${endSessionEndpoint}?${urlSearchParameters.toString()}`; | ||
}; | ||
$parcel$exportWildcard($a722dce254028e46$exports, $e6b305c1e572373d$exports); | ||
$parcel$exportWildcard($a722dce254028e46$exports, $945b1d0ce7f8f44a$exports); | ||
$parcel$exportWildcard($a722dce254028e46$exports, $de840481123b2c25$exports); | ||
$parcel$exportWildcard($a722dce254028e46$exports, $1e17092ca3413c94$exports); | ||
$parcel$exportWildcard($a722dce254028e46$exports, $1dac903ccb175f85$exports); | ||
$parcel$exportWildcard(module.exports, $a722dce254028e46$exports); | ||
$parcel$exportWildcard(module.exports, $10615ba3cc8a78f8$exports); | ||
$parcel$exportWildcard(module.exports, $5c367c11270b61f6$exports); | ||
//# sourceMappingURL=index.js.map |
{ | ||
"name": "@logto/js", | ||
"version": "0.2.0", | ||
"version": "1.0.0-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", | ||
@@ -36,2 +42,5 @@ "test": "jest", | ||
"@jest/types": "^27.5.1", | ||
"@parcel/core": "^2.6.2", | ||
"@parcel/packager-ts": "^2.6.2", | ||
"@parcel/transformer-typescript-types": "^2.6.2", | ||
"@peculiar/webcrypto": "^1.1.7", | ||
@@ -49,2 +58,3 @@ "@silverhand/eslint-config": "^0.14.0", | ||
"node-fetch": "^2.6.7", | ||
"parcel": "^2.6.2", | ||
"prettier": "^2.3.2", | ||
@@ -63,3 +73,3 @@ "text-encoder": "^0.0.4", | ||
}, | ||
"gitHead": "5166ae926de86816f29229f18bc756f3b17fb57b" | ||
"gitHead": "e7bebf027d400960ac6ef1d63ed84656aa6d1c62" | ||
} |
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
100658
782
22
8
3