9

I am new to nodejs, everyauth,etc. I am having some trouble with everyauth. In my view, if I access everyauth object, I get an error 'everyauth is not defined'. However the oauth flow itself works fine with everyauth. Here are the details,

entry point - app.js

var express = require('express');
var everyauth = require('everyauth');
everyauth.debug = true;
var app = express();


everyauth['37signals']
  .appId('e6e76726501abf1b5627fe854b384ef8d62d7a55')
  .appSecret('7c6891f46cb19aaf1831785968630ed4a1b3c342')
  .findOrCreateUser( function (sess, accessToken, accessSecret, _37signalsUser) {
  //code to handle find or create
}
  .redirectPath('/');

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.cookieParser());
  app.use(express.session({ secret: 'foobar' }));
  app.use(express.bodyParser());
  app.use(everyauth.middleware());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
  everyauth.helpExpress(app);
});




app.configure('development', function(){
  console.log('inside development configure');
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
});

app.configure('production', function(){
  app.use(express.errorHandler()); 
});

app.get('/', function (req, res) {
  console.log('everyauthloggedin='+ everyauth.loggedIn); // everyauth.loggedIn is undefined
    res.render('home');
});

home.jade

if(!everyauth.loggedIn) // get everyauth is not defined
    h2 Not authenicated 
else
    h2 Authenicated
    p= JSON.stringify(everyauth['37signals'].user)  

node modules installed,

highrise@0.0.1c:\dev\misc\hge\highrise
├─┬ everyauth@0.2.34
│ ├─┬ connect@2.3.9
│ │ ├── bytes@0.1.0
│ │ ├── cookie@0.0.4
│ │ ├── crc@0.2.0
│ │ ├── formidable@1.0.11
│ │ ├── fresh@0.1.0
│ │ ├── qs@0.4.2
│ │ └─┬ send@0.0.3
│ │   ├── mime@1.2.6
│ │   └── range-parser@0.0.4
│ ├── debug@0.5.0
│ ├── node-swt@0.1.1
│ ├── node-wsfederation@0.1.1
│ ├── oauth@0.9.8
│ ├── openid@0.4.2
│ ├── request@2.9.203
│ └─┬ xml2js@0.1.14
│   └── sax@0.4.2
├─┬ express@3.0.0rc3
│ ├── commander@0.6.1
│ ├─┬ connect@2.4.3
│ │ ├── bytes@0.1.0
│ │ ├── formidable@1.0.11
│ │ ├── pause@0.0.1
│ │ └── qs@0.4.2
│ ├── cookie@0.0.4
│ ├── crc@0.2.0
│ ├── debug@0.7.0
│ ├── fresh@0.1.0
│ ├── methods@0.0.1
│ ├── mkdirp@0.3.3
│ ├── range-parser@0.0.4
│ └─┬ send@0.0.3
│   └── mime@1.2.6
├─┬ jade@0.27.2
│ ├── commander@0.6.1
│ └── mkdirp@0.3.0
├── request@2.10.0
├─┬ sequelize@1.5.0
│ ├── commander@0.6.1
│ ├── generic-pool@1.0.9
│ ├── lingo@0.0.5
│ ├── moment@1.1.1
│ ├─┬ mysql@0.9.6
│ │ └─┬ hashish@0.0.4
│ │   └── traverse@0.6.3
│ ├── underscore@1.2.4
│ ├── underscore.string@2.0.0
│ └── validator@0.3.9
└─┬ xml2js@0.1.14
  └── sax@0.4.2

Edit - Adding the example which I followed,

From everyauth site

In the main app file - https://github.com/bnoguchi/everyauth/blob/master/example/server.js, render the view using..

app.get('/', function (req, res) {
  res.render('home');
});

In the view file,access the everyauth object - https://github.com/bnoguchi/everyauth/blob/master/example/views/home.jade

- if (!everyauth.loggedIn)
  h2 Not Authenticated

The everyauth object is not passed to the view here, unless I am missing something.

user1566788
  • 585
  • 2
  • 6
  • 14

3 Answers3

3

This is an old question, but I was having the same problem and was very frustrated to see that another dev had the exactly same problem and the only answers where completely off

It took me a couple of hours to do a line-by-line comparisson of my code and the examples, but finally got it right:

you have:

app.configure(function(){
    //...
    app.use(everyauth.middleware());
    //...
}

but shoud be

app.configure(function(){
    //...
    app.use(everyauth.middleware(app));
    //...
}

and that's it. now everyauth is defined on the jade views and all works as expected.

David Lay
  • 2,956
  • 4
  • 27
  • 48
0

The following solution from this LINK worked very well for me -

Add the following functions to your app.js

function preEveryauthMiddlewareHack() {
 return function (req, res, next) {
  var sess = req.session
    , auth = sess.auth
    , ea = { loggedIn: !!(auth && auth.loggedIn) };

  // Copy the session.auth properties over
  for (var k in auth) {
    ea[k] = auth[k];
  }

  if (everyauth.enabled.password) {
    // Add in access to loginFormFieldName() + passwordFormFieldName()
    ea.password || (ea.password = {});
    ea.password.loginFormFieldName = everyauth.password.loginFormFieldName();
    ea.password.passwordFormFieldName = everyauth.password.passwordFormFieldName();
  }

  res.locals.everyauth = ea;

  next();
}

};

function postEveryauthMiddlewareHack() {
  var userAlias = everyauth.expressHelperUserAlias || 'user';
  return function( req, res, next) {
    res.locals.everyauth.user = req.user;
    res.locals[userAlias] = req.user;
    next();
  };
};

And update this line

app.use(everyauth.middleware());

like this -

   app.use(preEveryauthMiddlewareHack());
   app.use(everyauth.middleware());
   app.use(postEveryauthMiddlewareHack());

Hope it helps.

Anmol Saraf
  • 15,075
  • 10
  • 50
  • 60
-1

That's because you trying to access everyauth from jade template. Although you could pass the everyauth variable to the template, this is not good practice.

Instead the if/else block should remain in your controller. Then you can render a different template if the user is login or not.

Something like this

if(everyauth.loggedIn){

  template = 'authenicated';
}
 else{

  template = 'unauthenicated';
}

res.render(template, {

    title: { title: 'Title' }

});
saeed
  • 3,861
  • 3
  • 25
  • 23
  • I added the example I followed from everyauth github page. The everyauth object is not passed to the template. I was trying to understand if I a missing something here. – user1566788 Aug 27 '12 at 17:18