aretherecookies-mobile/js/AuthManager.js

100 lines
2.2 KiB
JavaScript
Raw Normal View History

2018-01-01 15:52:03 -06:00
//@flow
import { authFacebook, type FacebookAuth } from './apis/FacebookAuth';
2018-06-17 18:19:18 -05:00
import { type GoogleUser } from './apis/GoogleAuth';
2018-08-25 12:13:09 -05:00
import { type Auth0User, loginAuth0 } from './apis/Auth0';
2018-01-01 15:52:03 -06:00
import moment from 'moment';
export const AUTH_PROVIDER_FACEBOOK: 'facebook' = 'facebook';
2018-05-11 16:42:27 -05:00
export const AUTH_PROVIDER_GOOGLE: 'google' = 'google';
2018-08-25 12:13:09 -05:00
export const AUTH_PROVIDER_AUTH0: 'auth0' = 'auth0';
2018-01-01 15:52:03 -06:00
2018-08-25 12:13:09 -05:00
export type AUTH_PROVIDER =
| typeof AUTH_PROVIDER_FACEBOOK
| typeof AUTH_PROVIDER_GOOGLE
| typeof AUTH_PROVIDER_AUTH0;
2018-01-01 15:52:03 -06:00
export type User = {
name: string,
token: string,
tokenExpires: number,
email: string,
photo: string,
provider: AUTH_PROVIDER,
};
class AuthManager {
user: ?User;
getToken = () => {
return this.user && this.user.token;
};
getAuthHeader = () => {
const { token, provider } = this.user || {};
switch (provider) {
case AUTH_PROVIDER_FACEBOOK:
return { authorization: `facebook-token ${token}` };
default:
return {};
}
};
2018-01-01 15:52:03 -06:00
isLoggedIn = () => {
if (!this.user) {
return false;
}
const { token, tokenExpires } = this.user;
return token && +moment(tokenExpires) >= +moment();
};
setFacebookUser = ({ credentials, profile }: FacebookAuth) => {
this.user = {
token: credentials.token,
tokenExpires: +moment(credentials.tokenExpirationDate),
name: profile.name,
email: profile.email,
photo: profile.picture.data.url,
provider: AUTH_PROVIDER_FACEBOOK,
};
};
2018-05-11 16:42:27 -05:00
setGoogleUser = (googleUser: GoogleUser) => {
this.user = {
token: googleUser.accessToken,
tokenExpires: +moment().add(1, 'week'),
name: googleUser.name,
email: googleUser.email,
photo: googleUser.photo,
provider: AUTH_PROVIDER_GOOGLE,
};
};
2018-08-25 12:13:09 -05:00
setAuth0User = (auth0User: Auth0User) => {
if (!auth0User) {
return;
}
this.user = {
token: auth0User.accessToken,
tokenExpires: +moment().add(auth0User.expiresIn, 'seconds'),
};
};
authenticate = async (provider: AUTH_PROVIDER) => {
2018-01-01 15:52:03 -06:00
switch (provider) {
case AUTH_PROVIDER_FACEBOOK:
this.setFacebookUser(await authFacebook());
2018-05-11 16:42:27 -05:00
break;
2018-08-25 12:13:09 -05:00
default:
this.setAuth0User(await loginAuth0());
2018-05-11 16:42:27 -05:00
break;
2018-01-01 15:52:03 -06:00
}
};
deauthenticate = () => {
this.user = null;
};
2018-01-01 15:52:03 -06:00
}
export default new AuthManager();