前回の、【Node.js】OAuth認証でPassportが最強に使いやすいの続きです。今回は準備から実際にコーディングのところまで説明します。

検証、制作環境など

  • Mac OS 10.6 山に行きたい(´・ω・`)
  • ターミナル.app
  • node.js -v v0.8.4
  • express version 3.0.0rc3
  • jadeを使いたいと思います。
  • node-oauth node_modules
  • localhost:3000で検証

さっそく準備をします。

# expressでnode-passportとう名前のディレクトリを作ります。
# 名前はなんでもいいですが、今回はそうします。
# -sでオプションでセッションをつけます。
$ express -s node-passport

# node-passportに移動してnpm installします。
$ cd node-passport
$ npm install

# passport, passport-facebook, passport-twitterのmoduleをインストール。
$ npm install passport
$ npm install passport-facebook
$ npm install passport-twitter

これで準備完了です。app.jsを開いて、コードを書き足していきます。


/**
 * Module dependencies.
 */

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path')
  //passport moduleをrequire。
  , passport = require('passport')
  //passport-facebookをrequire。
  , FacebookStrategy = require('passport-facebook').Strategy
  //passport-twitterをrequire
  , TwitterStrategy = require('passport-twitter').Strategy
;

var app = express();

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser('your secret here'));
  app.use(express.session());
  //passportのinitializeとsessionを使います。
  app.use(passport.initialize());
  app.use(passport.session());

  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

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

app.get('/', routes.index);
app.get('/users', user.list);

http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

//passportのセッションを使うので
//リアライズ、デシリアライズのための関数を追記。 
passport.serializeUser(function(user, done){
  done(null, user);
});
 
passport.deserializeUser(function(obj, done){
  done(null, obj);
});

//ここからFacebook認証の記述
var FACEBOOK_APP_ID = "--insert-facebook-app-id-here--"
var FACEBOOK_APP_SECRET = "--insert-facebook-app-secret-here--";

passport.use(new FacebookStrategy({
  clientID: FACEBOOK_APP_ID,
  clientSecret: FACEBOOK_APP_SECRET,
  callbackURL: "http://localhost:3000/auth/facebook/callback"
                                  },
  function(accessToken, refreshToken, profile, done){
    process.nextTick(function(){
      done(null ,profile);
    });
  }
));

app.get('/account/facebook', facebookEnsureAuthenticated, routes.account);

app.get('/login/facebook', routes.login_facebook);

app.get('/auth/facebook',
  passport.authenticate('facebook'),
  function(req, res){}
);

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

app.get('/logout/facebook', function(req, res){
  req.logout();
  res.redirect('/');
});

function facebookEnsureAuthenticated(req, res, next) {
  if (req.isAuthenticated()) { return next(); }
  res.redirect('/login');
};

//ここからTwitter認証の記述
var TWITTER_CONSUMER_KEY = "--insert-twitter-consumer-key-here--";
var TWITTER_CONSUMER_SECRET = "--insert-twitter-consumer-secret-here--";

passport.use(new TwitterStrategy({
  consumerKey: TWITTER_CONSUMER_KEY,
  consumerSecret: TWITTER_CONSUMER_SECRET,
  callbackURL: "http://127.0.0.1:3000/auth/twitter/callback"
  },
  function(token, tokenSecret, profile, done) {
    passport.session.accessToken = token;
    passport.session.profile = profile;
    process.nextTick(function () {
      return done(null, profile);
    });
  }
));

app.get('/account/twitter', twitterEnsureAuthenticated, routes.account);

app.get('/login/twitter', routes.login_facebook);

app.get('/auth/twitter',
  passport.authenticate('twitter'),
  function(req, res){}
);

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

app.get('/logout/twitter', function(req, res){
  req.logout();
  res.redirect('/');
});

function twitterEnsureAuthenticated(req, res, next) {
  if (req.isAuthenticated()) { return next(); }
  res.redirect('/login/twitter');
};

passportを使えば同じような書き方で簡単にfacebookとtwitterのOAuth認証をすることができます。

【Node.js】PassportでFacebookとTwitterのOAuth認証する方法
Pocket

Tagged on:     

One thought on “【Node.js】PassportでFacebookとTwitterのOAuth認証する方法

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です