UNPKG

slr-angularx-social-login

Version:

Social login and authentication module for Angular 13. Supports authentication with Google, Facebook, Amazon, and VK. Can be extended to other providers also.

127 lines 17.1 kB
import { BaseLoginProvider } from '../entities/base-login-provider'; import { SocialUser } from '../entities/social-user'; export class GoogleLoginProvider extends BaseLoginProvider { constructor(clientId, initOptions = { scope: 'email' }) { super(); this.clientId = clientId; this.initOptions = initOptions; } initialize() { return new Promise((resolve, reject) => { try { this.loadScript(GoogleLoginProvider.PROVIDER_ID, 'https://apis.google.com/js/platform.js', () => { gapi.load('auth2', () => { this.auth2 = gapi.auth2.init({ ...this.initOptions, client_id: this.clientId, }); this.auth2 .then(() => { resolve(); }) .catch((err) => { reject(err); }); }); }); } catch (err) { reject(err); } }); } getLoginStatus(loginStatusOptions) { const options = { ...this.initOptions, ...loginStatusOptions }; return new Promise((resolve, reject) => { if (this.auth2.isSignedIn.get()) { let user = new SocialUser(); const profile = this.auth2.currentUser.get().getBasicProfile(); const authResponse = this.auth2.currentUser.get().getAuthResponse(true); // get complete authResponse object 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.response = authResponse; const resolveUser = authResponse => { user.authToken = authResponse.access_token; user.idToken = authResponse.id_token; resolve(user); }; if (options.refreshToken) { this.auth2.currentUser.get().reloadAuthResponse().then(resolveUser); } else { const authResponse = this.auth2.currentUser.get().getAuthResponse(true); resolveUser(authResponse); } } else { reject(`No user is currently logged in with ${GoogleLoginProvider.PROVIDER_ID}`); } }); } signIn(signInOptions) { const options = { ...this.initOptions, ...signInOptions }; return new Promise((resolve, reject) => { const offlineAccess = options && options.offline_access; let promise = !offlineAccess ? this.auth2.signIn(signInOptions) : this.auth2.grantOfflineAccess(signInOptions); promise .then((response) => { let user = new SocialUser(); if (response && response.code) { user.authorizationCode = response.code; } else { let profile = this.auth2.currentUser.get().getBasicProfile(); let authResponse = this.auth2.currentUser.get().getAuthResponse(true); let token = authResponse.access_token; let backendToken = authResponse.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; user.response = authResponse; } resolve(user); }, (closed) => { reject(closed); }) .catch((err) => { reject(err); }); }); } signOut(revoke) { return new Promise((resolve, reject) => { let signOutPromise; if (revoke) { signOutPromise = this.auth2.disconnect(); } else { signOutPromise = this.auth2.signOut(); } signOutPromise .then((err) => { if (err) { reject(err); } else { resolve(); } }) .catch((err) => { reject(err); }); }); } } GoogleLoginProvider.PROVIDER_ID = 'GOOGLE'; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLWxvZ2luLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbGliL3NyYy9wcm92aWRlcnMvZ29vZ2xlLWxvZ2luLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUlyRCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsaUJBQWlCO0lBS3hELFlBQ1UsUUFBZ0IsRUFDaEIsY0FBbUIsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO1FBRTdDLEtBQUssRUFBRSxDQUFDO1FBSEEsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUNoQixnQkFBVyxHQUFYLFdBQVcsQ0FBMEI7SUFHL0MsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLElBQUk7Z0JBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FDYixtQkFBbUIsQ0FBQyxXQUFXLEVBQy9CLHdDQUF3QyxFQUN4QyxHQUFHLEVBQUU7b0JBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO3dCQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDOzRCQUMzQixHQUFHLElBQUksQ0FBQyxXQUFXOzRCQUNuQixTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVE7eUJBQ3pCLENBQUMsQ0FBQzt3QkFFSCxJQUFJLENBQUMsS0FBSzs2QkFDUCxJQUFJLENBQUMsR0FBRyxFQUFFOzRCQUNULE9BQU8sRUFBRSxDQUFDO3dCQUNaLENBQUMsQ0FBQzs2QkFDRCxLQUFLLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTs0QkFDbEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxD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LEdBQUcsWUFBWSxDQUFDO2lCQUM5QjtnQkFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEIsQ0FBQyxFQUNELENBQUMsTUFBVyxFQUFFLEVBQUU7Z0JBQ2QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pCLENBQUMsQ0FDRjtpQkFDQSxLQUFLLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDbEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLENBQUMsTUFBZ0I7UUFDdEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxJQUFJLGNBQTRCLENBQUM7WUFFakMsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDMUM7aUJBQU07Z0JBQ0wsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDdkM7WUFFRCxjQUFjO2lCQUNYLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLEdBQUcsRUFBRTtvQkFDUCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ2I7cUJBQU07b0JBQ0wsT0FBTyxFQUFFLENBQUM7aUJBQ1g7WUFDSCxDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2xCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQW5Kc0IsK0JBQVcsR0FBVyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlTG9naW5Qcm92aWRlciB9IGZyb20gJy4uL2VudGl0aWVzL2Jhc2UtbG9naW4tcHJvdmlkZXInO1xuaW1wb3J0IHsgU29jaWFsVXNlciB9IGZyb20gJy4uL2VudGl0aWVzL3NvY2lhbC11c2VyJztcblxuZGVjbGFyZSBsZXQgZ2FwaTogYW55O1xuXG5leHBvcnQgY2xhc3MgR29vZ2xlTG9naW5Qcm92aWRlciBleHRlbmRzIEJhc2VMb2dpblByb3ZpZGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9WSURFUl9JRDogc3RyaW5nID0gJ0dPT0dMRSc7XG5cbiAgcHJvdGVjdGVkIGF1dGgyOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjbGllbnRJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgaW5pdE9wdGlvbnM6IGFueSA9IHsgc2NvcGU6ICdlbWFpbCcgfVxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5sb2FkU2NyaXB0KFxuICAgICAgICAgIEdvb2dsZUxvZ2luUHJvdmlkZXIuUFJPVklERVJfSUQsXG4gICAgICAgICAgJ2h0dHBzOi8vYXBpcy5nb29nbGUuY29tL2pzL3BsYXRmb3JtLmpzJyxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBnYXBpLmxvYWQoJ2F1dGgyJywgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmF1dGgyID0gZ2FwaS5hdXRoMi5pbml0KHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmluaXRPcHRpb25zLFxuICAgICAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5jbGllbnRJZCxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgdGhpcy5hdXRoMlxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0TG9naW5TdGF0dXMobG9naW5TdGF0dXNPcHRpb25zPzogYW55KTogUHJvbWlzZTxTb2NpYWxVc2VyPiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsuLi50aGlzLmluaXRPcHRpb25zLCAuLi5sb2dpblN0YXR1c09wdGlvbnN9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLmF1dGgyLmlzU2lnbmVkSW4uZ2V0KCkpIHtcbiAgICAgICAgbGV0IHVzZXI6IFNvY2lhbFVzZXIgPSBuZXcgU29jaWFsVXNlcigpO1xuXG4gICAgICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLmF1dGgyLmN1cnJlbnRVc2VyLmdldCgpLmdldEJhc2ljUHJvZmlsZSgpO1xuICAgICAgICBjb25zdCBhdXRoUmVzcG9uc2UgPSB0aGlzLmF1dGgyLmN1cnJlbnRVc2VyLmdldCgpLmdldEF1dGhSZXNwb25zZSh0cnVlKTsgIC8vIGdldCBjb21wbGV0ZSBhdXRoUmVzcG9uc2Ugb2JqZWN0XG4gICAgICAgIHVzZXIuaWQgPSBwcm9maWxlLmdldElkKCk7XG4gICAgICAgIHVzZXIubmFtZSA9IHByb2ZpbGUuZ2V0TmFtZSgpO1xuICAgICAgICB1c2VyLmVtYWlsID0gcHJvZmlsZS5nZXRFbWFpbCgpO1xuICAgICAgICB1c2VyLnBob3RvVXJsID0gcHJvZmlsZS5nZXRJbWFnZVVybCgpO1xuICAgICAgICB1c2VyLmZpcnN0TmFtZSA9IHByb2ZpbGUuZ2V0R2l2ZW5OYW1lKCk7XG4gICAgICAgIHVzZXIubGFzdE5hbWUgPSBwcm9maWxlLmdldEZhbWlseU5hbWUoKTtcbiAgICAgICAgdXNlci5yZXNwb25zZSA9IGF1dGhSZXNwb25zZTtcblxuICAgICAgICBjb25zdCByZXNvbHZlVXNlciA9IGF1dGhSZXNwb25zZSA9PiB7XG4gICAgICAgICAgdXNlci5hdXRoVG9rZW4gPSBhdXRoUmVzcG9uc2UuYWNjZXNzX3Rva2VuO1xuICAgICAgICAgIHVzZXIuaWRUb2tlbiA9IGF1dGhSZXNwb25zZS5pZF90b2tlbjtcblxuICAgICAgICAgIHJlc29sdmUodXNlcik7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgdGhpcy5hdXRoMi5jdXJyZW50VXNlci5nZXQoKS5yZWxvYWRBdXRoUmVzcG9uc2UoKS50aGVuKHJlc29sdmVVc2VyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBhdXRoUmVzcG9uc2UgPSB0aGlzLmF1dGgyLmN1cnJlbnRVc2VyLmdldCgpLmdldEF1dGhSZXNwb25zZSh0cnVlKTtcbiAgICAgICAgICByZXNvbHZlVXNlcihhdXRoUmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgYE5vIHVzZXIgaXMgY3VycmVudGx5IGxvZ2dlZCBpbiB3aXRoICR7R29vZ2xlTG9naW5Qcm92aWRlci5QUk9WSURFUl9JRH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzaWduSW4oc2lnbkluT3B0aW9ucz86IGFueSk6IFByb21pc2U8U29jaWFsVXNlcj4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLnRoaXMuaW5pdE9wdGlvbnMsIC4uLnNpZ25Jbk9wdGlvbnMgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvZmZsaW5lQWNjZXNzOiBib29sZWFuID0gb3B0aW9ucyAmJiBvcHRpb25zLm9mZmxpbmVfYWNjZXNzO1xuICAgICAgbGV0IHByb21pc2UgPSAhb2ZmbGluZUFjY2Vzc1xuICAgICAgICA/IHRoaXMuYXV0aDIuc2lnbkluKHNpZ25Jbk9wdGlvbnMpXG4gICAgICAgIDogdGhpcy5hdXRoMi5ncmFudE9mZmxpbmVBY2Nlc3Moc2lnbkluT3B0aW9ucyk7XG5cbiAgICAgIHByb21pc2VcbiAgICAgICAgLnRoZW4oXG4gICAgICAgICAgKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGxldCB1c2VyOiBTb2NpYWxVc2VyID0gbmV3IFNvY2lhbFVzZXIoKTtcblxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmNvZGUpIHtcbiAgICAgICAgICAgICAgdXNlci5hdXRob3JpemF0aW9uQ29kZSA9IHJlc3BvbnNlLmNvZGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsZXQgcHJvZmlsZSA9IHRoaXMuYXV0aDIuY3VycmVudFVzZXIuZ2V0KCkuZ2V0QmFzaWNQcm9maWxlKCk7XG4gICAgICAgICAgICAgIGxldCBhdXRoUmVzcG9uc2UgPSB0aGlzLmF1dGgyLmN1cnJlbnRVc2VyLmdldCgpLmdldEF1dGhSZXNwb25zZSh0cnVlKTtcblxuICAgICAgICAgICAgICBsZXQgdG9rZW4gPSBhdXRoUmVzcG9uc2UuYWNjZXNzX3Rva2VuO1xuICAgICAgICAgICAgICBsZXQgYmFja2VuZFRva2VuID0gYXV0aFJlc3BvbnNlLmlkX3Rva2VuO1xuXG4gICAgICAgICAgICAgIHVzZXIuaWQgPSBwcm9maWxlLmdldElkKCk7XG4gICAgICAgICAgICAgIHVzZXIubmFtZSA9IHByb2ZpbGUuZ2V0TmFtZSgpO1xuICAgICAgICAgICAgICB1c2VyLmVtYWlsID0gcHJvZmlsZS5nZXRFbWFpbCgpO1xuICAgICAgICAgICAgICB1c2VyLnBob3RvVXJsID0gcHJvZmlsZS5nZXRJbWFnZVVybCgpO1xuICAgICAgICAgICAgICB1c2VyLmZpcnN0TmFtZSA9IHByb2ZpbGUuZ2V0R2l2ZW5OYW1lKCk7XG4gICAgICAgICAgICAgIHVzZXIubGFzdE5hbWUgPSBwcm9maWxlLmdldEZhbWlseU5hbWUoKTtcbiAgICAgICAgICAgICAgdXNlci5hdXRoVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgdXNlci5pZFRva2VuID0gYmFja2VuZFRva2VuO1xuXG4gICAgICAgICAgICAgIHVzZXIucmVzcG9uc2UgPSBhdXRoUmVzcG9uc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUodXNlcik7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoY2xvc2VkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChjbG9zZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2lnbk91dChyZXZva2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzaWduT3V0UHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXG4gICAgICBpZiAocmV2b2tlKSB7XG4gICAgICAgIHNpZ25PdXRQcm9taXNlID0gdGhpcy5hdXRoMi5kaXNjb25uZWN0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaWduT3V0UHJvbWlzZSA9IHRoaXMuYXV0aDIuc2lnbk91dCgpO1xuICAgICAgfVxuXG4gICAgICBzaWduT3V0UHJvbWlzZVxuICAgICAgICAudGhlbigoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19