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();
});
無事ログイン機能が出来ました。