I read the certificate, fiddled Google in search of a similar problem, and I was not alone, on the everyauth project gitkhab people also encountered this problem, but what helped them did not help me.
The essence is the authorization, and I need to save the found (or created) user from the database to the session variable, which would then be pulled by the helper from there for the view. Just the user information from the social network will be saved, including in the helper everyauth itself. Here is the app.js code
var express = require('express') , everyauth = require('everyauth') , Promise = everyauth.Promise , util = require('util') , mongoose = require('mongoose') , routes = require('./routes') , _ = require('underscore') mongoose.connect('mongodb://127.0.0.1/base'); var Schema = mongoose.Schema , ObjectId = Schema.ObjectId; // Everyauth settings above that app.configure everyauth.twitter .consumerKey('secretKey') .consumerSecret('secret') .findOrCreateUser(function (session, accessToken, accessTokenSecret, twitterUserData){ var promise = this.Promise(); User.findOrCreateByUidAndNetwork(twitterUserData.id, 'twitter', twitterUserData, promise); return promise; }) .redirectPath('/') everyauth.facebook .appId("secretId") .appSecret("secret") .findOrCreateUser( function (session, accessToken, accessTokenExtra, fbUserMetadata) { var promise = this.Promise(); User.findOrCreateByUidAndNetwork(fbUserMetadata.id, 'facebook', fbUserMetadata, promise); return promise; }) .redirectPath('/'); var app = module.exports = express.createServer(); // Configuration app.configure(function(){ app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.bodyParser()); app.use(express.cookieParser()); app.use(express.session({secret:'blablabla'})); app.use(everyauth.middleware()); // Yes, i'm use it app.use(express.methodOverride()); app.use(app.router); // And it app.use(express['static'](__dirname + '/public')); }); everyauth.helpExpress(app); // And this above that routes app.dynamicHelpers({ currentUser: function (req, res){ return req.user; //it's empty! } }) app.configure('development', function(){ app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }); app.configure('production', function(){ app.use(express.errorHandler()); }); // Routes app.get('/', routes.index); require("./controllers/user"); app.listen(80);
Here is the user model code:
var Schema = mongoose.Schema , ObjectId = Schema.ObjectId; var UserSchema = new Schema({ "uid":{type:String}, "name":{type:String}, "network":{type:String}, "profile":{} }); mongoose.model('User', UserSchema); var User = mongoose.model('User');
And user search function with promise filling:
this.findOrCreateByUidAndNetwork = function(uid, network, profile, promise) { User.find({uid: uid, network: network}, function(err, users) { if(err) throw err; if(users.length > 0) { promise.fulfill(users[0]);// <-- what i want:) } else { var user = new User(); user.network = network; user.uid = uid; user.profile = profile; user.name = profile.first_name || profile.name; user.save(function(err) { if (err) throw err; promise.fulfill(user); }); } }); };
Thanks for attention