LoginSignup
27
27

More than 5 years have passed since last update.

Express で twitter OAuthで認証してmongoにほりこむとこまで

Posted at

Twitterアプリ登録

ここで https://dev.twitter.com/

expressをグローバルにインスールしてアプリの雛形を作る

Generator使いたいだけなので任意

npm install express -g
express oauth_test

必要なnpmを導入

package.jsonに追加して…

/package.json
{
  "name": "application-name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app"
  },
  "dependencies": {
    "express": "3.0.3",
    "jade": "*",
    "passport": "*", // <= 追加
    "passport-twitter": "*", // <= 追加
    "mongoose": "*" // <= 追加
  }
}

インストール

npm install

Mongo関連を準備

mongooseいらなかったかもしれない

/app.js
var mongoose = require('mongoose')

mongoose.connect("mongodb://localhost/oauth_test");

var userSchema = new mongoose.Schema({
  uid: Number
});

// mogooseからfindAndModifyがみれないので追加
userSchema.statics.findAndModify = function(query, sort, doc, options, callback) {
  return this.collection.findAndModify(query, sort, doc, options, callback);
};

var User = mongoose.model('User', userSchema);

passportを使用する準備

/app.js
var   passport = require('passport')
    , TwitterStrategy = require('passport-twitter').Strategy;

// セッションに入れるときのシリアライザ?と
// デシリアライザ?。必要だったので追加。
passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(obj, done) {
  done(null, obj);
});

// 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()); // session使うためにパーサーを有効に
  app.use(express.session({secret: "hogesecret"})); // session有効
  app.use(passport.initialize()); // passportの初期化処理
  app.use(passport.session()); // passportのsessionを設定(中身はしらぬ)
  // -- 追加ココまで --
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

passport-twitterの設定

/app.js
passport.use(new TwitterStrategy({
  consumerKey: "<YOUR KEY>",
  consumerSecret: "<YOUR SECRET>",
  callbackURL: "http://localhost:3000/auth/twitter/callback"
}, function(token, tokenSecret, profile, done) {
  User.findAndModify({
    // Query
    uid: profile.id
  },
    // sort
    []
  ,{
    // Object
    $set: {
      uid: profile.id
    }
  }, {
    // Option
    upsert: true
  }, function(err, user) {
    if (err) {
      return done(err);
    }

    done(null, user._id);
  });
}));

// -- 追加したルート --
// ユーザーからリクエストをもらうルート
app.get("/auth/twitter", passport.authenticate('twitter'));

// Twitterからcallbackうけるルート
app.get("/auth/twitter/callback", passport.authenticate('twitter', {
  successRedirect: '/',
  failureRedirect: '/login'
}));

適当なviewを用意して完了

/app.js
app.get('/login', routes.login);
/routes/index.js
/*
 * GET login
 */

exports.login = function(req, res){
  res.render('login', { title: 'Express' });
};
/views/login.jade
extend layout

block content
  a(href="/auth/twitter") login

完成サンプル

つたない説明なので動くサンプルをアップ。。。
https://github.com/sutetotanuki/node_oauth_sample

27
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
27