UNPKG

electron-oauth-helper

Version:

Easy to use helper library for OAuth1 and OAuth2.

192 lines 8.93 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; 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) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var crypto_1 = __importDefault(require("crypto")); var url_1 = __importDefault(require("url")); var utils_1 = require("../utils"); var querystring_1 = __importDefault(require("querystring")); var createSignature = function (method, url, parameter, consumer_secret, token_secret) { var sorted = Object.keys(parameter) .map(function (key) { return { key: encodeURIComponent(key), value: encodeURIComponent(parameter[key]), }; }) .sort(function (a, b) { return a.key.localeCompare(b.key); }); var output = sorted.reduce(function (prev, current) { if (prev.length !== 0) { prev = prev + "&"; } return "" + prev + current.key + "=" + current.value; }, ""); var signatureBaseString = method.toUpperCase() + "&" + encodeURIComponent(url) + "&" + encodeURIComponent(output); var signKey = createSignKey(consumer_secret, token_secret); var signature = crypto_1.default .createHmac("sha1", signKey) .update(signatureBaseString) .digest("base64"); return signature; }; var createSignKey = function (consumer_secret, token_secret) { var encoded_cs = encodeURIComponent(consumer_secret || ""); var encoded_ts = encodeURIComponent(token_secret || ""); return encoded_cs + "&" + encoded_ts; }; var createOAuthHeader = function (request) { var INIT = "OAuth "; var dst = Object.keys(request) .sort(function (a, b) { return a.localeCompare(b); }) .reduce(function (prev, current) { // eslint-disable-next-line if (!request[current]) { return prev; } var ekey = encodeURIComponent(current); // eslint-disable-next-line var evalue = "\"" + encodeURIComponent(request[current]) + "\""; if (prev !== INIT) { prev = prev + ", "; } return "" + prev + ekey + "=" + evalue; }, INIT); return dst; }; var makeOAuthParameter = function (parameter) { var cloned = __assign({}, parameter); cloned.oauth_timestamp = parameter.oauth_timestamp || Math.floor(new Date().getTime() / 1000); cloned.oauth_version = parameter.oauth_version || "1.0"; cloned.oauth_nonce = cloned.oauth_nonce || crypto_1.default .createHash("sha256") .update("" + parameter) .digest("base64"); cloned.oauth_signature_method = parameter.oauth_signature_method || "HMAC-SHA1"; cloned.oauth_consumer_key = parameter.oauth_consumer_key; return cloned; }; // Step 1 // needs oauth_callback, oauth_consumer_key exports.requestOAuthToken = function (url, config) { return __awaiter(void 0, void 0, void 0, function () { var parameter, signature, oauthHeader, resp, body; return __generator(this, function (_a) { switch (_a.label) { case 0: parameter = makeOAuthParameter(config); signature = createSignature("POST", url, parameter, config.oauth_consumer_secret); parameter.oauth_signature = signature; oauthHeader = createOAuthHeader(parameter); return [4 /*yield*/, utils_1.postRequest({ url: url, headers: { Authorization: oauthHeader }, })]; case 1: resp = _a.sent(); body = querystring_1.default.parse(resp.body); if (typeof body.oauth_token === "string") { return [2 /*return*/, Promise.resolve(body.oauth_token)]; } return [2 /*return*/, Promise.reject(new Error("A response does not include oauth_token"))]; } }); }); }; // Step 2 exports.redirectAuthPage = function (url, // authenticate_url config, oauth_token, window) { return __awaiter(void 0, void 0, void 0, function () { var pageUrl, resp, query; return __generator(this, function (_a) { switch (_a.label) { case 0: pageUrl = url + "?oauth_token=" + oauth_token; window.loadURL(pageUrl); return [4 /*yield*/, utils_1.awaitRedirect(config.oauth_callback, window.webContents.session.webRequest)]; case 1: resp = _a.sent(); query = url_1.default.parse(resp, true).query; if (typeof query.oauth_token === "string" && typeof query.oauth_verifier === "string" && query.oauth_token !== "denied") { return [2 /*return*/, Promise.resolve(query)]; } return [2 /*return*/, Promise.reject(new Error("User denied or invalid response"))]; } }); }); }; // Step 3 exports.requestAccessToken = function (url, // access_token_url config, oauth_token, oauth_verifier) { return __awaiter(void 0, void 0, void 0, function () { var parameter, signature, oauthHeader, resp; return __generator(this, function (_a) { switch (_a.label) { case 0: parameter = makeOAuthParameter(__assign({ oauth_token: oauth_token }, config)); signature = createSignature("POST", url, parameter); parameter.oauth_signature = signature; oauthHeader = createOAuthHeader(parameter); return [4 /*yield*/, utils_1.postRequest({ url: url, headers: { Authorization: oauthHeader }, }, querystring_1.default.stringify({ oauth_verifier: oauth_verifier }))]; case 1: resp = _a.sent(); return [2 /*return*/, Promise.resolve(querystring_1.default.parse(resp.body))]; } }); }); }; //# sourceMappingURL=helper.js.map