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.
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.
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.
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' }
});