How to decouple a customized loopback-component-passport user model in Loopback?

335 views
Skip to first unread message

Steeve Fong

unread,
Mar 6, 2015, 5:29:51 AM3/6/15
to loopb...@googlegroups.com
Hello everyone,

I'm trying to build a decoupled user-model component that can be injected into a project without the need for further configurations.
My approach was to define a middleware 'loopback-user' in 'auth' phase with codes as follow :

var loopback = require('loopback');
var passport = require('loopback-component-passport');
var providers = require('./providers.json');

function loadModel(jsonFile, baseModel) {
  var modelDefinition = require(jsonFile);
  return baseModel.extend(modelDefinition.name,
    modelDefinition.properties,
    {
      relations: modelDefinition.relations
    });
}

exports.userIdentity = loadModel('./lib/models/user-identity.json', passport.UserIdentity);
exports.userCredential = loadModel('./lib/models/user-credential.json', passport.UserCredential);
var UserModel = loadModel(loopback.User, './lib/models/user.json');
// setup user custom application logic
exports.user = require('./lib/models/user')(UserModel);

module.exports = function loopbackUser (options) {
  var opts = options || {};

  exports.user.autoAttach = opts.datasource || 'db';
  exports.userIdentity.autoAttach = opts.datasource || 'db';
  exports.userCredential.autoAttach = opts.datasource || 'db';

  var PassportConfigurator = passport.PassportConfigurator;

  return function loopbackUser (req, res, next) {
    var passportConfigurator = new PassportConfigurator(req.app);

    passportConfigurator.init();

    passportConfigurator.setupModels({
      userModel: exports.user,
      userIdentityModel: exports.userIdentity,
      userCredentialModel: exports.userCredential
    });

    for (var provider in providers) {
      var config = providers[provider];

      config.session = config.session !== false;
      passportConfigurator.configureProvider(provider, config);
    }

    next();
  };
};


I tried to setup the module loopback-component-passport using some settings from loopback-example-passport. But, I got the following error trace:

500 AssertionError: user must be a descendant of loopback.Model

  •    at EventEmitter.app.model (/Users/.../node_modules/loopback/lib/application.js:132:5)
  •    at loopbackUser (/Users/.../server/middleware/loopback-user/index.js:32:13)
  •    at Layer.handle [as handle_request] (/Users/.../node_modules/loopback/node_modules/express/lib/router/layer.js:82:5)
  •    at trim_prefix (/Users/.../node_modules/loopback/node_modules/express/lib/router/index.js:302:13)
  •    at /Users/.../node_modules/loopback/node_modules/express/lib/router/index.js:270:7
  •    at Function.proto.process_params (/Users/.../node_modules/loopback/node_modules/express/lib/router/index.js:321:12)
  •    at next (/Users/.../node_modules/loopback/node_modules/express/lib/router/index.js:261:10)
  •    at compression (/Users/.../node_modules/compression/index.js:207:5)
  •    at Layer.handle [as handle_request] (/Users/.../node_modules/loopback/node_modules/express/lib/router/layer.js:82:5)
  •    at trim_prefix (/Users/.../node_modules/loopback/node_modules/express/lib/router/index.js:302:13)

 I played around within the different loopback phases and I got different errors :
'initial' phase : The model type must be a constructor error.
'final' phase : the user model is not exposed over rest.

Is this implementation currently possible? Is something's missing?
Any approach suggestions?

Thank you in advance.

jmls

unread,
Oct 6, 2015, 4:02:26 PM10/6/15
to LoopbackJS

Hi Steeve (?) 

Did you get anywhere with this ?

Thanks
Reply all
Reply to author
Forward
0 new messages