Skip to content

Commit

Permalink
Fix externalId null when SP return profile with undefined id.
Browse files Browse the repository at this point in the history
  • Loading branch information
Axel Gendillard committed Jan 17, 2018
1 parent 275dc3d commit f6c491c
Show file tree
Hide file tree
Showing 2 changed files with 130 additions and 129 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -23,3 +23,4 @@ build/Release
# Deployed apps should consider commenting this line out:
# see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git
node_modules
.idea/
258 changes: 129 additions & 129 deletions lib/models/user-identity.js
Expand Up @@ -30,141 +30,141 @@ module.exports = UserIdentity;
* @inherits {DataModel}
*/
function UserIdentity(UserIdentity) {
/*!
* Create an access token for the given user
* @param {User} user The user instance
* @param {Number} [ttl] The ttl in millisenconds
* @callback {Function} cb The callback function
* @param {Error|String} err The error object
* param {AccessToken} The access token
*/
function createAccessToken(user, ttl, cb) {
if (arguments.length === 2 && typeof ttl === 'function') {
cb = ttl;
ttl = 0;
/*!
* Create an access token for the given user
* @param {User} user The user instance
* @param {Number} [ttl] The ttl in millisenconds
* @callback {Function} cb The callback function
* @param {Error|String} err The error object
* param {AccessToken} The access token
*/
function createAccessToken(user, ttl, cb) {
if (arguments.length === 2 && typeof ttl === 'function') {
cb = ttl;
ttl = 0;
}
user.accessTokens.create({
created: new Date(),
ttl: Math.min(ttl || user.constructor.settings.ttl,
user.constructor.settings.maxTTL),
}, cb);
}
user.accessTokens.create({
created: new Date(),
ttl: Math.min(ttl || user.constructor.settings.ttl,
user.constructor.settings.maxTTL),
}, cb);
}

function profileToUser(provider, profile, options) {
// Let's create a user for that
var profileEmail = profile.emails && profile.emails[0] &&
profile.emails[0].value;
var generatedEmail = (profile.username || profile.id) + '@loopback.' +
(profile.provider || provider) + '.com';
var email = provider === 'ldap' ? profileEmail : generatedEmail;
var username = provider + '.' + (profile.username || profile.id);
var password = utils.generateKey('password');
var userObj = {
username: username,
password: password,
};
if (email) {
userObj.email = email;
}
return userObj;
}
/**
* Log in with a third-party provider such as Facebook or Google.
*
* @param {String} provider The provider name.
* @param {String} authScheme The authentication scheme.
* @param {Object} profile The profile.
* @param {Object} credentials The credentials.
* @param {Object} [options] The options.
* @callback {Function} cb The callback function.
* @param {Error|String} err The error object or string.
* @param {Object} user The user object.
* @param {Object} [info] The auth info object.
*
* - identity: UserIdentity object
* - accessToken: AccessToken object
*/
UserIdentity.login = function(provider, authScheme, profile, credentials,
options, cb) {
options = options || {};
if (typeof options === 'function' && cb === undefined) {
cb = options;
options = {};
function profileToUser(provider, profile, options) {
// Let's create a user for that
var profileEmail = profile.emails && profile.emails[0] &&
profile.emails[0].value;
var generatedEmail = (profile.username || profile.id) + '@loopback.' +
(profile.provider || provider) + '.com';
var email = provider === 'ldap' ? profileEmail : generatedEmail;
var username = provider + '.' + (profile.username || profile.id);
var password = utils.generateKey('password');
var userObj = {
username: username,
password: password,
};
if (email) {
userObj.email = email;
}
return userObj;
}
var autoLogin = options.autoLogin || options.autoLogin === undefined;
var userIdentityModel = utils.getModel(this, UserIdentity);
profile.id = profile.id || profile.openid;
userIdentityModel.findOne({where: {
provider: provider,
externalId: profile.id,
}}, function(err, identity) {
if (err) {
return cb(err);
}
if (identity) {
identity.credentials = credentials;
return identity.updateAttributes({profile: profile,
credentials: credentials, modified: new Date()}, function(err, i) {
// Find the user for the given identity
return identity.user(function(err, user) {
// Create access token if the autoLogin flag is set to true
if (!err && user && autoLogin) {
return (options.createAccessToken || createAccessToken)(user, function(err, token) {
cb(err, user, identity, token);
});
/**
* Log in with a third-party provider such as Facebook or Google.
*
* @param {String} provider The provider name.
* @param {String} authScheme The authentication scheme.
* @param {Object} profile The profile.
* @param {Object} credentials The credentials.
* @param {Object} [options] The options.
* @callback {Function} cb The callback function.
* @param {Error|String} err The error object or string.
* @param {Object} user The user object.
* @param {Object} [info] The auth info object.
*
* - identity: UserIdentity object
* - accessToken: AccessToken object
*/
UserIdentity.login = function(provider, authScheme, profile, credentials,
options, cb) {
options = options || {};
if (typeof options === 'function' && cb === undefined) {
cb = options;
options = {};
}
var userObj = (options.profileToUser || profileToUser)(provider, profile, options);
var autoLogin = options.autoLogin || options.autoLogin === undefined;
var userIdentityModel = utils.getModel(this, UserIdentity);
profile.id = profile.id || profile.openid || userObj.id;
userIdentityModel.findOne({where: {
provider: provider,
externalId: profile.id,
}}, function(err, identity) {
if (err) {
return cb(err);
}
if (identity) {
identity.credentials = credentials;
return identity.updateAttributes({profile: profile,
credentials: credentials, modified: new Date()}, function(err, i) {
// Find the user for the given identity
return identity.user(function(err, user) {
// Create access token if the autoLogin flag is set to true
if (!err && user && autoLogin) {
return (options.createAccessToken || createAccessToken)(user, function(err, token) {
cb(err, user, identity, token);
});
}
cb(err, user, identity);
});
});
}
// Find the user model
var userModel = (userIdentityModel.relations.user &&
userIdentityModel.relations.user.modelTo) ||
loopback.getModelByType(loopback.User);
if (!userObj.email && !options.emailOptional) {
process.nextTick(function() {
return cb(g.f('email is missing from the user profile'));
});
return;
}
cb(err, user, identity);
});
});
}
// Find the user model
var userModel = (userIdentityModel.relations.user &&
userIdentityModel.relations.user.modelTo) ||
loopback.getModelByType(loopback.User);
var userObj = (options.profileToUser || profileToUser)(provider, profile, options);
if (!userObj.email && !options.emailOptional) {
process.nextTick(function() {
return cb(g.f('email is missing from the user profile'));
});
return;
}

var query;
if (userObj.email && userObj.username) {
query = {or: [
{username: userObj.username},
{email: userObj.email},
]};
} else if (userObj.email) {
query = {email: userObj.email};
} else {
query = {username: userObj.username};
}
var query;
if (userObj.email && userObj.username) {
query = {or: [
{username: userObj.username},
{email: userObj.email},
]};
} else if (userObj.email) {
query = {email: userObj.email};
} else {
query = {username: userObj.username};
}

userModel.findOrCreate({where: query}, userObj, function(err, user) {
if (err) {
return cb(err);
}
var date = new Date();
userIdentityModel.findOrCreate({where: {externalId: profile.id}}, {
provider: provider,
externalId: profile.id,
authScheme: authScheme,
profile: profile,
credentials: credentials,
userId: user.id,
created: date,
modified: date,
}, function(err, identity) {
if (!err && user && autoLogin) {
return (options.createAccessToken || createAccessToken)(user, function(err, token) {
cb(err, user, identity, token);
userModel.findOrCreate({where: query}, userObj, function(err, user) {
if (err) {
return cb(err);
}
var date = new Date();
userIdentityModel.findOrCreate({where: {externalId: profile.id}}, {
provider: provider,
externalId: profile.id,
authScheme: authScheme,
profile: profile,
credentials: credentials,
userId: user.id,
created: date,
modified: date,
}, function(err, identity) {
if (!err && user && autoLogin) {
return (options.createAccessToken || createAccessToken)(user, function(err, token) {
cb(err, user, identity, token);
});
}
cb(err, user, identity);
});
});
}
cb(err, user, identity);
});
});
});
};
return UserIdentity;
};
return UserIdentity;
};

0 comments on commit f6c491c

Please sign in to comment.