UNPKG

angularx-social-login

Version:

Social login and authentication module for Angular 4 / 5. Supports authentication with Google and Facebook. Can be extended to other providers also.

763 lines (755 loc) 24.7 kB
import { Injectable, NgModule } from '@angular/core'; import { ReplaySubject, BehaviorSubject } from 'rxjs'; import { CommonModule } from '@angular/common'; /** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var AuthServiceConfig = /** @class */ (function () { function AuthServiceConfig(providers) { this.lazyLoad = false; this.providers = new Map(); for (var i = 0; i < providers.length; i++) { /** @type {?} */ var element = providers[i]; this.providers.set(element.id, element.provider); this.lazyLoad = this.lazyLoad || element.lazyLoad; } } return AuthServiceConfig; }()); var AuthService = /** @class */ (function () { function AuthService(config) { this._user = null; this._authState = new ReplaySubject(1); this._readyState = new BehaviorSubject([]); this.initialized = false; this.providers = config.providers; if (!config.lazyLoad) { this.initialize(); } } Object.defineProperty(AuthService.prototype, "authState", { get: /** * @return {?} */ function () { return this._authState.asObservable(); }, enumerable: true, configurable: true }); Object.defineProperty(AuthService.prototype, "readyState", { /** Provides an array of provider ID's as they become ready */ get: /** * Provides an array of provider ID's as they become ready * @return {?} */ function () { return this._readyState.asObservable(); }, enumerable: true, configurable: true }); /** * @private * @return {?} */ AuthService.prototype.initialize = /** * @private * @return {?} */ function () { var _this = this; this.initialized = true; this.providers.forEach((/** * @param {?} provider * @param {?} key * @return {?} */ function (provider, key) { provider.initialize().then((/** * @return {?} */ function () { /** @type {?} */ var readyProviders = _this._readyState.getValue(); readyProviders.push(key); _this._readyState.next(readyProviders); provider.getLoginStatus().then((/** * @param {?} user * @return {?} */ function (user) { user.provider = key; _this._user = user; _this._authState.next(user); })).catch((/** * @param {?} err * @return {?} */ function (err) { _this._authState.next(null); })); })); })); }; /** * @param {?} providerId * @param {?=} opt * @return {?} */ AuthService.prototype.signIn = /** * @param {?} providerId * @param {?=} opt * @return {?} */ function (providerId, opt) { var _this = this; if (!this.initialized) { this.initialize(); } return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { /** @type {?} */ var providerObject = _this.providers.get(providerId); if (providerObject) { providerObject.signIn(opt).then((/** * @param {?} user * @return {?} */ function (user) { user.provider = providerId; resolve(user); _this._user = user; _this._authState.next(user); })).catch((/** * @param {?} err * @return {?} */ function (err) { reject(err); })); } else { reject(AuthService.ERR_LOGIN_PROVIDER_NOT_FOUND); } })); }; /** * @param {?=} revoke * @return {?} */ AuthService.prototype.signOut = /** * @param {?=} revoke * @return {?} */ function (revoke) { var _this = this; if (revoke === void 0) { revoke = false; } if (!this.initialized) { this.initialize(); } return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { if (!_this._user) { reject(AuthService.ERR_NOT_LOGGED_IN); } else { /** @type {?} */ var providerId = _this._user.provider; /** @type {?} */ var providerObject = _this.providers.get(providerId); if (providerObject) { providerObject.signOut(revoke).then((/** * @return {?} */ function () { resolve(); _this._user = null; _this._authState.next(null); })).catch((/** * @param {?} err * @return {?} */ function (err) { reject(err); })); } else { reject(AuthService.ERR_LOGIN_PROVIDER_NOT_FOUND); } } })); }; AuthService.ERR_LOGIN_PROVIDER_NOT_FOUND = 'Login provider not found'; AuthService.ERR_NOT_LOGGED_IN = 'Not logged in'; AuthService.decorators = [ { type: Injectable }, ]; /** @nocollapse */ AuthService.ctorParameters = function () { return [ { type: AuthServiceConfig } ]; }; return AuthService; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var SocialLoginModule = /** @class */ (function () { function SocialLoginModule() { } /** * @param {?} config * @return {?} */ SocialLoginModule.initialize = /** * @param {?} config * @return {?} */ function (config) { return { ngModule: SocialLoginModule, providers: [ AuthService, { provide: AuthServiceConfig, useValue: config } ] }; }; SocialLoginModule.decorators = [ { type: NgModule, args: [{ imports: [ CommonModule ], providers: [ AuthService ] },] }, ]; return SocialLoginModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var SocialUser = /** @class */ (function () { function SocialUser() { } return SocialUser; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @abstract */ var /** * @abstract */ BaseLoginProvider = /** @class */ (function () { function BaseLoginProvider() { this._readyState = new BehaviorSubject(false); } /** * @protected * @return {?} */ BaseLoginProvider.prototype.onReady = /** * @protected * @return {?} */ function () { var _this = this; return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { _this._readyState.subscribe((/** * @param {?} isReady * @return {?} */ function (isReady) { if (isReady) { resolve(); } })); })); }; /** * @param {?} id * @param {?} src * @param {?} onload * @param {?=} async * @param {?=} inner_text_content * @return {?} */ BaseLoginProvider.prototype.loadScript = /** * @param {?} id * @param {?} src * @param {?} onload * @param {?=} async * @param {?=} inner_text_content * @return {?} */ function (id, src, onload, async, inner_text_content) { if (async === void 0) { async = true; } // get document if platform is only browser if (typeof document !== 'undefined' && !document.getElementById(id)) { /** @type {?} */ var signInJS = document.createElement('script'); signInJS.async = async; signInJS.src = src; signInJS.onload = onload; /* if (inner_text_content) // LinkedIn signInJS.text = inner_text_content; */ document.head.appendChild(signInJS); } }; return BaseLoginProvider; }()); var __extends = (undefined && undefined.__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 (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (undefined && undefined.__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 GoogleLoginProvider = /** @class */ (function (_super) { __extends(GoogleLoginProvider, _super); function GoogleLoginProvider(clientId, opt) { if (opt === void 0) { opt = { scope: 'email' }; } var _this = _super.call(this) || this; _this.clientId = clientId; _this.opt = opt; return _this; } /** * @return {?} */ GoogleLoginProvider.prototype.initialize = /** * @return {?} */ function () { var _this = this; return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { _this.loadScript(GoogleLoginProvider.PROVIDER_ID, 'https://apis.google.com/js/platform.js', (/** * @return {?} */ function () { gapi.load('auth2', (/** * @return {?} */ function () { _this.auth2 = gapi.auth2.init(__assign({}, _this.opt, { client_id: _this.clientId })); _this.auth2.then((/** * @return {?} */ function () { _this._readyState.next(true); resolve(); })).catch((/** * @param {?} err * @return {?} */ function (err) { reject(err); })); })); })); })); }; /** * @return {?} */ GoogleLoginProvider.prototype.getLoginStatus = /** * @return {?} */ function () { var _this = this; return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { _this.onReady().then((/** * @return {?} */ function () { if (_this.auth2.isSignedIn.get()) { /** @type {?} */ var user = new SocialUser(); /** @type {?} */ var profile = _this.auth2.currentUser.get().getBasicProfile(); /** @type {?} */ var token = _this.auth2.currentUser.get().getAuthResponse(true).access_token; /** @type {?} */ var backendToken = _this.auth2.currentUser.get().getAuthResponse(true).id_token; user.id = profile.getId(); user.name = profile.getName(); user.email = profile.getEmail(); user.photoUrl = profile.getImageUrl(); user.firstName = profile.getGivenName(); user.lastName = profile.getFamilyName(); user.authToken = token; user.idToken = backendToken; resolve(user); } else { reject('No user is currently logged in.'); } })); })); }; /** * @param {?=} opt * @return {?} */ GoogleLoginProvider.prototype.signIn = /** * @param {?=} opt * @return {?} */ function (opt) { var _this = this; return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { _this.onReady().then((/** * @return {?} */ function () { /** @type {?} */ var offlineAccess = (opt && opt.offline_access) || (_this.opt && _this.opt.offline_access); /** @type {?} */ var promise = !offlineAccess ? _this.auth2.signIn(opt) : _this.auth2.grantOfflineAccess(opt); promise.then((/** * @param {?} response * @return {?} */ function (response) { /** @type {?} */ var user = new SocialUser(); /** @type {?} */ var profile = _this.auth2.currentUser.get().getBasicProfile(); /** @type {?} */ var token = _this.auth2.currentUser.get().getAuthResponse(true).access_token; /** @type {?} */ var backendToken = _this.auth2.currentUser.get().getAuthResponse(true).id_token; user.id = profile.getId(); user.name = profile.getName(); user.email = profile.getEmail(); user.photoUrl = profile.getImageUrl(); user.firstName = profile.getGivenName(); user.lastName = profile.getFamilyName(); user.authToken = token; user.idToken = backendToken; if (response && response.code) { user.authorizationCode = response.code; } resolve(user); }), (/** * @param {?} closed * @return {?} */ function (closed) { reject('User cancelled login or did not fully authorize.'); })).catch((/** * @param {?} err * @return {?} */ function (err) { reject(err); })); })); })); }; /** * @param {?=} revoke * @return {?} */ GoogleLoginProvider.prototype.signOut = /** * @param {?=} revoke * @return {?} */ function (revoke) { var _this = this; return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { _this.onReady().then((/** * @return {?} */ function () { /** @type {?} */ var signOutPromise; if (revoke) { signOutPromise = _this.auth2.disconnect(); } else { signOutPromise = _this.auth2.signOut(); } signOutPromise.then((/** * @param {?} err * @return {?} */ function (err) { if (err) { reject(err); } else { resolve(); } })).catch((/** * @param {?} err * @return {?} */ function (err) { reject(err); })); })); })); }; GoogleLoginProvider.PROVIDER_ID = 'GOOGLE'; return GoogleLoginProvider; }(BaseLoginProvider)); var __extends$1 = (undefined && undefined.__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 (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var FacebookLoginProvider = /** @class */ (function (_super) { __extends$1(FacebookLoginProvider, _super); function FacebookLoginProvider(clientId, opt, locale, fields, version) { if (opt === void 0) { opt = { scope: 'email,public_profile' }; } if (locale === void 0) { locale = 'en_US'; } if (fields === void 0) { fields = 'name,email,picture,first_name,last_name'; } if (version === void 0) { version = 'v4.0'; } var _this = _super.call(this) || this; _this.clientId = clientId; _this.opt = opt; _this.locale = locale; _this.fields = fields; _this.version = version; return _this; } /** * @return {?} */ FacebookLoginProvider.prototype.initialize = /** * @return {?} */ function () { var _this = this; return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { _this.loadScript(FacebookLoginProvider.PROVIDER_ID, "//connect.facebook.net/" + _this.locale + "/sdk.js", (/** * @return {?} */ function () { FB.init({ appId: _this.clientId, autoLogAppEvents: true, cookie: true, xfbml: true, version: _this.version }); // FB.AppEvents.logPageView(); #FIX for #18 _this._readyState.next(true); resolve(); })); })); }; /** * @return {?} */ FacebookLoginProvider.prototype.getLoginStatus = /** * @return {?} */ function () { var _this = this; return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { _this.onReady().then((/** * @return {?} */ function () { FB.getLoginStatus((/** * @param {?} response * @return {?} */ function (response) { if (response.status === 'connected') { /** @type {?} */ var authResponse_1 = response.authResponse; FB.api("/me?fields=" + _this.fields, (/** * @param {?} fbUser * @return {?} */ function (fbUser) { /** @type {?} */ var user = new SocialUser(); user.id = fbUser.id; user.name = fbUser.name; user.email = fbUser.email; user.photoUrl = 'https://graph.facebook.com/' + fbUser.id + '/picture?type=normal'; user.firstName = fbUser.first_name; user.lastName = fbUser.last_name; user.authToken = authResponse_1.accessToken; user.facebook = fbUser; resolve(user); })); } else { reject('No user is currently logged in.'); } })); })); })); }; /** * @param {?=} opt * @return {?} */ FacebookLoginProvider.prototype.signIn = /** * @param {?=} opt * @return {?} */ function (opt) { var _this = this; return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { _this.onReady().then((/** * @return {?} */ function () { FB.login((/** * @param {?} response * @return {?} */ function (response) { if (response.authResponse) { /** @type {?} */ var authResponse_2 = response.authResponse; FB.api("/me?fields=" + _this.fields, (/** * @param {?} fbUser * @return {?} */ function (fbUser) { /** @type {?} */ var user = new SocialUser(); user.id = fbUser.id; user.name = fbUser.name; user.email = fbUser.email; user.photoUrl = 'https://graph.facebook.com/' + fbUser.id + '/picture?type=normal'; user.firstName = fbUser.first_name; user.lastName = fbUser.last_name; user.authToken = authResponse_2.accessToken; user.facebook = fbUser; resolve(user); })); } else { reject('User cancelled login or did not fully authorize.'); } }), _this.opt); })); })); }; /** * @return {?} */ FacebookLoginProvider.prototype.signOut = /** * @return {?} */ function () { var _this = this; return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { _this.onReady().then((/** * @return {?} */ function () { FB.logout((/** * @param {?} response * @return {?} */ function (response) { resolve(); })); })); })); }; FacebookLoginProvider.PROVIDER_ID = 'FACEBOOK'; return FacebookLoginProvider; }(BaseLoginProvider)); export { AuthService, AuthServiceConfig, FacebookLoginProvider, GoogleLoginProvider, SocialLoginModule, SocialUser, BaseLoginProvider as ɵa }; //# sourceMappingURL=angularx-social-login.es5.js.map