What is the best facebook connect library for node.js?

I've seen multiple tools for working with node.js and facebook connect. However many of them seem incomplete, overly-complex (non abstract) or no longer updated/maintained.

I've found these three projects:

https://github.com/DracoBlue/node-facebook-client

https://github.com/dominiek/node-facebook

https://github.com/egorFiNE/facebook-connect

https://github.com/ciaranj/node-oauth

Here one of the authors even discusses why he once again rolled his own, due to shortcomings in other implementations:

http://groups.google.com/group/nodejs/browse_thread/thread/bb46cb08e51fdda6

Does anyone have any real experience actually authenticating users and storing their facebook id's in their database using node.js and facebook connect?

I have a feeling that the answer is pretty much no and I'll have to build on top of one of the above systems to make things much simpler, but I wanted to check first.

Edit: Note make sure you use the STABLE version of node.js

Answers


Did you not find ciaranj's connect-auth

const fbId = ""; #x
const fbSecret = ""; #y
const fbCallbackAddress= "http://localhost:4000/auth/facebook";
//var RedisStore = require('connect-redis');
var express= require('express');
var auth= require('connect-auth')
var app = express.createServer();
app.configure(function(){
  app.use(express.cookieDecoder());
  app.use(express.logger());
  //app.use(connect.session({ store: new RedisStore({ maxAge: 10080000 }) }));
  app.use(express.session());
  app.use(auth( [
    auth.Facebook({appId : fbId, appSecret: fbSecret, scope: "email", callback: fbCallbackAddress})
  ]) );
});


app.get('/logout', function(req, res, params) {
    req.logout();
    res.writeHead(303, { 'Location': "/" });
    res.end('');
});

app.get('/', function(req, res, params) {
    if( !req.isAuthenticated() ) {
        res.send('<html>                                              \n\
          <head>                                             \n\
            <title>connect Auth -- Not Authenticated</title> \n\
            <script src="http://static.ak.fbcdn.net/connect/en_US/core.js"></script> \n\
          </head><body>                                             \n\
            <div id="wrapper">                               \n\
              <h1>Not authenticated</h1>                     \n\
              <div class="fb_button" id="fb-login" style="float:left; background-position: left -188px">          \n\
                <a href="/auth/facebook" class="fb_button_medium">        \n\
                  <span id="fb_login_text" class="fb_button_text"> \n\
                    Connect with Facebook                    \n\
                  </span>                                    \n\
                </a>                                         \n\
              </div></body></html>');
    } else {
         res.send( JSON.stringify( req.getAuthDetails()) );
    }
});

// Method to handle a sign-in with a specified method type, and a url to go back to ...
app.get('/auth/facebook', function(req,res) {
  req.authenticate(['facebook'], function(error, authenticated) { 
     if(authenticated ) {
        res.send("<html><h1>Hello Facebook user:" + JSON.stringify( req.getAuthDetails() ) + ".</h1></html>")
      }
      else {
        res.send("<html><h1>Facebook authentication failed :( </h1></html>")
      }
   });
});

app.listen(4000);


I find passport-facebook fairly simple and useful. I also like that the core passport module has 80+ auth strategies. (e.g. twitter, google, foursquare, github, digg, dropbox).

From the creator's github README:

// Set up the strategy
passport.use(new FacebookStrategy({
        clientID: FACEBOOK_APP_ID,
        clientSecret: FACEBOOK_APP_SECRET,
        callbackURL: "http://localhost:3000/auth/facebook/callback"
    },
    function(accessToken, refreshToken, profile, done) {
        User.findOrCreate({ facebookId: profile.id }, function (err, user) {
            return done(err, user);
        });
    }
));

// Use the authentication
app.get('/auth/facebook',
    passport.authenticate('facebook'),
    function(req, res){
        // The request will be redirected to Facebook for authentication, so
        // this function will not be called.
});

app.get('/auth/facebook/callback',
    passport.authenticate('facebook', { failureRedirect: '/login' }),
    function(req, res) {
        // Successful authentication, redirect home.
        res.redirect('/');
});

I have used Brian Noguchi's everyauth. It works w/ node.js v.0.4.x. You can find that here.

It has native support for mongodb using mongoose-auth plugin, again written by brian.


Need Your Help

Configuring Jetty for high request volume

java performance http jetty

In our application we need to handle request volumes in excess of 5,000 requests per second. We've been told that this is feasible with Jetty in our type of application (where we must expose a JSO...

Detect the number of cores on windows

windows r multicore

If I am running R on linux or on a mac, I can detect the number of available cores using multicore:::detectCores(). However, there's no windows version of the multicore functions, so I can't use t...