Fixes issue affecting the auth providers (#3211)

* Reproduces error for issue 3208

* Make sure we don't override a default adapter with the options when validation function are not provided
This commit is contained in:
Florent Vilmart
2016-12-08 11:54:06 -05:00
committed by Arthur Cinader
parent 81ebbb8954
commit 4f46eceacf
2 changed files with 71 additions and 22 deletions

View File

@@ -203,6 +203,13 @@ describe('AuthenticationProviers', function() {
expect(typeof authenticatonHandler.getValidatorForProvider).toBe('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) => { it('properly loads custom adapter', (done) => {
var validAuthData = { var validAuthData = {
id: 'hello', id: 'hello',
@@ -279,4 +286,30 @@ describe('AuthenticationProviers', function() {
done(); 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);
});
}); });

View File

@@ -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) { module.exports = function(authOptions = {}, enableAnonymousUsers = true) {
let _enableAnonymousUsers = enableAnonymousUsers; let _enableAnonymousUsers = enableAnonymousUsers;
const setEnableAnonymousUsers = function(enable) { const setEnableAnonymousUsers = function(enable) {
@@ -67,33 +97,19 @@ module.exports = function(authOptions = {}, enableAnonymousUsers = true) {
return; return;
} }
const defaultAdapter = providers[provider]; const {
let adapter = defaultAdapter; adapter,
const providerOptions = authOptions[provider]; appIds,
providerOptions
if (!defaultAdapter && !providerOptions) { } = loadAuthAdapter(provider, authOptions);
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;
}
return authDataValidator(adapter, appIds, providerOptions); return authDataValidator(adapter, appIds, providerOptions);
} }
return Object.freeze({ return Object.freeze({
getValidatorForProvider, getValidatorForProvider,
setEnableAnonymousUsers, setEnableAnonymousUsers
}) })
} }
module.exports.loadAuthAdapter = loadAuthAdapter;