@furystack/auth-google
Version:
Google Authentication Provider for FuryStack
78 lines • 3.31 kB
JavaScript
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