Twitterアプリ登録
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