UNPKG

@furystack/auth-google

Version:

Google Authentication Provider for FuryStack

78 lines 3.31 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; import { StoreManager } from '@furystack/core'; import { Injectable, Injected } from '@furystack/inject'; import { HttpAuthenticationSettings, readPostBody } from '@furystack/rest-service'; import { get } from 'https'; let GoogleLoginSettings = class GoogleLoginSettings { get = get; getUserFromGooglePayload = async (payload) => { const users = await this.userStore.find({ top: 2, filter: { username: { $eq: payload.email }, }, }); if (users.length === 1) { return users[0]; } }; }; __decorate([ Injected((injector) => injector.getInstance(HttpAuthenticationSettings).getUserStore(injector.getInstance(StoreManager))), __metadata("design:type", Object) ], GoogleLoginSettings.prototype, "userStore", void 0); GoogleLoginSettings = __decorate([ Injectable({ lifetime: 'singleton' }) ], GoogleLoginSettings); export { GoogleLoginSettings }; /** * Service class for Google OAuth authentication */ let GoogleLoginService = class GoogleLoginService { googleApiEndpoint = 'https://www.googleapis.com/oauth2/v3/tokeninfo?id_token='; readPostBody = readPostBody; /** * @param token The ID Token * @returns the extracted Google Authentication data from the token. */ async getGoogleUserData(token) { return await new Promise((resolve, reject) => this.settings.get(`${this.googleApiEndpoint}${token}`, (response) => { if (response.statusCode && response.statusCode < 400) { this.readPostBody(response).then(resolve).catch(reject); } else { reject(new Error('Invalid response!')); } })); } /** * Authenticates the user with an IdToken and returns a user. The user will be inserted to the DataStore if not present. * @param token The IdToken to authenticate * @returns The current user */ async login(token) { const googleData = await this.getGoogleUserData(token); const user = await this.settings.getUserFromGooglePayload(googleData); if (!user) { throw Error(`Attached user not found.`); } return user; } }; __decorate([ Injected(GoogleLoginSettings), __metadata("design:type", GoogleLoginSettings) ], GoogleLoginService.prototype, "settings", void 0); GoogleLoginService = __decorate([ Injectable({ lifetime: 'scoped' }) ], GoogleLoginService); export { GoogleLoginService }; //# sourceMappingURL=login-service.js.map