Comparing version 0.1.2-rc.0 to 0.1.2-rc.1
"use strict"; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __generator = (this && this.__generator) || function (thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
@@ -43,62 +7,40 @@ return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
exports.fetchTokenByRefreshToken = exports.fetchTokenByAuthorizationCode = void 0; | ||
var camelcase_keys_1 = __importDefault(require("camelcase-keys")); | ||
var consts_1 = require("../consts"); | ||
var fetchTokenByAuthorizationCode = function (_a, requester) { | ||
var clientId = _a.clientId, tokenEndpoint = _a.tokenEndpoint, redirectUri = _a.redirectUri, codeVerifier = _a.codeVerifier, code = _a.code, resource = _a.resource; | ||
return __awaiter(void 0, void 0, void 0, function () { | ||
var parameters, snakeCaseCodeTokenResponse; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: | ||
parameters = new URLSearchParams(); | ||
parameters.append(consts_1.QueryKey.ClientId, clientId); | ||
parameters.append(consts_1.QueryKey.Code, code); | ||
parameters.append(consts_1.QueryKey.CodeVerifier, codeVerifier); | ||
parameters.append(consts_1.QueryKey.RedirectUri, redirectUri); | ||
parameters.append(consts_1.QueryKey.GrantType, consts_1.TokenGrantType.AuthorizationCode); | ||
if (resource) { | ||
parameters.append(consts_1.QueryKey.Resource, resource); | ||
} | ||
return [4 /*yield*/, requester(tokenEndpoint, { | ||
method: 'POST', | ||
headers: consts_1.ContentType.formUrlEncoded, | ||
body: parameters, | ||
})]; | ||
case 1: | ||
snakeCaseCodeTokenResponse = _b.sent(); | ||
return [2 /*return*/, (0, camelcase_keys_1.default)(snakeCaseCodeTokenResponse)]; | ||
} | ||
}); | ||
const camelcase_keys_1 = __importDefault(require("camelcase-keys")); | ||
const consts_1 = require("../consts"); | ||
const fetchTokenByAuthorizationCode = async ({ clientId, tokenEndpoint, redirectUri, codeVerifier, code, resource, }, requester) => { | ||
const parameters = new URLSearchParams(); | ||
parameters.append(consts_1.QueryKey.ClientId, clientId); | ||
parameters.append(consts_1.QueryKey.Code, code); | ||
parameters.append(consts_1.QueryKey.CodeVerifier, codeVerifier); | ||
parameters.append(consts_1.QueryKey.RedirectUri, redirectUri); | ||
parameters.append(consts_1.QueryKey.GrantType, consts_1.TokenGrantType.AuthorizationCode); | ||
if (resource) { | ||
parameters.append(consts_1.QueryKey.Resource, resource); | ||
} | ||
const snakeCaseCodeTokenResponse = await requester(tokenEndpoint, { | ||
method: 'POST', | ||
headers: consts_1.ContentType.formUrlEncoded, | ||
body: parameters, | ||
}); | ||
return (0, camelcase_keys_1.default)(snakeCaseCodeTokenResponse); | ||
}; | ||
exports.fetchTokenByAuthorizationCode = fetchTokenByAuthorizationCode; | ||
var fetchTokenByRefreshToken = function (_a, requester) { | ||
var clientId = _a.clientId, tokenEndpoint = _a.tokenEndpoint, refreshToken = _a.refreshToken, resource = _a.resource, scopes = _a.scopes; | ||
return __awaiter(void 0, void 0, void 0, function () { | ||
var parameters, snakeCaseRefreshTokenTokenResponse; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: | ||
parameters = new URLSearchParams(); | ||
parameters.append(consts_1.QueryKey.ClientId, clientId); | ||
parameters.append(consts_1.QueryKey.RefreshToken, refreshToken); | ||
parameters.append(consts_1.QueryKey.GrantType, consts_1.TokenGrantType.RefreshToken); | ||
if (resource) { | ||
parameters.append(consts_1.QueryKey.Resource, resource); | ||
} | ||
if (scopes === null || scopes === void 0 ? void 0 : scopes.length) { | ||
parameters.append(consts_1.QueryKey.Scope, scopes.join(' ')); | ||
} | ||
return [4 /*yield*/, requester(tokenEndpoint, { | ||
method: 'POST', | ||
headers: consts_1.ContentType.formUrlEncoded, | ||
body: parameters, | ||
})]; | ||
case 1: | ||
snakeCaseRefreshTokenTokenResponse = _b.sent(); | ||
return [2 /*return*/, (0, camelcase_keys_1.default)(snakeCaseRefreshTokenTokenResponse)]; | ||
} | ||
}); | ||
const fetchTokenByRefreshToken = async ({ clientId, tokenEndpoint, refreshToken, resource, scopes }, requester) => { | ||
const parameters = new URLSearchParams(); | ||
parameters.append(consts_1.QueryKey.ClientId, clientId); | ||
parameters.append(consts_1.QueryKey.RefreshToken, refreshToken); | ||
parameters.append(consts_1.QueryKey.GrantType, consts_1.TokenGrantType.RefreshToken); | ||
if (resource) { | ||
parameters.append(consts_1.QueryKey.Resource, resource); | ||
} | ||
if (scopes?.length) { | ||
parameters.append(consts_1.QueryKey.Scope, scopes.join(' ')); | ||
} | ||
const snakeCaseRefreshTokenTokenResponse = await requester(tokenEndpoint, { | ||
method: 'POST', | ||
headers: consts_1.ContentType.formUrlEncoded, | ||
body: parameters, | ||
}); | ||
return (0, camelcase_keys_1.default)(snakeCaseRefreshTokenTokenResponse); | ||
}; | ||
exports.fetchTokenByRefreshToken = fetchTokenByRefreshToken; |
"use strict"; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __generator = (this && this.__generator) || function (thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
@@ -43,12 +7,5 @@ return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
exports.fetchOidcConfig = exports.discoveryPath = void 0; | ||
var camelcase_keys_1 = __importDefault(require("camelcase-keys")); | ||
const camelcase_keys_1 = __importDefault(require("camelcase-keys")); | ||
exports.discoveryPath = '/oidc/.well-known/openid-configuration'; | ||
var fetchOidcConfig = function (endpoint, requester) { return __awaiter(void 0, void 0, void 0, function () { var _a; return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: | ||
_a = camelcase_keys_1.default; | ||
return [4 /*yield*/, requester(endpoint)]; | ||
case 1: return [2 /*return*/, _a.apply(void 0, [_b.sent()])]; | ||
} | ||
}); }); }; | ||
const fetchOidcConfig = async (endpoint, requester) => (0, camelcase_keys_1.default)(await requester(endpoint)); | ||
exports.fetchOidcConfig = fetchOidcConfig; |
"use strict"; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __generator = (this && this.__generator) || function (thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.revoke = void 0; | ||
var consts_1 = require("../consts"); | ||
var revoke = function (revocationEndpoint, clientId, token, requester) { return __awaiter(void 0, void 0, void 0, function () { | ||
var _a; | ||
return __generator(this, function (_b) { | ||
return [2 /*return*/, requester(revocationEndpoint, { | ||
method: 'POST', | ||
headers: consts_1.ContentType.formUrlEncoded, | ||
body: new URLSearchParams((_a = {}, | ||
_a[consts_1.QueryKey.ClientId] = clientId, | ||
_a[consts_1.QueryKey.Token] = token, | ||
_a)), | ||
})]; | ||
}); | ||
}); }; | ||
const consts_1 = require("../consts"); | ||
const revoke = async (revocationEndpoint, clientId, token, requester) => requester(revocationEndpoint, { | ||
method: 'POST', | ||
headers: consts_1.ContentType.formUrlEncoded, | ||
body: new URLSearchParams({ | ||
[consts_1.QueryKey.ClientId]: clientId, | ||
[consts_1.QueryKey.Token]: token, | ||
}), | ||
}); | ||
exports.revoke = revoke; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.generateSignInUri = void 0; | ||
var consts_1 = require("../consts"); | ||
var utils_1 = require("../utils"); | ||
var codeChallengeMethod = 'S256'; | ||
var prompt = 'consent'; | ||
var responseType = 'code'; | ||
var generateSignInUri = function (_a) { | ||
var _b; | ||
var authorizationEndpoint = _a.authorizationEndpoint, clientId = _a.clientId, redirectUri = _a.redirectUri, codeChallenge = _a.codeChallenge, state = _a.state, scopes = _a.scopes, resources = _a.resources; | ||
var urlSearchParameters = new URLSearchParams((_b = {}, | ||
_b[consts_1.QueryKey.ClientId] = clientId, | ||
_b[consts_1.QueryKey.RedirectUri] = redirectUri, | ||
_b[consts_1.QueryKey.CodeChallenge] = codeChallenge, | ||
_b[consts_1.QueryKey.CodeChallengeMethod] = codeChallengeMethod, | ||
_b[consts_1.QueryKey.State] = state, | ||
_b[consts_1.QueryKey.ResponseType] = responseType, | ||
_b[consts_1.QueryKey.Prompt] = prompt, | ||
_b[consts_1.QueryKey.Scope] = (0, utils_1.withReservedScopes)(scopes), | ||
_b)); | ||
for (var _i = 0, _c = resources !== null && resources !== void 0 ? resources : []; _i < _c.length; _i++) { | ||
var resource = _c[_i]; | ||
const consts_1 = require("../consts"); | ||
const utils_1 = require("../utils"); | ||
const codeChallengeMethod = 'S256'; | ||
const prompt = 'consent'; | ||
const responseType = 'code'; | ||
const generateSignInUri = ({ authorizationEndpoint, clientId, redirectUri, codeChallenge, state, scopes, resources, }) => { | ||
const urlSearchParameters = new URLSearchParams({ | ||
[consts_1.QueryKey.ClientId]: clientId, | ||
[consts_1.QueryKey.RedirectUri]: redirectUri, | ||
[consts_1.QueryKey.CodeChallenge]: codeChallenge, | ||
[consts_1.QueryKey.CodeChallengeMethod]: codeChallengeMethod, | ||
[consts_1.QueryKey.State]: state, | ||
[consts_1.QueryKey.ResponseType]: responseType, | ||
[consts_1.QueryKey.Prompt]: prompt, | ||
[consts_1.QueryKey.Scope]: (0, utils_1.withReservedScopes)(scopes), | ||
}); | ||
for (const resource of resources ?? []) { | ||
urlSearchParameters.append(consts_1.QueryKey.Resource, resource); | ||
} | ||
return "".concat(authorizationEndpoint, "?").concat(urlSearchParameters.toString()); | ||
return `${authorizationEndpoint}?${urlSearchParameters.toString()}`; | ||
}; | ||
exports.generateSignInUri = generateSignInUri; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.generateSignOutUri = void 0; | ||
var consts_1 = require("../consts"); | ||
var generateSignOutUri = function (_a) { | ||
var _b; | ||
var endSessionEndpoint = _a.endSessionEndpoint, idToken = _a.idToken, postLogoutRedirectUri = _a.postLogoutRedirectUri; | ||
var urlSearchParameters = new URLSearchParams((_b = {}, _b[consts_1.QueryKey.IdTokenHint] = idToken, _b)); | ||
const consts_1 = require("../consts"); | ||
const generateSignOutUri = ({ endSessionEndpoint, idToken, postLogoutRedirectUri, }) => { | ||
const urlSearchParameters = new URLSearchParams({ [consts_1.QueryKey.IdTokenHint]: idToken }); | ||
if (postLogoutRedirectUri) { | ||
urlSearchParameters.append(consts_1.QueryKey.PostLogoutRedirectUri, postLogoutRedirectUri); | ||
} | ||
return "".concat(endSessionEndpoint, "?").concat(urlSearchParameters.toString()); | ||
return `${endSessionEndpoint}?${urlSearchParameters.toString()}`; | ||
}; | ||
exports.generateSignOutUri = generateSignOutUri; |
"use strict"; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __generator = (this && this.__generator) || function (thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.fetchUserInfo = void 0; | ||
var fetchUserInfo = function (userInfoEndpoint, accessToken, requester) { return __awaiter(void 0, void 0, void 0, function () { | ||
return __generator(this, function (_a) { | ||
return [2 /*return*/, requester(userInfoEndpoint, { | ||
headers: { Authorization: "Bearer ".concat(accessToken) }, | ||
})]; | ||
}); | ||
}); }; | ||
const fetchUserInfo = async (userInfoEndpoint, accessToken, requester) => requester(userInfoEndpoint, { | ||
headers: { Authorization: `Bearer ${accessToken}` }, | ||
}); | ||
exports.fetchUserInfo = fetchUserInfo; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.verifyAndParseCodeFromCallbackUri = exports.parseUriParameters = void 0; | ||
var consts_1 = require("../consts"); | ||
var errors_1 = require("./errors"); | ||
var parseUriParameters = function (uri) { | ||
var _a = uri.split('?'), _b = _a[1], queryString = _b === void 0 ? '' : _b; | ||
const consts_1 = require("../consts"); | ||
const errors_1 = require("./errors"); | ||
const parseUriParameters = (uri) => { | ||
const [, queryString = ''] = uri.split('?'); | ||
return new URLSearchParams(queryString); | ||
}; | ||
exports.parseUriParameters = parseUriParameters; | ||
var verifyAndParseCodeFromCallbackUri = function (callbackUri, redirectUri, state) { | ||
const verifyAndParseCodeFromCallbackUri = (callbackUri, redirectUri, state) => { | ||
if (!callbackUri.startsWith(redirectUri)) { | ||
throw new errors_1.LogtoError('callback_uri_verification.redirect_uri_mismatched'); | ||
} | ||
var uriParameters = (0, exports.parseUriParameters)(callbackUri); | ||
var error = uriParameters.get(consts_1.QueryKey.Error); | ||
var errorDescription = uriParameters.get(consts_1.QueryKey.ErrorDescription); | ||
const uriParameters = (0, exports.parseUriParameters)(callbackUri); | ||
const error = uriParameters.get(consts_1.QueryKey.Error); | ||
const errorDescription = uriParameters.get(consts_1.QueryKey.ErrorDescription); | ||
if (error) { | ||
throw new errors_1.LogtoError('callback_uri_verification.error_found', { | ||
error: error, | ||
errorDescription: errorDescription, | ||
error, | ||
errorDescription, | ||
}); | ||
} | ||
var stateFromCallbackUri = uriParameters.get(consts_1.QueryKey.State); | ||
const stateFromCallbackUri = uriParameters.get(consts_1.QueryKey.State); | ||
if (!stateFromCallbackUri) { | ||
@@ -31,3 +31,3 @@ throw new errors_1.LogtoError('callback_uri_verification.missing_state'); | ||
} | ||
var code = uriParameters.get(consts_1.QueryKey.Code); | ||
const code = uriParameters.get(consts_1.QueryKey.Code); | ||
if (!code) { | ||
@@ -34,0 +34,0 @@ throw new errors_1.LogtoError('callback_uri_verification.missing_code'); |
"use strict"; | ||
var __extends = (this && this.__extends) || (function () { | ||
var extendStatics = function (d, b) { | ||
extendStatics = Object.setPrototypeOf || | ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || | ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; | ||
return extendStatics(d, b); | ||
}; | ||
return function (d, b) { | ||
if (typeof b !== "function" && b !== null) | ||
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); | ||
extendStatics(d, b); | ||
function __() { this.constructor = d; } | ||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); | ||
}; | ||
})(); | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
@@ -22,4 +7,4 @@ return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
exports.LogtoRequestError = exports.LogtoError = void 0; | ||
var lodash_get_1 = __importDefault(require("lodash.get")); | ||
var logtoErrorCodes = Object.freeze({ | ||
const lodash_get_1 = __importDefault(require("lodash.get")); | ||
const logtoErrorCodes = Object.freeze({ | ||
id_token: { | ||
@@ -40,6 +25,6 @@ invalid_iat: 'Invalid issued at time', | ||
}); | ||
var getMessageByErrorCode = function (errorCode) { | ||
const getMessageByErrorCode = (errorCode) => { | ||
// TODO: linear issue LOG-1419 | ||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment | ||
var message = (0, lodash_get_1.default)(logtoErrorCodes, errorCode); | ||
const message = (0, lodash_get_1.default)(logtoErrorCodes, errorCode); | ||
if (typeof message === 'string') { | ||
@@ -50,22 +35,16 @@ return message; | ||
}; | ||
var LogtoError = /** @class */ (function (_super) { | ||
__extends(LogtoError, _super); | ||
function LogtoError(code, data) { | ||
var _this = _super.call(this, getMessageByErrorCode(code)) || this; | ||
_this.code = code; | ||
_this.data = data; | ||
return _this; | ||
class LogtoError extends Error { | ||
constructor(code, data) { | ||
super(getMessageByErrorCode(code)); | ||
this.code = code; | ||
this.data = data; | ||
} | ||
return LogtoError; | ||
}(Error)); | ||
} | ||
exports.LogtoError = LogtoError; | ||
var LogtoRequestError = /** @class */ (function (_super) { | ||
__extends(LogtoRequestError, _super); | ||
function LogtoRequestError(code, message) { | ||
var _this = _super.call(this, message) || this; | ||
_this.code = code; | ||
return _this; | ||
class LogtoRequestError extends Error { | ||
constructor(code, message) { | ||
super(message); | ||
this.code = code; | ||
} | ||
return LogtoRequestError; | ||
}(Error)); | ||
} | ||
exports.LogtoRequestError = LogtoRequestError; |
"use strict"; | ||
/** @link [Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636) */ | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __generator = (this && this.__generator) || function (thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.generateCodeChallenge = exports.generateCodeVerifier = exports.generateState = void 0; | ||
var js_base64_1 = require("js-base64"); | ||
const js_base64_1 = require("js-base64"); | ||
/** | ||
* @param length The length of the raw random data. | ||
*/ | ||
var generateRandomString = function (length) { | ||
if (length === void 0) { length = 64; } | ||
return (0, js_base64_1.fromUint8Array)(crypto.getRandomValues(new Uint8Array(length)), true); | ||
}; | ||
const generateRandomString = (length = 64) => (0, js_base64_1.fromUint8Array)(crypto.getRandomValues(new Uint8Array(length)), true); | ||
/** | ||
* Generates random string for state and encodes them in url safe base64 | ||
*/ | ||
var generateState = function () { return generateRandomString(); }; | ||
const generateState = () => generateRandomString(); | ||
exports.generateState = generateState; | ||
@@ -59,3 +20,3 @@ /** | ||
*/ | ||
var generateCodeVerifier = function () { return generateRandomString(); }; | ||
const generateCodeVerifier = () => generateRandomString(); | ||
exports.generateCodeVerifier = generateCodeVerifier; | ||
@@ -68,16 +29,8 @@ /** | ||
*/ | ||
var generateCodeChallenge = function (codeVerifier) { return __awaiter(void 0, void 0, void 0, function () { | ||
var encodedCodeVerifier, codeChallenge, _a; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: | ||
encodedCodeVerifier = new TextEncoder().encode(codeVerifier); | ||
_a = Uint8Array.bind; | ||
return [4 /*yield*/, crypto.subtle.digest('SHA-256', encodedCodeVerifier)]; | ||
case 1: | ||
codeChallenge = new (_a.apply(Uint8Array, [void 0, _b.sent()]))(); | ||
return [2 /*return*/, (0, js_base64_1.fromUint8Array)(codeChallenge, true)]; | ||
} | ||
}); | ||
}); }; | ||
const generateCodeChallenge = 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, js_base64_1.fromUint8Array)(codeChallenge, true); | ||
}; | ||
exports.generateCodeChallenge = generateCodeChallenge; |
@@ -21,49 +21,13 @@ "use strict"; | ||
}; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __generator = (this && this.__generator) || function (thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.decodeIdToken = exports.verifyIdToken = void 0; | ||
var essentials_1 = require("@silverhand/essentials"); | ||
var jose_1 = require("jose"); | ||
var s = __importStar(require("superstruct")); | ||
var errors_1 = require("./errors"); | ||
var issuedAtTimeTolerance = 60; | ||
const essentials_1 = require("@silverhand/essentials"); | ||
const jose_1 = require("jose"); | ||
const s = __importStar(require("superstruct")); | ||
const errors_1 = require("./errors"); | ||
const issuedAtTimeTolerance = 60; | ||
/** | ||
* @link [ID Token](https://openid.net/specs/openid-connect-core-1_0.html#IDToken) | ||
*/ | ||
var IdTokenClaimsSchema = s.type({ | ||
const IdTokenClaimsSchema = s.type({ | ||
iss: s.string(), | ||
@@ -76,25 +40,16 @@ sub: s.string(), | ||
}); | ||
var verifyIdToken = function (idToken, clientId, issuer, jwks) { return __awaiter(void 0, void 0, void 0, function () { | ||
var result; | ||
var _a; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: return [4 /*yield*/, (0, jose_1.jwtVerify)(idToken, jwks, { audience: clientId, issuer: issuer })]; | ||
case 1: | ||
result = _b.sent(); | ||
if (Math.abs(((_a = result.payload.iat) !== null && _a !== void 0 ? _a : 0) - Date.now() / 1000) > issuedAtTimeTolerance) { | ||
throw new errors_1.LogtoError('id_token.invalid_iat'); | ||
} | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); }; | ||
const verifyIdToken = async (idToken, clientId, issuer, jwks) => { | ||
const result = await (0, jose_1.jwtVerify)(idToken, jwks, { audience: clientId, issuer }); | ||
if (Math.abs((result.payload.iat ?? 0) - Date.now() / 1000) > issuedAtTimeTolerance) { | ||
throw new errors_1.LogtoError('id_token.invalid_iat'); | ||
} | ||
}; | ||
exports.verifyIdToken = verifyIdToken; | ||
var decodeIdToken = function (token) { | ||
var encodedPayload = token.split('.')[1]; | ||
const decodeIdToken = (token) => { | ||
const { 1: encodedPayload } = token.split('.'); | ||
if (!encodedPayload) { | ||
throw new errors_1.LogtoError('id_token.invalid_token'); | ||
} | ||
var json = essentials_1.UrlSafeBase64.decode(encodedPayload); | ||
var idTokenClaims = JSON.parse(json); | ||
const json = essentials_1.UrlSafeBase64.decode(encodedPayload); | ||
const idTokenClaims = JSON.parse(json); | ||
s.assert(idTokenClaims, IdTokenClaimsSchema); | ||
@@ -101,0 +56,0 @@ return idTokenClaims; |
"use strict"; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __generator = (this && this.__generator) || function (thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.createRequester = void 0; | ||
var essentials_1 = require("@silverhand/essentials"); | ||
var errors_1 = require("./errors"); | ||
var createRequester = function (fetchFunction) { | ||
const essentials_1 = require("@silverhand/essentials"); | ||
const errors_1 = require("./errors"); | ||
const createRequester = (fetchFunction) => { | ||
if (!fetchFunction && (0, essentials_1.isNode)()) { | ||
throw new errors_1.LogtoError('requester.not_provide_fetch'); | ||
} | ||
return function () { | ||
var args = []; | ||
for (var _i = 0; _i < arguments.length; _i++) { | ||
args[_i] = arguments[_i]; | ||
return async (...args) => { | ||
const response = await (fetchFunction ?? fetch)(...args); | ||
if (!response.ok) { | ||
// Expected request error from server | ||
const { code, message } = await response.json(); | ||
throw new errors_1.LogtoRequestError(code, message); | ||
} | ||
return __awaiter(void 0, void 0, void 0, function () { | ||
var response, _a, code, message; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: return [4 /*yield*/, (fetchFunction !== null && fetchFunction !== void 0 ? fetchFunction : fetch).apply(void 0, args)]; | ||
case 1: | ||
response = _b.sent(); | ||
if (!!response.ok) return [3 /*break*/, 3]; | ||
return [4 /*yield*/, response.json()]; | ||
case 2: | ||
_a = _b.sent(), code = _a.code, message = _a.message; | ||
throw new errors_1.LogtoRequestError(code, message); | ||
case 3: return [2 /*return*/, response.json()]; | ||
} | ||
}); | ||
}); | ||
return response.json(); | ||
}; | ||
}; | ||
exports.createRequester = createRequester; |
"use strict"; | ||
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { | ||
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { | ||
if (ar || !(i in from)) { | ||
if (!ar) ar = Array.prototype.slice.call(from, 0, i); | ||
ar[i] = from[i]; | ||
} | ||
} | ||
return to.concat(ar || Array.prototype.slice.call(from)); | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -17,6 +8,6 @@ exports.withReservedScopes = void 0; | ||
*/ | ||
var withReservedScopes = function (originalScopes) { | ||
var uniqueScopes = new Set(__spreadArray(['openid', 'offline_access'], (originalScopes !== null && originalScopes !== void 0 ? originalScopes : []), true)); | ||
const withReservedScopes = (originalScopes) => { | ||
const uniqueScopes = new Set(['openid', 'offline_access', ...(originalScopes ?? [])]); | ||
return Array.from(uniqueScopes).join(' '); | ||
}; | ||
exports.withReservedScopes = withReservedScopes; |
{ | ||
"name": "@logto/js", | ||
"version": "0.1.2-rc.0", | ||
"version": "0.1.2-rc.1", | ||
"main": "./lib/index.js", | ||
@@ -10,3 +10,3 @@ "exports": "./lib/index.js", | ||
], | ||
"license": "MPL-2.0", | ||
"license": "MIT", | ||
"scripts": { | ||
@@ -18,6 +18,4 @@ "dev:tsc": "tsc -p tsconfig.build.json -w --preserveWatchOutput", | ||
"lint": "eslint --ext .ts src", | ||
"package": "pnpm build && webpack", | ||
"test": "jest", | ||
"test:coverage": "jest --silent --env=jsdom && jest --silent --coverage", | ||
"report": "WITH_REPORT=true pnpm package", | ||
"prepack": "pnpm test && pnpm build" | ||
@@ -41,3 +39,2 @@ }, | ||
"@types/node": "^17.0.19", | ||
"@types/webpack": "^5.28.0", | ||
"eslint": "^8.9.0", | ||
@@ -53,6 +50,3 @@ "jest": "^27.5.1", | ||
"type-fest": "^2.10.0", | ||
"typescript": "^4.5.5", | ||
"webpack": "^5.58.2", | ||
"webpack-bundle-analyzer": "^4.5.0", | ||
"webpack-cli": "^4.9.1" | ||
"typescript": "^4.5.5" | ||
}, | ||
@@ -66,3 +60,3 @@ "eslintConfig": { | ||
}, | ||
"gitHead": "210b3e1d6f75d59f41b01e9731c8b3e76b87df0a" | ||
"gitHead": "8d5713ffeff62c3d12954e7ce194406f260a9546" | ||
} |
Sorry, the diff of this file is not supported yet
Copyleft License
License(Experimental) Copyleft license information was found.
Found 1 instance in 1 package
Non-permissive License
License(Experimental) A license not known to be considered permissive was found.
Found 1 instance in 1 package
18
0
100
27864
602