node : passport で twitter, facebook認証, express

http://passportjs.org/

http://passportjs.org/guide/

app.post('/login', passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login' }));

こんな感じで簡単に認証を入れられるようです

$ npm install passport –save

$ tsd query passport -a install -sr
<< tsd 0.5.7
- passport/passport.d.ts : : 2015-05-08 12:31
>> express/express.d.ts : : 2015-05-08 12:31
>> node/node.d.ts : : 2015-05-08 12:31
>> running install..
> skipped existing: express/express.d.ts
>> written 2 files:
- node/node.d.ts
- passport/passport.d.ts

express sessionを使うので
$ npm install connect-mongo –save
$ npm install express-session –save
$ npm install cookie-parser –save
$ tsd query express-session -a install -s
$ tsd query cookie-parser -a install -s
アタリも入れておく. connect-mongo は tsd が無いけど普通に。

https://github.com/expressjs/session

app.jsにこんなかんじで追加してみる
app.use(session({
secret: 'my session',
store: new mongoConnect({
db: 'session',
host: '192.168.0.0',
port: '00000'
}),
cookie: {
path: '/',
httpOnly: false,
secure: false,
maxAge: null
// maxAge: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000)
}
}));
app.use(passport.initialize());
app.use(passport.session());

http://passportjs.org/guide/twitter/

passport-twitter で認証

ちょっと適当ですが、
typescriptで別ファイルで書いてとりあえず動いた状態です。

下の認証後のdoneのあとに呼ばれます。このuserオブジェクトがsessionに保存されます。
userオブジェクトは何でもOKですが毎回使うものだけ入れる感じで

// auth
passport.serializeUser(function(user, done) {
done(null, user);
});

セッションに保存されているuserを呼び戻すところです
user が req.session.passport.userの中に入ります。
passport.deserializeUser(function(user, done) {
done(null, user);
});

twitter の情報と user 検索とdoneでセッションに保存です。
UserModel は自分の mongo モデルクラスです。
var twitterStrategy = require('passport-twitter').Strategy;
passport.use(new twitterStrategy({
consumerKey : '',
consumerSecret: '',
callbackURL : "https://---/auth/twitter/callback"
},
function(token, tokenSecret, profile, done) {
var userObj = usermodel.GenUser();
userObj.profile = profile;
userObj.pid = UserModel.generatePid( profile.provider, profile.id );
if ( profile.provider == 'twitter') {
userObj.auth.twitter = {
token : token,
tokenSecret : tokenSecret
};
}
UserModel.findOrCreate( userObj, function(err, user) {
if (err) { return done(err); }
done(null, user);
});
}
));

ログインの呼び出しとコールバック。
/auth 以下の routing用ファイルです。

// /auth/twitter でtwitter認証へリダイレクト
router.get('/twitter', passport.authenticate('twitter'));
// コールバックで認証。上のtwitterStrategyのが呼ばれます。
router.get('/twitter/callback',
passport.authenticate('twitter', {
successRedirect: '/auth/profile',
failureRedirect: '/auth/login'
}));

保存したプロフィール情報を表示してみる
session.passportが tsdで設定されていないので anyに落としてから userとprofileを入れてみています。
params.genParams は適当なデータをマージしているだけです。
router.get('/profile', function(req, res, next) {
var sess: any = req.session;
if ( req.isAuthenticated() ) {
var profile: passport.Profile = sess.passport.user.profile;
res.render('auth/profile',
params.genParams({
title: 'profile',
profile: profile,
user: sess.passport.user
})
);
} else {
res.redirect('/');
}
res.end();
});

無事ログイン機能が出来ました。

This entry was posted on 日曜日, 5月 10th, 2015 at 11:22 AM and is filed under blog, node.js, Typescript. You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

Unityによるゲームを公開しております iOS/Android
https://itunes.apple.com/jp/app/lost-knight-3d-action/id900917032
https://play.google.com/store/apps/details?id=com.groundroad.runknight

各種開発支援・機能開発等小さいお仕事などもお請けしております。
unity開発支援, PHPシステム開発, javascript/html5 フロント開発, titanium mobileアプリ開発
お気軽にお問い合わせください
大崎・五反田近郊での対面でのお打ち合わせはいつでも可能です。