【问题标题】:everyauth with express (boilerplate) application带有 express(样板)应用程序的everyauth
【发布时间】:2012-05-27 01:52:50
【问题描述】:

我正在尝试将 facebook 登录集成到 express 应用程序中(使用来自 https://github.com/robrighter/node-boilerplate 的节点样板代码)。

这里是 server.js 代码:

    //setup Dependencies
var connect = require('connect')
    , express = require('express')
    , io = require('socket.io')
    , port = (process.env.PORT || 3000)
    , conf = require('./conf')
    , everyauth = require('everyauth')
    , facebookGraphApi = require('Facebook_Graph_API');

//Set up express server
var server = express.createServer();

//everyauth helper method for express apps
everyauth.debug = true;

//setup everyauth
var usersById = {};
var nextUserId = 0;

function addUser (source, sourceUser) {
  var user;
  if (arguments.length === 1) { // password-based
    user = sourceUser = source;
    user.id = ++nextUserId;
    return usersById[nextUserId] = user;
  } else { // non-password-based
    user = usersById[++nextUserId] = {id: nextUserId};
    user[source] = sourceUser;
  }
  return user;
}

var usersByFbId = {};

everyauth.everymodule
  .findUserById( function (id, callback) {
    callback(null, usersById[id]);
  });

//<-- this has to go before the server configure
everyauth
  .facebook
    .appId(conf.fb.appId)
    .appSecret(conf.fb.appSecret)
    .findOrCreateUser( function (session, accessToken, accessTokenExtra, fbUserMetadata) {
      return usersByFbId[fbUserMetadata.id] ||
        (usersByFbId[fbUserMetadata.id] = addUser('facebook', fbUserMetadata));
    })
    .redirectPath('/');//note that this can be some other path than /

everyauth.helpExpress(server);

//configure express server
server.configure(function(){
    server.set('views', __dirname + '/views');
    server.set('view options', { layout: false });
    server.use(connect.bodyParser());
    server.use(express.cookieParser());
    server.use(everyauth.middleware());
    server.use(express.session({ secret: "shhhhhhhhh!"}));
    server.use(connect.static(__dirname + '/static'));
    server.use(server.router);
});

//setup the errors
server.error(function(err, req, res, next){
    if (err instanceof NotFound) {
        res.render('404.jade', { locals: { 
                  title : '404 - Not Found'
                 ,description: ''
                 ,author: ''
                 ,analyticssiteid: 'XXXXXXX' 
                },status: 404 });
    } else {
        res.render('500.jade', { locals: { 
                  title : 'The Server Encountered an Error'
                 ,description: ''
                 ,author: ''
                 ,analyticssiteid: 'XXXXXXX'
                 ,error: err 
                },status: 500 });
    }
});

//start the server
server.listen(port);

//Setup Socket.IO
var io = io.listen(server);
io.sockets.on('connection', function(socket){
  console.log('Client Connected');
  socket.on('message', function(data){
    socket.broadcast.emit('server_message',data);
    socket.emit('server_message',data);
  });
  socket.on('disconnect', function(){
    console.log('Client Disconnected.');
  });
});



///////////////////////////////////////////
//              Routes                   //
///////////////////////////////////////////

/////// ADD ALL YOUR ROUTES HERE  /////////

server.get('/', function(req,res){
  res.render('index.jade', {
    locals : { 
              title : 'Promenade'
             ,description: 'Prom utilities'
             ,author: 'A Friday Lab production'
             ,analyticssiteid: 'XXXXXXX' 
            }
  });
});

server.get('/receiveToken', function(req, res){
    //once you have received the token, connect to the graph and get some data.
    var FB_ID = 'me';
    var ACCESS_TOKEN = 'test';
    var graph = new facebookGraphApi();
    var facebookUser = new graph.User(FB_ID,ACCESS_TOKEN);
});

//A Route for Creating a 500 Error (Useful to keep around)
server.get('/500', function(req, res){
    throw new Error('This is a 500 Error');
});

//The 404 Route (ALWAYS Keep this as the last route)
server.get('/*', function(req, res){
    throw new NotFound;
});

function NotFound(msg){
    this.name = 'NotFound';
    Error.call(this, msg);
    Error.captureStackTrace(this, arguments.callee);
}


console.log('Listening on http://0.0.0.0:' + port );

这是我的玉观:

block content
    div
        a(id='sender')='Send a Message'
        ul(id='reciever')
    div
        - if (!everyauth.loggedIn)
            h2 Not Authenticated
            #fb-login.fb_button(style='background-position: left -188px')
            a.fb_button_medium(href='/auth/facebook')
                span#fb_login_text.fb_button_text
                Connect with Facebook
        - else
            h2 Authenticated
            - if (everyauth.facebook)
                h3 Facebook User Data
                p= JSON.stringify(everyauth.facebook.user)
                p= 'facebook access token is '+ everyauth.facebook.accessToken
            h3
                a(href='/logout') Logout

但是,当我启动网络应用程序并单击“与 facebook 连接”链接时,我的应用程序崩溃并出现以下错误:

facebook 的步骤 getSession 是有希望的: session ;然而 步骤不返回任何内容。通过返回预期值来修复步骤或 通过返回一个承诺所述值的 Promise。

我怀疑身份验证正在工作,因为我被重定向到这个网址:

=“> HTTP://本地主机:3000 / AUTH /实/回调代码= AQC1WKuD8Og_I0QWMUn9OzDy7hLdHip6DkWI2DgbG0yOgnPXkAJ2yMCWecjo7AfSfPcGFCc9nXIHPAqIZcb779WFT-NNCgKBFyoHu-Urq5fpgPfJgXC8QCJhcgmteXmh-VIgMKRGJnfKObMW2lvLFWQrnUjEBs3HveZjV1MecuhUr4MqIUPv6K3Kb2hCKpHDS0g# = EM>

这在我看来像是某种 access_token。

(我认为这不是 local.host 与 localhost 的问题,因为everyauth 示例在 localhost:3000 中运行良好)

谢谢!

(另外,如果有人能解释为什么我的问题被否决了,我会在以后尝试改进我的问题)

【问题讨论】:

  • 这是一个非常长的代码示例,供试图回答您的问题的人通过。尝试创建尽可能少的仍然存在错误的代码。这样做,您不仅可以更轻松地回答自己的问题,而且最终可能会自己回答!

标签: javascript node.js everyauth


【解决方案1】:

这里可能有几个问题;但我会尝试的第一件事是将 express.session 移动到everyauth.middleware 之前和 express.cookieParser 之后。

【讨论】:

    猜你喜欢
    • 2013-11-05
    • 1970-01-01
    • 2013-01-20
    • 2012-05-10
    • 2011-07-22
    • 1970-01-01
    • 2013-01-29
    • 2023-02-17
    • 2023-04-01
    相关资源
    最近更新 更多