Files
kami-parse-server/src/Adapters/Auth/index.js
Diamond Lewis b44726987d Support Google Play Games Service (#6147)
* Support Google Play Games Service

* clean up

* improve coverage

* more tests
2019-10-28 13:16:55 -05:00

144 lines
3.6 KiB
JavaScript
Executable File

import loadAdapter from '../AdapterLoader';
const apple = require('./apple');
const gcenter = require('./gcenter');
const gpgames = require('./gpgames');
const facebook = require('./facebook');
const facebookaccountkit = require('./facebookaccountkit');
const instagram = require('./instagram');
const linkedin = require('./linkedin');
const meetup = require('./meetup');
const google = require('./google');
const github = require('./github');
const twitter = require('./twitter');
const spotify = require('./spotify');
const digits = require('./twitter'); // digits tokens are validated by twitter
const janrainengage = require('./janrainengage');
const janraincapture = require('./janraincapture');
const line = require('./line');
const vkontakte = require('./vkontakte');
const qq = require('./qq');
const wechat = require('./wechat');
const weibo = require('./weibo');
const oauth2 = require('./oauth2');
const phantauth = require('./phantauth');
const microsoft = require('./microsoft');
const anonymous = {
validateAuthData: () => {
return Promise.resolve();
},
validateAppId: () => {
return Promise.resolve();
},
};
const providers = {
apple,
gcenter,
gpgames,
facebook,
facebookaccountkit,
instagram,
linkedin,
meetup,
google,
github,
twitter,
spotify,
anonymous,
digits,
janrainengage,
janraincapture,
line,
vkontakte,
qq,
wechat,
weibo,
phantauth,
microsoft,
};
function authDataValidator(adapter, appIds, options) {
return function(authData) {
return adapter.validateAuthData(authData, options).then(() => {
if (appIds) {
return adapter.validateAppId(appIds, authData, options);
}
return Promise.resolve();
});
};
}
function loadAuthAdapter(provider, authOptions) {
let defaultAdapter = providers[provider];
const providerOptions = authOptions[provider];
if (
providerOptions &&
Object.prototype.hasOwnProperty.call(providerOptions, 'oauth2') &&
providerOptions['oauth2'] === true
) {
defaultAdapter = oauth2;
}
if (!defaultAdapter && !providerOptions) {
return;
}
const adapter = Object.assign({}, defaultAdapter);
const appIds = providerOptions ? providerOptions.appIds : undefined;
// Try the configuration methods
if (providerOptions) {
const optionalAdapter = loadAdapter(
providerOptions,
undefined,
providerOptions
);
if (optionalAdapter) {
['validateAuthData', 'validateAppId'].forEach(key => {
if (optionalAdapter[key]) {
adapter[key] = optionalAdapter[key];
}
});
}
}
// TODO: create a new module from validateAdapter() in
// src/Controllers/AdaptableController.js so we can use it here for adapter
// validation based on the src/Adapters/Auth/AuthAdapter.js expected class
// signature.
if (!adapter.validateAuthData || !adapter.validateAppId) {
return;
}
return { adapter, appIds, providerOptions };
}
module.exports = function(authOptions = {}, enableAnonymousUsers = true) {
let _enableAnonymousUsers = enableAnonymousUsers;
const setEnableAnonymousUsers = function(enable) {
_enableAnonymousUsers = enable;
};
// To handle the test cases on configuration
const getValidatorForProvider = function(provider) {
if (provider === 'anonymous' && !_enableAnonymousUsers) {
return;
}
const { adapter, appIds, providerOptions } = loadAuthAdapter(
provider,
authOptions
);
return authDataValidator(adapter, appIds, providerOptions);
};
return Object.freeze({
getValidatorForProvider,
setEnableAnonymousUsers,
});
};
module.exports.loadAuthAdapter = loadAuthAdapter;