diff --git a/spec/AuthenticationAdapters.spec.js b/spec/AuthenticationAdapters.spec.js index 22af6ba2..56833179 100644 --- a/spec/AuthenticationAdapters.spec.js +++ b/spec/AuthenticationAdapters.spec.js @@ -203,6 +203,13 @@ describe('AuthenticationProviers', function() { expect(typeof authenticatonHandler.getValidatorForProvider).toBe('function'); } + function validateAuthenticationAdapter(authAdapter) { + expect(authAdapter).not.toBeUndefined(); + if (!authAdapter) { return; } + expect(typeof authAdapter.validateAuthData).toBe('function'); + expect(typeof authAdapter.validateAppId).toBe('function'); + } + it('properly loads custom adapter', (done) => { var validAuthData = { id: 'hello', @@ -279,4 +286,30 @@ describe('AuthenticationProviers', function() { done(); }) }); + + it('properly loads a default adapter with options', () => { + const options = { + facebook: { + appIds: ['a', 'b'] + } + }; + const { adapter, appIds, providerOptions } = authenticationLoader.loadAuthAdapter('facebook', options); + validateAuthenticationAdapter(adapter); + expect(appIds).toEqual(['a', 'b']); + expect(providerOptions).toEqual(options.facebook); + }); + + it('properly loads a custom adapter with options', () => { + const options = { + custom: { + validateAppId: () => {}, + validateAuthData: () => {}, + appIds: ['a', 'b'] + } + }; + const { adapter, appIds, providerOptions } = authenticationLoader.loadAuthAdapter('custom', options); + validateAuthenticationAdapter(adapter); + expect(appIds).toEqual(['a', 'b']); + expect(providerOptions).toEqual(options.custom); + }); }); diff --git a/src/Adapters/Auth/index.js b/src/Adapters/Auth/index.js index a12136d1..aa99f09c 100755 --- a/src/Adapters/Auth/index.js +++ b/src/Adapters/Auth/index.js @@ -55,6 +55,36 @@ function authDataValidator(adapter, appIds, options) { } } +function loadAuthAdapter(provider, authOptions) { + const defaultAdapter = providers[provider]; + const adapter = Object.assign({}, defaultAdapter); + const providerOptions = authOptions[provider]; + + if (!defaultAdapter && !providerOptions) { + return; + } + + 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]; + } + }); + } + } + + if (!adapter.validateAuthData || !adapter.validateAppId) { + return; + } + + return {adapter, appIds, providerOptions}; +} + module.exports = function(authOptions = {}, enableAnonymousUsers = true) { let _enableAnonymousUsers = enableAnonymousUsers; const setEnableAnonymousUsers = function(enable) { @@ -67,33 +97,19 @@ module.exports = function(authOptions = {}, enableAnonymousUsers = true) { return; } - const defaultAdapter = providers[provider]; - let adapter = defaultAdapter; - const providerOptions = authOptions[provider]; - - if (!defaultAdapter && !providerOptions) { - return; - } - - const appIds = providerOptions ? providerOptions.appIds : undefined; - - // Try the configuration methods - if (providerOptions) { - const optionalAdapter = loadAdapter(providerOptions, undefined, providerOptions); - if (optionalAdapter) { - adapter = optionalAdapter; - } - } - - if (!adapter.validateAuthData || !adapter.validateAppId) { - return; - } + const { + adapter, + appIds, + providerOptions + } = loadAuthAdapter(provider, authOptions); return authDataValidator(adapter, appIds, providerOptions); } return Object.freeze({ getValidatorForProvider, - setEnableAnonymousUsers, + setEnableAnonymousUsers }) } + +module.exports.loadAuthAdapter = loadAuthAdapter;