每个认证(Everyauth)未定义。

9

我是新手,对于Node.js和Everyauth等技术还不熟悉。但是我在使用Everyauth时出现了一些问题。当我访问Everyauth对象时,会出现错误“everyauth未定义”。然而,使用Everyauth的oauth流程本身是正常工作的。以下是详细信息:

入口点 - 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 模块。
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

编辑 - 添加我所遵循的示例:

来自everyauth网站

在主应用程序文件中 - https://github.com/bnoguchi/everyauth/blob/master/example/server.js,使用以下方法呈现视图...

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

在视图文件中,访问everyauth对象 - https://github.com/bnoguchi/everyauth/blob/master/example/views/home.jade
- if (!everyauth.loggedIn)
  h2 Not Authenticated

每个认证对象都没有在此传递到视图中,除非我漏掉了什么。
3个回答

3

这是一个旧问题,但我遇到了相同的问题,看到另一个开发者也有完全相同的问题,而唯一的答案完全不相关,感到非常沮丧。

我花了几个小时逐行比较我的代码和示例,最终成功了:

你有:

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

但应该是

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

就是这样了。现在,everyauth 已经在 Jade 视图中定义,并且一切都按预期工作。


谢谢,省去了我做同样的练习! - Geoff
这个解决方案在最新的express和everyauth版本中对我不起作用。下面是我使用的解决方案。希望能有所帮助。 - Anmol Saraf

0

这个链接提供的解决方案对我非常有效 -

将以下函数添加到您的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();
  };
};

并更新此行

app.use(everyauth.middleware());

像这样 -

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

希望能对你有所帮助。


-1
这是因为你试图从jade模板中访问everyauth。 虽然你可以将everyauth变量传递到模板中,但这不是一个好的做法。
相反,if/else块应该留在你的控制器中。 然后,如果用户已登录或未登录,你可以渲染不同的模板。
类似这样的东西。
if(everyauth.loggedIn){

  template = 'authenicated';
}
 else{

  template = 'unauthenicated';
}

res.render(template, {

    title: { title: 'Title' }

});

我添加了我从 everyauth 的 GitHub 页面上遵循的示例。everyauth 对象未传递到模板中。我试图弄清楚是否有遗漏什么。 - user1566788

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接