@lskjs/auth
Version:
LSK.js – auth – module for authorization by login and password and singup through social networks
1,226 lines (1,217 loc) • 74.6 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.AuthApi = void 0;
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _env = require("@lskjs/env");
var _err = _interopRequireDefault(require("@lskjs/err"));
var _serverApi = _interopRequireDefault(require("@lskjs/server-api"));
var _canonizeParams = _interopRequireDefault(require("@lskjs/utils/canonizeParams"));
var _getReqOrigin = _interopRequireDefault(require("@lskjs/utils/getReqOrigin"));
var _transliterate = _interopRequireDefault(require("@lskjs/utils/transliterate"));
var _validateEmail = _interopRequireDefault(require("@lskjs/utils/validateEmail"));
var _bluebird = _interopRequireDefault(require("bluebird"));
var _get3 = _interopRequireDefault(require("lodash/get"));
var _map = _interopRequireDefault(require("lodash/map"));
var _merge = _interopRequireDefault(require("lodash/merge"));
var _omit = _interopRequireDefault(require("lodash/omit"));
var _random = _interopRequireDefault(require("lodash/random"));
var _set = _interopRequireDefault(require("lodash/set"));
var _unset = _interopRequireDefault(require("lodash/unset"));
var _excluded = ["password"];
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } // import canonizePhone from '@lskjs/utils/canonizePhone';
// import validatePhone from '@lskjs/utils/validatePhone';
var AuthApi = /*#__PURE__*/function (_BaseApi) {
(0, _inherits2["default"])(AuthApi, _BaseApi);
var _super = _createSuper(AuthApi);
function AuthApi() {
var _this;
(0, _classCallCheck2["default"])(this, AuthApi);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
_this.loginCreds = ['username', 'email', 'phone', 'login'];
return _this;
}
(0, _createClass2["default"])(AuthApi, [{
key: "init",
value: function () {
var _init = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return (0, _get2["default"])((0, _getPrototypeOf2["default"])(AuthApi.prototype), "init", this).call(this);
case 2:
_context.next = 4;
return this.app.module('auth');
case 4:
this.authModule = _context.sent;
this.helpers = this.authModule.helpers;
case 6:
case "end":
return _context.stop();
}
}, _callee, this);
}));
function init() {
return _init.apply(this, arguments);
}
return init;
}()
}, {
key: "getRoutes",
value: function getRoutes() {
// const { isAuth } = this.app.middlewares;
return _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(AuthApi.prototype), "getRoutes", this).call(this)), {}, {
'/login': this.login.bind(this),
'/signup': this.signup.bind(this),
// POST
'/updateToken': this.updateToken.bind(this),
'/permit': this.getPermit.bind(this),
// '/confirm': this.confirmPermit.bind(this),
'/permit/confirm': this.confirmPermit.bind(this),
// // '/loginToken': this.loginToken.bind(this),
'/restorePassword': this.restorePassword.bind(this),
// '/setPassword': this.setPassword.bind(this), => confirm
// '/email/confirm': this.confirmEmail.bind(this), // (req, res) => res.redirect('/cabinet'));
// '/phone/code': this.phoneCode.bind(this),
// '/phone/approve': this.phoneApprove.bind(this), => confirm
// '/phone/login': this.phoneLogin.bind(this),
//
'/status': this.status.bind(this),
'/session': this.session.bind(this),
'/check': this.check.bind(this),
// Регистрация пользователя через соц сеть
// '/social': this.getSocials.bind(this), // isAuth,
// '/social/signup': this.socialLogin.bind(this),
// '/social/login': this.socialLogin.bind(this),
// '/social/bind': this.socialBind.bind(this), // Добавление соц.сетей к пользователю // isAuth,
// '/social/unbind': this.socialUnbind.bind(this), // isAuth,
// '/passport/getByToken': this.getPassportByToken.bind(this),
// '/passports/detach': this.passportsDetach.bind(this),
// '/restorePasswordPermit': this.restorePasswordPermit.bind(this),
'/info': this.info.bind(this),
// social auth init
'/:provider': this.socialAuth.bind(this),
'/:provider/auth': this.socialAuth.bind(this),
'/:provider/callback': this.socialCallback.bind(this)
});
}
// getRoutes() {
// return {
// '/login': this.login.bind(this),
// '/accountkit': this.accountkit.bind(this),
// '/facebook': this.facebook.bind(this),
// '/social': this.social.bind(this),
// // '/vkontakte': this.vkontakte.bind(this),
// '/phone': this.phoneOrEmail.bind(this),
// '/email': this.phoneOrEmail.bind(this),
// '/confirm': this.confirm.bind(this),
// '/status': this.status.bind(this),
// '/check': this.check.bind(this),
// };
// }
// async login() {
// return { asd: 12 };
// }
}, {
key: "updateToken",
value: function () {
var _updateToken = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(req) {
var UserModel, userId, user, token;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return this.app.module('models.UserModel');
case 2:
UserModel = _context2.sent;
userId = req.user && req.user._id;
if (userId) {
_context2.next = 6;
break;
}
throw new _err["default"]('auth.tokenIncorrect', {
status: 404
});
case 6:
_context2.next = 8;
return UserModel.findById(userId);
case 8:
user = _context2.sent;
if (user) {
_context2.next = 11;
break;
}
throw new _err["default"]('auth.userNotFound', {
status: 404
});
case 11:
req.user = user;
token = this.helpers.generateAuthToken(user);
_context2.next = 15;
return UserModel.prepare(user, {
req: req,
withAppState: true
});
case 15:
_context2.t0 = _context2.sent;
_context2.t1 = token;
return _context2.abrupt("return", {
user: _context2.t0,
token: _context2.t1
});
case 18:
case "end":
return _context2.stop();
}
}, _callee2, this);
}));
function updateToken(_x) {
return _updateToken.apply(this, arguments);
}
return updateToken;
}()
}, {
key: "status",
value: function () {
var _status = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
return _context3.abrupt("return", {});
case 1:
case "end":
return _context3.stop();
}
}, _callee3);
}));
function status() {
return _status.apply(this, arguments);
}
return status;
}()
}, {
key: "session",
value: function () {
var _session = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(req) {
var authModule;
return _regenerator["default"].wrap(function _callee4$(_context4) {
while (1) switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 2;
return this.app.module('auth');
case 2:
authModule = _context4.sent;
return _context4.abrupt("return", authModule.getAuthSession(req));
case 4:
case "end":
return _context4.stop();
}
}, _callee4, this);
}));
function session(_x2) {
return _session.apply(this, arguments);
}
return session;
}()
}, {
key: "check",
value: function () {
var _check = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(req) {
var criteria, UserModel, user;
return _regenerator["default"].wrap(function _callee5$(_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
criteria = (0, _canonizeParams["default"])(req.data);
if (Object.keys(criteria)) {
_context5.next = 3;
break;
}
throw new _err["default"]('auth.loginRequired', {
status: 400
});
case 3:
_context5.next = 5;
return this.app.module('models.UserModel');
case 5:
UserModel = _context5.sent;
_context5.next = 8;
return UserModel.findOne(criteria).select('_id');
case 8:
user = _context5.sent;
return _context5.abrupt("return", {
exists: !!user
});
case 10:
case "end":
return _context5.stop();
}
}, _callee5, this);
}));
function check(_x3) {
return _check.apply(this, arguments);
}
return check;
}() //
}, {
key: "getUserCriteria",
value: function getUserCriteria(rawParams) {
var _this$loginCreds = this.loginCreds,
loginCreds = _this$loginCreds === void 0 ? [] : _this$loginCreds;
var params = (0, _canonizeParams["default"])(rawParams);
// eslint-disable-next-line no-restricted-syntax
var _iterator = _createForOfIteratorHelper(loginCreds),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var cred = _step.value;
if (loginCreds.includes(cred) && params[cred]) {
return (0, _defineProperty2["default"])({}, cred, params[cred]);
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
throw new _err["default"]('auth.loginEmpty', {
status: 400
});
}
}, {
key: "login",
value: function () {
var _login = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(req) {
var UserModel, password, user, token;
return _regenerator["default"].wrap(function _callee6$(_context6) {
while (1) switch (_context6.prev = _context6.next) {
case 0:
_context6.next = 2;
return this.app.module('models.UserModel');
case 2:
UserModel = _context6.sent;
password = req.data.password;
if (password) {
_context6.next = 6;
break;
}
throw new _err["default"]('auth.passwordEmpty', {
status: 400
});
case 6:
_context6.next = 8;
return UserModel.findOne(this.getUserCriteria(req.data));
case 8:
user = _context6.sent;
if (user) {
_context6.next = 11;
break;
}
throw new _err["default"]('auth.loginIncorrect', {
status: 400
});
case 11:
if (!(0, _get3["default"])(user, 'statuses.blockedAt')) {
_context6.next = 13;
break;
}
throw new _err["default"]('auth.blocked', {
status: 403
});
case 13:
_context6.next = 15;
return this.helpers.verifyPassword(password, user.password);
case 15:
if (_context6.sent) {
_context6.next = 17;
break;
}
throw new _err["default"]('auth.passwordIncorrect', {
status: 400
});
case 17:
req.user = user;
token = this.helpers.generateAuthToken(user); // await this.helpers.updateLoginAt(user);
_context6.t0 = user._id;
_context6.next = 22;
return UserModel.prepare(user, {
req: req,
withAppState: true
});
case 22:
_context6.t1 = _context6.sent;
_context6.t2 = token;
return _context6.abrupt("return", {
_id: _context6.t0,
user: _context6.t1,
token: _context6.t2
});
case 25:
case "end":
return _context6.stop();
}
}, _callee6, this);
}));
function login(_x4) {
return _login.apply(this, arguments);
}
return login;
}()
}, {
key: "signup",
value: function () {
var _signup = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(req) {
var permitModule, UserModel, PermitModel, _req$data, password, userFields, loginParams, criteria, existUser, loginField, user, email, code, permit, token;
return _regenerator["default"].wrap(function _callee7$(_context7) {
while (1) switch (_context7.prev = _context7.next) {
case 0:
_context7.next = 2;
return this.app.module('permit');
case 2:
permitModule = _context7.sent;
_context7.next = 5;
return this.app.module('models.UserModel');
case 5:
UserModel = _context7.sent;
_context7.next = 8;
return this.app.module('models.PermitModel');
case 8:
PermitModel = _context7.sent;
_req$data = req.data, password = _req$data.password, userFields = (0, _objectWithoutProperties2["default"])(_req$data, _excluded);
loginParams = (0, _canonizeParams["default"])(req.data);
criteria = this.getUserCriteria(loginParams);
_context7.next = 14;
return UserModel.findOne(criteria).select('_id');
case 14:
existUser = _context7.sent;
loginField = Object.keys(criteria)[0];
if (!existUser) {
_context7.next = 18;
break;
}
throw new _err["default"]("auth.".concat(loginField, "Exists"), {
status: 400
});
case 18:
user = new UserModel(_objectSpread(_objectSpread({}, userFields), loginParams));
if (!password) {
_context7.next = 22;
break;
}
_context7.next = 22;
return this.helpers.setPassword(user, password);
case 22:
_context7.next = 24;
return user.save();
case 24:
req.user = user;
if (!(loginField === 'email')) {
_context7.next = 34;
break;
}
email = loginParams.email;
_context7.next = 29;
return permitModule.genCode('emailVerify');
case 29:
code = _context7.sent;
_context7.next = 32;
return PermitModel.createPermit({
expiredAt: permitModule.createExpiredAt('emailVerify'),
type: 'auth.confirmEmail',
userId: user._id,
info: {
provider: 'email',
email: email,
userId: user._id
},
code: code
});
case 32:
permit = _context7.sent;
this.app.emit('events.auth.signup', {
type: 'events.auth.signup',
userId: user._id,
user: user,
permit: permit,
email: permit.info.email,
link: this.app.url("/auth/permit?permitId=".concat(permit._id, "&code=").concat(permit.code))
});
case 34:
// const link = (await this.helpers.genereateEmailApprovedLink) ? this.helpers.genereateEmailApprovedLink(user) : null;
// this.app.emit('events.auth.signup', { user, link });
token = this.helpers.generateAuthToken(user);
_context7.t0 = user._id;
_context7.next = 38;
return UserModel.prepare(user, {
req: req,
withAppState: true
});
case 38:
_context7.t1 = _context7.sent;
_context7.t2 = token;
return _context7.abrupt("return", {
signup: true,
_id: _context7.t0,
user: _context7.t1,
token: _context7.t2
});
case 41:
case "end":
return _context7.stop();
}
}, _callee7, this);
}));
function signup(_x5) {
return _signup.apply(this, arguments);
}
return signup;
}()
}, {
key: "permitAction",
value: function () {
var _permitAction = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(_ref2) {
var req, permit, UserModel, PermitModel, user, token, password, _user, _token;
return _regenerator["default"].wrap(function _callee8$(_context8) {
while (1) switch (_context8.prev = _context8.next) {
case 0:
req = _ref2.req, permit = _ref2.permit;
_context8.next = 3;
return this.app.module('models.UserModel');
case 3:
UserModel = _context8.sent;
_context8.next = 6;
return this.app.module('models.PermitModel');
case 6:
PermitModel = _context8.sent;
if (!(permit.type === 'auth.confirmEmail')) {
_context8.next = 20;
break;
}
_context8.next = 10;
return UserModel.findById(permit.userId).sort({
createdAt: 1
});
case 10:
user = _context8.sent;
if (user) {
_context8.next = 13;
break;
}
throw new _err["default"]('!user');
case 13:
_context8.next = 15;
return permit.activate();
case 15:
user.setStatus('confirmEmailAt', new Date());
_context8.next = 18;
return user.save();
case 18:
token = this.helpers.generateAuthToken(user);
return _context8.abrupt("return", _bluebird["default"].props({
__pack: true,
user: UserModel.prepare(user, {
req: req
}),
token: token,
data: {
permit: PermitModel.prepare(permit, {
req: req
})
}
}));
case 20:
if (!(permit.type === 'auth.restorePassword')) {
_context8.next = 36;
break;
}
password = req.data.password;
_context8.next = 24;
return UserModel.findById(permit.userId);
case 24:
_user = _context8.sent;
if (_user) {
_context8.next = 27;
break;
}
throw new _err["default"]('!user');
case 27:
_context8.next = 29;
return permit.activate();
case 29:
_context8.next = 31;
return this.helpers.setPassword(_user, password);
case 31:
_user.setStatus('passwordAt', new Date());
_context8.next = 34;
return _user.save();
case 34:
_token = this.helpers.generateAuthToken(_user);
return _context8.abrupt("return", _bluebird["default"].props({
__pack: true,
user: UserModel.prepare(_user, {
req: req
}),
token: _token,
data: {
permit: PermitModel.prepare(permit, {
req: req
})
}
}));
case 36:
throw new _err["default"]('permit.incorrectType');
case 37:
case "end":
return _context8.stop();
}
}, _callee8, this);
}));
function permitAction(_x6) {
return _permitAction.apply(this, arguments);
}
return permitAction;
}()
}, {
key: "confirmPermit",
value: function () {
var _confirmPermit = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(req) {
var _req$data2, code, permitId, PermitModel, permit, status;
return _regenerator["default"].wrap(function _callee9$(_context9) {
while (1) switch (_context9.prev = _context9.next) {
case 0:
_req$data2 = req.data, code = _req$data2.code, permitId = _req$data2.permitId;
_context9.next = 3;
return this.app.module('models.PermitModel');
case 3:
PermitModel = _context9.sent;
if (code) {
_context9.next = 6;
break;
}
throw new _err["default"]('!code');
case 6:
if (permitId) {
_context9.next = 8;
break;
}
throw new _err["default"]('permit.permitIdEmpty', {
status: 400
});
case 8:
_context9.next = 10;
return PermitModel.findById(permitId);
case 10:
permit = _context9.sent;
if (permit) {
_context9.next = 13;
break;
}
throw new _err["default"]('permit.permitNotFound', {
status: 404
});
case 13:
status = permit.getStatus();
if (!(status !== 'valid')) {
_context9.next = 16;
break;
}
throw new _err["default"]('permit.statusInvalid', {
status: 400,
data: {
status: status
}
});
case 16:
if (!(String(code) !== String(permit.code))) {
_context9.next = 18;
break;
}
throw new _err["default"]('permit.codeInvalid', {
status: 400
});
case 18:
return _context9.abrupt("return", this.permitAction({
req: req,
permit: permit
}));
case 19:
case "end":
return _context9.stop();
}
}, _callee9, this);
}));
function confirmPermit(_x7) {
return _confirmPermit.apply(this, arguments);
}
return confirmPermit;
}()
}, {
key: "restorePassword",
value: function () {
var _restorePassword = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10(req) {
var permitModule, UserModel, PermitModel, email, user, code, permit;
return _regenerator["default"].wrap(function _callee10$(_context10) {
while (1) switch (_context10.prev = _context10.next) {
case 0:
_context10.next = 2;
return this.app.module('permit');
case 2:
permitModule = _context10.sent;
_context10.next = 5;
return this.app.module('models.UserModel');
case 5:
UserModel = _context10.sent;
_context10.next = 8;
return this.app.module('models.PermitModel');
case 8:
PermitModel = _context10.sent;
email = req.data.email;
if (!(!email || !(0, _validateEmail["default"])(email))) {
_context10.next = 12;
break;
}
throw new _err["default"]('auth.emailInvalid');
case 12:
_context10.next = 14;
return UserModel.findOne({
email: email
}).select(['email']);
case 14:
user = _context10.sent;
if (user) {
_context10.next = 17;
break;
}
throw new _err["default"]('auth.userNotFound', {
status: 404
});
case 17:
_context10.next = 19;
return permitModule.genCode('emailVerifyStrong');
case 19:
code = _context10.sent;
_context10.next = 22;
return PermitModel.createPermit({
expiredAt: permitModule.createExpiredAt('emailVerifyStrong'),
type: 'auth.restorePassword',
userId: user._id,
info: {
userId: user._id,
email: email
},
code: code
});
case 22:
permit = _context10.sent;
this.app.emit('events.auth.restorePassword', {
type: 'events.auth.restorePassword',
userId: user._id,
user: user,
permit: permit,
email: email,
link: this.app.url("/auth/permit?permitId=".concat(permit._id, "&code=").concat(permit.code))
});
return _context10.abrupt("return", PermitModel.prepare(permit, {
req: req
}));
case 25:
case "end":
return _context10.stop();
}
}, _callee10, this);
}));
function restorePassword(_x8) {
return _restorePassword.apply(this, arguments);
}
return restorePassword;
}() // async setPassword(req) {
// const UserModel = await this.app.module('models.UserModel');
// cPermit UserModel = await this.app.module('models.PermitModel');
// const { code, password } = req.data;
// if (!code) throw new Err('!code');
// const permit = await PermitModel.findOne({
// type: 'user.restorePassword',
// code,
// });
// if (!permit) throw { code: 'invalidCode' };
// if (permit.activatedAt) throw { code: 'activated' };
// const date = new Date();
// if (date > permit.expiredAt) throw { code: 'expired' };
// const user = await UserModel.findById(permit.userId);
// if (!user) throw new Err('!user');
// await permit.activate();
// await this.helpers.setPassword(user, password);
// set(user, 'private.lastUpdates.password', date);
// user.markModified('private.lastUpdates.password');
// await user.save();
// const token = this.helpers.generateAuthToken(user);
// return Bluebird.props({
// __pack: true,
// user: UserModel.prepare(user, { req }),
// token,
// data: {
// permit: PermitModel.prepare(permit, { req }),
// },
// });
// }
// async silent(req) {
// const UserModel = this.app.models.UserModel || this.app.models.User;
// const { login, params } = canonizeParams(req.data);
// const username = `__s${Date.now()}__`;
// const user = new UserModel({
// username,
// type: 'silent',
// ...params,
// });
// await user.save();
// req.user = user;
// return {
// signup: true,
// user: await UserModel.prepare(user, { req, withAppState: true }),
// token: user.generateAuthToken(),
// };
// }
// async recovery(req) {
// const UserModel = this.app.models.UserModel || this.app.models.User;
// const { mailer } = this.app.modules;
// if (!mailer) throw new Err('Система не может отправить email');
// // const params = req.data;
// const criteria = this.getUserCriteria(req);
// const user = await UserModel.findOne(criteria);
// if (!user) throw new Err('Неверный логин', { status: 404 });
// const email = user.getEmail();
// if (!email) throw new Err('У этого пользователя не был указан емейл для восстановления', { status: 400 });
// const password = UserModel.generatePassword();
// await mailer.send({
// ...user.getMailerParams('primary'),
// template: 'recovery',
// // locale: user.locale || req.locale,
// // to: user.getEmail(),
// params: {
// user: user.toJSON(),
// password,
// },
// });
// await user.setPassword(password);
// await user.save();
// return {
// emailSended: true,
// };
// }
}, {
key: "info",
value: function () {
var _info = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
var authModule;
return _regenerator["default"].wrap(function _callee11$(_context11) {
while (1) switch (_context11.prev = _context11.next) {
case 0:
_context11.next = 2;
return this.app.module('auth');
case 2:
authModule = _context11.sent;
if (authModule) {
_context11.next = 5;
break;
}
return _context11.abrupt("return", []);
case 5:
return _context11.abrupt("return", {
providers: (0, _map["default"])(authModule.strategies, function (strategy, provider) {
return _objectSpread({
provider: provider
}, (0, _omit["default"])(strategy.getInfo(), _env.isDev ? [] : ['settings', 'clientId']));
})
});
case 6:
case "end":
return _context11.stop();
}
}, _callee11, this);
}));
function info() {
return _info.apply(this, arguments);
}
return info;
}()
}, {
key: "socialAuth",
value: function () {
var _socialAuth = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12(req, res, next) {
var authModule, provider, origin, strategy;
return _regenerator["default"].wrap(function _callee12$(_context12) {
while (1) switch (_context12.prev = _context12.next) {
case 0:
_context12.next = 2;
return this.app.module('auth');
case 2:
authModule = _context12.sent;
if (authModule) {
_context12.next = 5;
break;
}
throw new _err["default"]('!authModule');
case 5:
provider = req.params.provider;
origin = (0, _getReqOrigin["default"])(req);
strategy = authModule.strategies[provider];
if (!strategy) next(new _err["default"]('auth.providerInvalid'), {
status: 404,
provider: provider
});
authModule.passportService.authenticate(provider, strategy.getPassportAuthenticateParams({
method: 'auth',
origin: origin
}))(req, res, next);
case 10:
case "end":
return _context12.stop();
}
}, _callee12, this);
}));
function socialAuth(_x9, _x10, _x11) {
return _socialAuth.apply(this, arguments);
}
return socialAuth;
}()
}, {
key: "socialCallback",
value: function () {
var _socialCallback = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14(req, res) {
var authModule, provider;
return _regenerator["default"].wrap(function _callee14$(_context14) {
while (1) switch (_context14.prev = _context14.next) {
case 0:
_context14.next = 2;
return this.app.module('auth');
case 2:
authModule = _context14.sent;
if (authModule) {
_context14.next = 5;
break;
}
throw new _err["default"]('!authModule');
case 5:
provider = req.params.provider;
return _context14.abrupt("return", new _bluebird["default"](function (resolve, reject) {
authModule.passportService.authenticate(provider, authModule.strategies[provider].getPassportAuthenticateParams({
method: 'callback'
}), /*#__PURE__*/function () {
var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13(err, data) {
return _regenerator["default"].wrap(function _callee13$(_context13) {
while (1) switch (_context13.prev = _context13.next) {
case 0:
if (!err) {
_context13.next = 2;
break;
}
return _context13.abrupt("return", reject(err));
case 2:
return _context13.abrupt("return", resolve(res.redirect(data.redirect || '/')));
case 3:
case "end":
return _context13.stop();
}
}, _callee13);
}));
return function (_x14, _x15) {
return _ref3.apply(this, arguments);
};
}())(req);
}));
case 7:
case "end":
return _context14.stop();
}
}, _callee14, this);
}));
function socialCallback(_x12, _x13) {
return _socialCallback.apply(this, arguments);
}
return socialCallback;
}() // ////////////////////////
}, {
key: "socialLogin",
value: function () {
var _socialLogin = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15(req) {
var UserModel, PassportModel, passport, user, params;
return _regenerator["default"].wrap(function _callee15$(_context15) {
while (1) switch (_context15.prev = _context15.next) {
case 0:
UserModel = this.app.models.UserModel || this.app.models.User;
PassportModel = this.app.models.PassportModel || this.app.models.Passport;
_context15.next = 4;
return PassportModel.getByToken(req.data.p);
case 4:
passport = _context15.sent;
_context15.next = 7;
return passport.getUser();
case 7:
user = _context15.sent;
if (user) {
_context15.next = 23;
break;
}
_context15.t0 = _merge["default"];
_context15.t1 = {
profile: passport.profile
};
_context15.next = 13;
return passport.generateUsername(UserModel);
case 13:
_context15.t2 = _context15.sent;
_context15.t3 = {
username: _context15.t2
};
params = (0, _context15.t0)(_context15.t1, _context15.t3);
// console.log({ params });
user = new UserModel(params);
// await user.save();
user.updateFromPassport(passport, {
req: req
});
_context15.next = 20;
return user.save();
case 20:
passport.userId = user._id;
// console.log('passport.save before', passport);
_context15.next = 23;
return passport.save();
case 23:
req.user = user;
_context15.next = 26;
return UserModel.prepare(user, {
req: req,
withAppState: true
});
case 26:
_context15.t4 = _context15.sent;
_context15.t5 = user.generateAuthToken();
return _context15.abrupt("return", {
user: _context15.t4,
token: _context15.t5
});
case 29:
case "end":
return _context15.stop();
}
}, _callee15, this);
}));
function socialLogin(_x16) {
return _socialLogin.apply(this, arguments);
}
return socialLogin;
}()
}, {
key: "socialBind",
value: function () {
var _socialBind = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16(req) {
var checkNotFound, UserModel, PassportModel, userId, passport, user;
return _regenerator["default"].wrap(function _callee16$(_context16) {
while (1) switch (_context16.prev = _context16.next) {
case 0:
checkNotFound = this.app.helpers.checkNotFound;
UserModel = this.app.models.UserModel || this.app.models.User;
PassportModel = this.app.models.PassportModel || this.app.models.Passport;
userId = req.user._id;
_context16.next = 6;
return PassportModel.getByToken(req.data.p).then(checkNotFound);
case 6:
passport = _context16.sent;
_context16.next = 9;
return UserModel.findById(req.user._id).then(checkNotFound);
case 9:
user = _context16.sent;
if (!passport.userId) {
_context16.next = 12;
break;
}
throw new _err["default"]('passport.userId already exist', {
status: 400
});
case 12:
passport.userId = userId;
// user.passports.push(passport._id);
_context16.next = 15;
return passport.save();
case 15:
_context16.next = 17;
return user.updateFromPassport(passport);
case 17:
_context16.next = 19;
return user.save();
case 19:
return _context16.abrupt("return", PassportModel.find({
userId: userId
}));
case 20:
case "end":
return _context16.stop();
}
}, _callee16, this);
}));
function socialBind(_x17) {
return _socialBind.apply(this, arguments);
}
return socialBind;
}()
}, {
key: "getSocials",
value: function () {
var _getSocials = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(req) {
var PassportModel, userId;
return _regenerator["default"].wrap(function _callee17$(_context17) {
while (1) switch (_context17.prev = _context17.next) {
case 0:
PassportModel = this.app.models.PassportModel || this.app.models.Passport;
userId = req.user._id;
return _context17.abrupt("return", PassportModel.find({
userId: userId
}));
case 3:
case "end":
return _context17.stop();
}
}, _callee17, this);
}));
function getSocials(_x18) {
return _getSocials.apply(this, arguments);
}
return getSocials;
}()
}, {
key: "passportsDetach",
value: function () {
var _passportsDetach = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(req) {
var PassportModel, _id, passport;
return _regenerator["default"].wrap(function _callee18$(_context18) {
while (1) switch (_context18.prev = _context18.next) {
case 0:
_context18.next = 2;
return this.isAuth(req);
case 2:
PassportModel = this.app.models.PassportModel;
_id = req.data._id;
_context18.next = 6;
return PassportModel.findById(_id);
case 6:
passport = _context18.sent;
if (!(String(passport.userId) !== String(req.user._id))) {
_context18.next = 9;
break;
}
throw new _err["default"]('!acl');
case 9:
_context18.next = 11;
return PassportModel.deleteOne({
_id: passport._id
});
case 11:
return _context18.abrupt("return", {
ok: 1
});
case 12:
case "end":
return _context18.stop();
}
}, _callee18, this);
}));
function passportsDetach(_x19) {
return _passportsDetach.apply(this, arguments);
}
return passportsDetach;
}()
}, {
key: "socialUnbind",
value: function () {
var _socialUnbind = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19(req) {
var checkNotFound, UserModel, PassportModel, params, userId, user, findParams, passport;
return _regenerator["default"].wrap(function _callee19$(_context19) {
while (1) switch (_context19.prev = _context19.next) {
case 0:
checkNotFound = this.app.helpers.checkNotFound;
UserModel = this.app.models.UserModel || this.app.models.User;
PassportModel = this.app.models.PassportModel || this.app.models.Passport;
params = req.data;
userId = req.user._id;
_context19.next = 7;
return UserModel.findById(req.user._id).then(checkNotFound);
case 7:
user = _context19.sent;
// OR passportId: passport._id
findParams = {};
if (params.passportId) findParams._id = params.passportId;
if (params.provider) findParams.provider = params.provider;
findParams.userId = userId;
if (!(!findParams.passportId && !findParams.provider)) {
_context19.next = 14;
break;
}
throw new _err["default"]('!findParams.passportId && !findParams.provider', {
status: 400
});
case 14:
_context19.next = 16;
return PassportModel.findOne(findParams).then(checkNotFound);
case 16:
passport = _context19.sent;
if (!(passport.userId !== userId)) {
_context19.next = 19;
break;
}
throw new _err["default"]('Wrong user!', {
status: 403
});
case 19:
passport.userId = null;
// user.passports = user.passports.filter((pId) => {
// return pId && pId.toString() !== params.p;
// });
_context19.next = 22;
return passport.save();
case 22:
_context19.next = 24;
return user.save();
case 24:
return _context19.abrupt("return", PassportModel.find({
userId: userId
}));
case 25:
case "end":
return _context19.stop();
}
}, _callee19, this);
}));
function socialUnbind(_x20) {
return _socialUnbind.apply(this, arguments);
}
return socialUnbind;
}()
}, {
key: "tokenLogin",
value: function () {
var _tokenLogin = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20(req) {
var UserModel, token, user;
return _regenerator["default"].wrap(function _callee20$(_context20) {
while (1) switch (_context20.prev = _context20.next) {
case 0: