Skip to content
Browse files

Compliance with loopback 2.x models declaration

  • Loading branch information...
1 parent 348aa54 commit 9ef62a475aec9bba333bee7f82ea39087e16ae0a @pandaiolo pandaiolo committed
View
1 docs.json
@@ -2,6 +2,7 @@
"title": "LoopBack Passport Integration",
"content": [
"lib/models/user-identity.js",
+ "lib/models/user-credential.js",
"lib/models/application-credential.js",
"lib/passport-configurator.js"
]
View
25 lib/index.js
@@ -1,10 +1,25 @@
-var uid = require('./models/user-identity');
-exports.UserIdentity = uid.UserIdentity;
-exports.UserCredential = uid.UserCredential;
-exports.ApplicationCredential = require('./models/application-credential');
+var loopback = require('loopback');
+var DataModel = loopback.PersistedModel || loopback.DataModel;
+
+function loadModel(jsonFile) {
+ var modelDefinition = require(jsonFile);
+ return DataModel.extend(modelDefinition.name,
+ modelDefinition.properties,
+ {
+ relations: modelDefinition.relations
+ });
+}
+
+var UserIdentityModel = loadModel('./models/user-identity.json');
+var UserCredentialModel = loadModel('./models/user-credential.json');
+var ApplicationCredentialModel = loadModel('./models/application-credential.json');
+
+exports.UserIdentity = require('./models/user-identity')(UserIdentityModel);
+exports.UserCredential = require('./models/user-credential')(UserCredentialModel);
+exports.ApplicationCredential = require('./models/application-credential')(ApplicationCredentialModel);
exports.UserIdentity.autoAttach = 'db';
exports.UserCredential.autoAttach = 'db';
exports.ApplicationCredential.autoAttach = 'db';
-exports.PassportConfigurator = require('./passport-configurator');
+exports.PassportConfigurator = require('./passport-configurator');
View
120 lib/models/application-credential.js
@@ -1,29 +1,3 @@
-var loopback = require('loopback');
-var DataModel = loopback.PersistedModel || loopback.DataModel;
-var utils = require('./utils');
-
-/*!
- * Default ApplicationCredential properties.
- */
-var properties = {
- provider: {type: String, required: true}, // facebook, google, twitter, linkedIn
- authScheme: {type: String}, // oAuth, oAuth 2.0, OpenID, OpenID Connect
- credentials: Object,
- // appId: String, // To be injected by belongsTo relation
- created: Date,
- modified: Date
-};
-
-var options = {
- relations: {
- application: {
- type: 'belongsTo',
- model: 'Application',
- foreignKey: 'appId'
- }
- }
-};
-
/**
* Credentials associated with the LoopBack client application, such as oAuth 2.0
* client ID/secret, or SSL keys
@@ -31,7 +5,7 @@ var options = {
* @param{String} provider: The auth provider name, such as facebook, google, twitter, linkedin
* @param{String} authScheme: The auth scheme, such as oAuth, oAuth 2.0, OpenID, OpenID Connect
* @param{Object} credentials: Provider-specific credentials. Actual properties depend on scheme being used:
- *
+ *
* - openId: {returnURL: String, realm: String}
* - oAuth2: {clientID: String, clientSecret: String, callbackURL: String}
* - oAuth: {consumerKey: String, consumerSecret: String, callbackURL: String}
@@ -41,52 +15,54 @@ var options = {
* @class
* @inherits {DataModel}
*/
-var ApplicationCredential = DataModel.extend('ApplicationCredential', properties, options);
-module.exports = ApplicationCredential;
+module.exports = function(ApplicationCredential) {
+ var utils = require('./utils');
-/**
- * Link a third-party application credential with the LoopBack application.
- * @param {String} appId The LoopBack application iID.
- * @param {String} provider The third party provider name.
- * @param {String} authScheme The authentication scheme.
- * @param {Object} credentials Credentials for the given scheme.
- * @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
- */
-ApplicationCredential.link = function (appId, provider, authScheme, credentials, cb) {
- var appCredentialModel = utils.getModel(this, ApplicationCredential);
- appCredentialModel.findOne({where: {
- appId: appId,
- provider: provider
- }}, function (err, extCredential) {
- if (err) {
- return cb(err);
- }
+ /**
+ * Link a third-party application credential with the LoopBack application.
+ * @param {String} appId The LoopBack application iID.
+ * @param {String} provider The third party provider name.
+ * @param {String} authScheme The authentication scheme.
+ * @param {Object} credentials Credentials for the given scheme.
+ * @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
+ */
+ ApplicationCredential.link = function (appId, provider, authScheme, credentials, cb) {
+ var appCredentialModel = utils.getModel(this, ApplicationCredential);
+ appCredentialModel.findOne({where: {
+ appId: appId,
+ provider: provider
+ }}, function (err, extCredential) {
+ if (err) {
+ return cb(err);
+ }
- var date = new Date();
- if (extCredential) {
- // Find the app for the given extCredential
- extCredential.credentials = credentials;
- return extCredential.updateAttributes({
- credentials: credentials, modified: date}, cb);
- }
+ var date = new Date();
+ if (extCredential) {
+ // Find the app for the given extCredential
+ extCredential.credentials = credentials;
+ return extCredential.updateAttributes({
+ credentials: credentials, modified: date}, cb);
+ }
- // Create the linked account
- appCredentialModel.create({
- provider: provider,
- authScheme: authScheme,
- credentials: credentials,
- appId: appId,
- created: date,
- modified: date
- }, function (err, i) {
- cb(err, i);
- });
+ // Create the linked account
+ appCredentialModel.create({
+ provider: provider,
+ authScheme: authScheme,
+ credentials: credentials,
+ appId: appId,
+ created: date,
+ modified: date
+ }, function (err, i) {
+ cb(err, i);
+ });
- });
-}
+ });
+ }
+ return ApplicationCredential;
+};
View
25 lib/models/application-credential.json
@@ -0,0 +1,25 @@
+{
+ "name": "ApplicationCredential",
+ "base": "PersistedModel",
+ "properties": {
+ "provider": {
+ "type": "String",
+ "required": true,
+ "comments": "Facebook, google, twitter, linkedIn"
+ },
+ "authScheme": {
+ "type": "String",
+ "comments": "oAuth, oAuth 2.0, OpenID, OpenID Connect"
+ },
+ "credentials": "Object",
+ "created": "Date",
+ "modified": "Date"
+ },
+ "relations": {
+ "application": {
+ "type": "belongsTo",
+ "model": "Application",
+ "foreignKey": "appId"
+ }
+ }
+}
View
77 lib/models/user-credential.js
@@ -0,0 +1,77 @@
+/**
+ * Tracks third-party logins and profiles.
+ *
+ * @param {String} provider Auth provider name, such as facebook, google, twitter, linkedin.
+ * @param {String} authScheme Auth scheme, such as oAuth, oAuth 2.0, OpenID, OpenID Connect.
+ * @param {String} externalId Provider specific user ID.
+ * @param {Object} profile User profile, see http://passportjs.org/guide/profile.
+ * @param {Object} credentials Credentials. Actual properties depend on the auth scheme being used:
+ *
+ * - oAuth: token, tokenSecret
+ * - oAuth 2.0: accessToken, refreshToken
+ * - OpenID: openId
+ * - OpenID: Connect: accessToken, refreshToken, profile
+ * @param {*} userId The LoopBack user ID.
+ * @param {Date} created The created date
+ * @param {Date} modified The last modified date
+ *
+ * @class
+ * @inherits {DataModel}
+ */
+module.exports = function(UserCredential) {
+ var utils = require('./utils');
+
+ /**
+ * Link a third party account to a LoopBack user
+ * @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} [credential] The user credential object
+ */
+ UserCredential.link = function (userId, provider, authScheme, profile,
+ credentials, options, cb) {
+ options = options || {};
+ if(typeof options === 'function' && cb === undefined) {
+ cb = options;
+ options = {};
+ }
+ var userCredentialModel = utils.getModel(this, UserCredential);
+ userCredentialModel.findOne({where: {
+ userId: userId,
+ provider: provider,
+ externalId: profile.id
+ }}, function (err, extCredential) {
+ if (err) {
+ return cb(err);
+ }
+
+ var date = new Date();
+ if (extCredential) {
+ // Find the user for the given extCredential
+ extCredential.credentials = credentials;
+ return extCredential.updateAttributes({profile: profile,
+ credentials: credentials, modified: date}, cb);
+ }
+
+ // Create the linked account
+ userCredentialModel.create({
+ provider: provider,
+ externalId: profile.id,
+ authScheme: authScheme,
+ profile: profile,
+ credentials: credentials,
+ userId: userId,
+ created: date,
+ modified: date
+ }, function (err, i) {
+ cb(err, i);
+ });
+
+ });
+ }
+ return UserCredential;
+};
View
42 lib/models/user-credential.json
@@ -0,0 +1,42 @@
+{
+ "name": "UserCredential",
+ "base": "PersistedModel",
+ "properties": {
+ "provider": {
+ "type": "String",
+ "comments": "facebook, google, twitter, linkedin"
+ },
+ "authScheme": {
+ "type": "String",
+ "comments": "oAuth, oAuth 2.0, OpenID, OpenID Connect"
+ },
+ "externalId": {
+ "type": "String",
+ "comments": "The provider specific id"
+ },
+ "profile": {
+ "type": "Object"
+ },
+ "credentials": {
+ "type": "Object"
+ },
+ "created": "Date",
+ "modified": "Date"
+ },
+ "acls": [{
+ "principalType": "ROLE",
+ "principalId": "$everyone",
+ "permission": "DENY"
+ }, {
+ "principalType": "ROLE",
+ "principalId": "$owner",
+ "permission": "ALLOW"
+ }],
+ "relations": {
+ "user": {
+ "type": "belongsTo",
+ "model": "User",
+ "foreignKey": "userId"
+ }
+ }
+}
View
345 lib/models/user-identity.js
@@ -1,55 +1,12 @@
-var loopback = require('loopback');
-var DataModel = loopback.PersistedModel || loopback.DataModel;
-var Role = loopback.Role;
-var ACL = loopback.ACL;
-var utils = require('./utils');
-
-/*!
- * Default UserIdentity properties.
- */
-
-var properties = {
- provider: {type: String}, // facebook, google, twitter, linkedin
- authScheme: {type: String}, // oAuth, oAuth 2.0, OpenID, OpenID Connect
- externalId: {type: String}, // The provider specific id
- profile: {type: Object},
- credentials: {type: Object},
- // userId: {type: String}, // Allow LoopBack to inject it based on the relation
- created: Date,
- modified: Date
-};
-
-var options = {
- acls: [
- {
- principalType: ACL.ROLE,
- principalId: Role.EVERYONE,
- permission: ACL.DENY
- },
- {
- principalType: ACL.ROLE,
- principalId: Role.OWNER,
- permission: ACL.ALLOW
- }
- ],
- relations: {
- user: {
- type: 'belongsTo',
- model: 'User',
- foreignKey: 'userId'
- }
- }
-};
-
/**
* Tracks third-party logins and profiles.
*
- * @param {String} provider Auth provider name, such as facebook, google, twitter, linkedin.
+ * @param {String} provider Auth provider name, such as facebook, google, twitter, linkedin.
* @param {String} authScheme Auth scheme, such as oAuth, oAuth 2.0, OpenID, OpenID Connect.
* @param {String} externalId Provider specific user ID.
* @param {Object} profile User profile, see http://passportjs.org/guide/profile.
* @param {Object} credentials Credentials. Actual properties depend on the auth scheme being used:
- *
+ *
* - oAuth: token, tokenSecret
* - oAuth 2.0: accessToken, refreshToken
* - OpenID: openId
@@ -61,84 +18,121 @@ var options = {
* @class
* @inherits {DataModel}
*/
-var UserIdentity = DataModel.extend('UserIdentity', properties, options);
+ module.exports = function(UserIdentity) {
+ var loopback = require('loopback');
+ var utils = require('./utils');
-/*!
- * 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({
+ ttl: Math.min(ttl || user.constructor.settings.ttl,
+ user.constructor.settings.maxTTL)
+ }, cb);
}
- user.accessTokens.create({
- ttl: Math.min(ttl || user.constructor.settings.ttl,
- user.constructor.settings.maxTTL)
- }, cb);
-}
-function profileToUser(provider, profile) {
-// Let's create a user for that
- var email = profile.emails && profile.emails[0] && profile.emails[0].value;
- if (!email) {
- // Fake an e-mail
- email = (profile.username || profile.id) + '@loopback.'
- + (profile.provider || provider) + '.com';
+ function profileToUser(provider, profile) {
+ // Let's create a user for that
+ var email = profile.emails && profile.emails[0] && profile.emails[0].value;
+ if (!email) {
+ // Fake an e-mail
+ email = (profile.username || profile.id) + '@loopback.' +
+ (profile.provider || provider) + '.com';
+ }
+ var username = provider + '.' + (profile.username || profile.id);
+ var password = utils.generateKey('password');
+ var userObj = {
+ username: username,
+ password: password,
+ email: email
+ };
+ return userObj;
}
- var username = provider + '.' + (profile.username || profile.id);
- var password = utils.generateKey('password');
- var userObj = {
- username: username,
- password: password,
- 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 = {};
- }
- var autoLogin = options.autoLogin || options.autoLogin === undefined;
- var userIdentityModel = utils.getModel(this, UserIdentity);
- userIdentityModel.findOne({where: {
- provider: provider,
- externalId: profile.id
- }}, function (err, identity) {
- if (err) {
- return cb(err);
+ /**
+ * 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 = {};
}
- 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
+ var autoLogin = options.autoLogin || options.autoLogin === undefined;
+ var userIdentityModel = utils.getModel(this, UserIdentity);
+ 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 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);
+ var userObj = (options.profileToUser || profileToUser)(provider, profile);
+ if (!userObj.email) {
+ return cb('email is missing from the user profile');
+ }
+ userModel.findOrCreate({where: {or: [
+ {username: userObj.username},
+ {email: userObj.email}
+ ]}}, userObj, function (err, user) {
+ if (err) {
+ return cb(err);
+ }
+ var date = new Date();
+ userIdentityModel.create({
+ 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 createAccessToken(user, function(err, token) {
cb(err, user, identity, token);
@@ -147,120 +141,7 @@ UserIdentity.login = function (provider, authScheme, profile, credentials,
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);
- if (!userObj.email) {
- return cb('email is missing from the user profile');
- }
- userModel.findOrCreate({where: {or: [
- {username: userObj.username},
- {email: userObj.email}
- ]}}, userObj, function (err, user) {
- if (err) {
- return cb(err);
- }
- var date = new Date();
- userIdentityModel.create({
- 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 createAccessToken(user, function(err, token) {
- cb(err, user, identity, token);
- });
- }
- cb(err, user, identity);
- });
- });
- });
-}
-
-/**
- * Tracks thrid-party credentials for linked accounts.
- *
- * @param {String} provider The auth provider name, such as facebook, google, twitter, linkedin
- * @param {String} authScheme The auth scheme, such as oAuth, oAuth 2.0, OpenID, OpenID Connect
- * @param {String} externalId The provider-specific user ID.
- * @param {Object} profile The user profile, see http://passportjs.org/guide/profile
- * @param {Object} credentials Credentials. Actual properties depend on the auth scheme being used:
- *
- * - For oAuth: token, tokenSecret
- * - For oAuth 2.0: accessToken, refreshToken
- * - For OpenID: openId
- * - For OpenID: Connect: accessToken, refreshToken, profile
- * @param {*} userId: The LoopBack user ID.
- * @param {Date} created: The created date
- * @param {Date} modified: The last modified date
- *
- * @class
- * @inherits {DataModel}
- */
-var UserCredential = DataModel.extend('UserCredential', properties, options);
-
-/**
- * Link a third party account to a LoopBack user
- * @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} [credential] The user credential object
- */
-UserCredential.link = function (userId, provider, authScheme, profile,
- credentials, options, cb) {
- options = options || {};
- if(typeof options === 'function' && cb === undefined) {
- cb = options;
- options = {};
- }
- var userCredentialModel = utils.getModel(this, UserCredential);
- userCredentialModel.findOne({where: {
- userId: userId,
- provider: provider,
- externalId: profile.id
- }}, function (err, extCredential) {
- if (err) {
- return cb(err);
- }
-
- var date = new Date();
- if (extCredential) {
- // Find the user for the given extCredential
- extCredential.credentials = credentials;
- return extCredential.updateAttributes({profile: profile,
- credentials: credentials, modified: date}, cb);
- }
-
- // Create the linked account
- userCredentialModel.create({
- provider: provider,
- externalId: profile.id,
- authScheme: authScheme,
- profile: profile,
- credentials: credentials,
- userId: userId,
- created: date,
- modified: date
- }, function (err, i) {
- cb(err, i);
});
-
- });
-}
-
-module.exports = {
- UserIdentity: UserIdentity,
- UserCredential: UserCredential
+ };
+ return UserIdentity;
};
View
43 lib/models/user-identity.json
@@ -0,0 +1,43 @@
+{
+ "name": "UserIdentity",
+ "plural": "UserIdentities",
+ "base": "PersistedModel",
+ "properties": {
+ "provider": {
+ "type": "String",
+ "comments": "facebook, google, twitter, linkedin"
+ },
+ "authScheme": {
+ "type": "String",
+ "comments": "oAuth, oAuth 2.0, OpenID, OpenID Connect"
+ },
+ "externalId": {
+ "type": "String",
+ "comments": "The provider specific id"
+ },
+ "profile": {
+ "type": "Object"
+ },
+ "credentials": {
+ "type": "Object"
+ },
+ "created": "Date",
+ "modified": "Date"
+ },
+ "acls": [{
+ "principalType": "ROLE",
+ "principalId": "$everyone",
+ "permission": "DENY"
+ }, {
+ "principalType": "ROLE",
+ "principalId": "$owner",
+ "permission": "ALLOW"
+ }],
+ "relations": {
+ "user": {
+ "type": "belongsTo",
+ "model": "User",
+ "foreignKey": "userId"
+ }
+ }
+}
View
9 lib/passport-configurator.js
@@ -1,6 +1,5 @@
var loopback = require('loopback');
var passport = require('passport');
-var models = require('./models/user-identity');
var _ = require('underscore');
module.exports = PassportConfigurator;
@@ -30,9 +29,9 @@ function PassportConfigurator(app) {
PassportConfigurator.prototype.setupModels = function (options) {
options = options || {};
// Set up relations
- this.userModel = options.userModel || loopback.getModelByType(loopback.User);
- this.userCredentialModel = options.userCredentialModel || loopback.getModelByType(models.UserCredential);
- this.userIdentityModel = options.userIdentityModel || loopback.getModelByType(models.UserIdentity);
+ this.userModel = options.userModel || loopback.getModelByType(this.app.models.User);

@pandaiolo Why change to reference this three models from this.app.models?

If we extend User model as Account Model, there won't be a app.models.User. Of cause I could pass it via options, but it's not as convenient as before. So the other two models.

Are these changes necessary?

Hum, your comment makes sense, but this is interesting because in my app, I actually do not have a User model, instead I have a Member model extending it. I don't remember why I changed these lines in the first place. I'll have a look in about two weeks because I will be integrating third party logins in my app, and propose a patch if needed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ this.userCredentialModel = options.userCredentialModel || loopback.getModelByType(this.app.models.UserCredential);
+ this.userIdentityModel = options.userIdentityModel || loopback.getModelByType(this.app.models.UserIdentity);
if (!this.userModel.relations.identities) {
this.userModel.hasMany(this.userIdentityModel, {as: 'identities'});
@@ -362,6 +361,7 @@ PassportConfigurator.prototype.configureProvider = function (name, options) {
if (!!options.json) {
return res.json({'access_token': info.accessToken.id, userId: user.id});
} else {
+ console.log('SIGNED COOKIES PASSPORT', req.signedCookies);
res.cookie('access_token', info.accessToken.id, { signed: req.signedCookies ? true : false,
maxAge: info.accessToken.ttl });
res.cookie('userId', user.id.toString(), { signed: req.signedCookies ? true : false,
@@ -375,6 +375,7 @@ PassportConfigurator.prototype.configureProvider = function (name, options) {
if (!!options.json) {
return res.json({'access_token': info.accessToken.id, userId: user.id});
} else {
+ console.log('SIGNED COOKIES PASSPORT', req.signedCookies);
res.cookie('access_token', info.accessToken.id, { signed: req.signedCookies ? true : false,
maxAge: info.accessToken.ttl });
res.cookie('userId', user.id.toString(), { signed: req.signedCookies ? true : false,
View
88 test/model.user-credential.test.js
@@ -0,0 +1,88 @@
+var m = require('./init');
+var loopback = require('loopback');
+var assert = require('assert');
+var UserCredential = m.UserCredential;
+var User = loopback.User;
+
+before(function (done) {
+ User.destroyAll(done);
+});
+
+describe('UserCredential', function () {
+ var userId = null;
+ before(function (done) {
+ var ds = loopback.createDataSource({
+ connector: 'memory'
+ });
+
+ UserCredential.attachTo(ds);
+ User.attachTo(ds);
+ UserCredential.belongsTo(User);
+
+ User.create({
+ username: 'facebook.abc',
+ email: 'uuu@facebook.com',
+ password: 'pass'
+ }, function (err, user) {
+ userId = user.id;
+ done(err);
+ });
+ });
+
+ it('supports linked 3rd party accounts', function (done) {
+ UserCredential.link(userId, 'facebook', 'oAuth 2.0',
+ {emails: [
+ {value: 'foo@bar.com'}
+ ], id: 'f123', username: 'xyz'
+ }, {accessToken: 'at1', refreshToken: 'rt1'}, function (err, cred) {
+ assert(!err, 'No error should be reported');
+
+ assert.equal(cred.externalId, 'f123');
+ assert.equal(cred.provider, 'facebook');
+ assert.equal(cred.authScheme, 'oAuth 2.0');
+ assert.deepEqual(cred.credentials, {accessToken: 'at1', refreshToken: 'rt1'});
+
+ assert.equal(userId, cred.userId);
+
+ // Follow the belongsTo relation
+ cred.user(function (err, user) {
+ assert(!err, 'No error should be reported');
+ assert.equal(user.username, 'facebook.abc');
+ assert.equal(user.email, 'uuu@facebook.com');
+ done();
+ });
+ });
+ });
+
+ it('supports linked 3rd party accounts if exists', function (done) {
+ UserCredential.create({
+ externalId: 'f456',
+ provider: 'facebook',
+ userId: userId,
+ credentials: {accessToken: 'at1', refreshToken: 'rt1'}
+ }, function (err, cred) {
+ UserCredential.link(userId, 'facebook', 'oAuth 2.0',
+ {emails: [
+ {value: 'abc1@facebook.com'}
+ ], id: 'f456', username: 'xyz'
+ }, {accessToken: 'at2', refreshToken: 'rt2'}, function (err, cred) {
+ assert(!err, 'No error should be reported');
+
+ assert.equal(cred.externalId, 'f456');
+ assert.equal(cred.provider, 'facebook');
+ assert.deepEqual(cred.credentials, {accessToken: 'at2', refreshToken: 'rt2'});
+
+ assert.equal(userId, cred.userId);
+
+ // Follow the belongsTo relation
+ cred.user(function (err, user) {
+ assert(!err, 'No error should be reported');
+ assert.equal(user.username, 'facebook.abc');
+ assert.equal(user.email, 'uuu@facebook.com');
+ done();
+ });
+ });
+ });
+ });
+
+});
View
83 test/model.user-identity.test.js
@@ -2,7 +2,6 @@ var m = require('./init');
var loopback = require('loopback');
var assert = require('assert');
var UserIdentity = m.UserIdentity;
-var UserCredential = m.UserCredential;
var User = loopback.User;
before(function (done) {
@@ -15,7 +14,7 @@ describe('UserIdentity', function () {
var ds = loopback.createDataSource({
connector: 'memory'
});
-
+
UserIdentity.attachTo(ds);
User.attachTo(ds);
UserIdentity.belongsTo(User);
@@ -163,83 +162,3 @@ describe('UserIdentity', function () {
});
});
-
-describe('UserCredential', function () {
- var userId = null;
- before(function (done) {
- var ds = loopback.createDataSource({
- connector: 'memory'
- });
-
- UserCredential.attachTo(ds);
- User.attachTo(ds);
- UserCredential.belongsTo(User);
-
- User.create({
- username: 'facebook.abc',
- email: 'uuu@facebook.com',
- password: 'pass'
- }, function (err, user) {
- userId = user.id;
- done(err);
- });
- });
-
- it('supports linked 3rd party accounts', function (done) {
- UserCredential.link(userId, 'facebook', 'oAuth 2.0',
- {emails: [
- {value: 'foo@bar.com'}
- ], id: 'f123', username: 'xyz'
- }, {accessToken: 'at1', refreshToken: 'rt1'}, function (err, cred) {
- assert(!err, 'No error should be reported');
-
- assert.equal(cred.externalId, 'f123');
- assert.equal(cred.provider, 'facebook');
- assert.equal(cred.authScheme, 'oAuth 2.0');
- assert.deepEqual(cred.credentials, {accessToken: 'at1', refreshToken: 'rt1'});
-
- assert.equal(userId, cred.userId);
-
- // Follow the belongsTo relation
- cred.user(function (err, user) {
- assert(!err, 'No error should be reported');
- assert.equal(user.username, 'facebook.abc');
- assert.equal(user.email, 'uuu@facebook.com');
- done();
- });
- });
- });
-
- it('supports linked 3rd party accounts if exists', function (done) {
- UserCredential.create({
- externalId: 'f456',
- provider: 'facebook',
- userId: userId,
- credentials: {accessToken: 'at1', refreshToken: 'rt1'}
- }, function (err, cred) {
- UserCredential.link(userId, 'facebook', 'oAuth 2.0',
- {emails: [
- {value: 'abc1@facebook.com'}
- ], id: 'f456', username: 'xyz'
- }, {accessToken: 'at2', refreshToken: 'rt2'}, function (err, cred) {
- assert(!err, 'No error should be reported');
-
- assert.equal(cred.externalId, 'f456');
- assert.equal(cred.provider, 'facebook');
- assert.deepEqual(cred.credentials, {accessToken: 'at2', refreshToken: 'rt2'});
-
- assert.equal(userId, cred.userId);
-
- // Follow the belongsTo relation
- cred.user(function (err, user) {
- assert(!err, 'No error should be reported');
- assert.equal(user.username, 'facebook.abc');
- assert.equal(user.email, 'uuu@facebook.com');
- done();
- });
- });
- });
- });
-
-});
-

0 comments on commit 9ef62a4

Please sign in to comment.
Something went wrong with that request. Please try again.