Node.jsã§å›°ã‚‹ã®ã¯ã‚る機能を満ãŸã™ãŸã‚ã«ã©ã®ãƒ‘ッケージを使ã£ã¦ã„ã„ã‹åˆ†ã‹ã‚‰ãªã„ã“ã¨ã§ã™ã€‚発展途上ã¨ã„ã†ã“ã¨ã§ç´å¾—ã—ã¾ã—ょã†ã€‚発展途上ã¨ã„ã†ã‹ç”Ÿæ…‹ç³»ã€‚
今回ã€Facebookèªè¨¼ã‚’ã™ã‚‹ãŸã‚ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’探ã—ã¾ã—ãŸã€‚
stackoverflowã§è‰²ã€…比較コメントãŒã‚りã€ãれらやREADMEã‚’å‚考ã«ã—ã¾ã—ãŸã€‚
connect-authã¨ã„ã†ã®ã¯åå‰ã‚‚ã„ã„ã—ã€ãれãªã‚Šã®Staræ•°ã‚‚ã‚りã¾ã™ã€‚シンプルã§ã‚ˆã•ãã†ãªã®ã§ã™ãŒã€ã‚ˆãä½¿ã„æ–¹ãŒåˆ†ã‹ã‚Šã¾ã›ã‚“。人気ãŒã‚ã‚‹ã®ã¯å¾Œç™ºã®everyauthã®ã‚ˆã†ã§ã™ã€‚ã—ã‹ã—ã€ãƒ‰ã‚ュメントをèªã‚“ã§ã¿ã¦ã‚‚ã©ã†ã‚‚ピンã¨ãã¾ã›ã‚“。ãªã«ã‹ã€æ„Ÿæ€§ãŒåˆã‚ãªã„よã†ãªæ°—ãŒã—ã¾ã—ãŸã€‚
ãã“ã§ã€Passportを試ã™ã“ã¨ã«ã—ã¾ã—ãŸã€‚
http://passportjs.org/guide/facebook/ã«ãƒ‰ã‚ュメントãŒã‚りã¾ã™ã€‚everyauthã¨æ¯”較ã™ã‚‹ã¨ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°é‡ã¯å¤šã„ã‹ã‚‚ã—れã¾ã›ã‚“ãŒã€ãªã‚“ã¨ãªãã“ã¡ã‚‰ã®æ–¹ãŒåˆã†æ°—ãŒã—ã¾ã™ã€‚ãれã§ã‚‚ã€accessTokenãŒæ¬²ã—ã„ã ã‘ã®å ´åˆã¯ã€userオブジェクトãªã‚“ã¦ä½œã‚‰ãªãã¦ã‚‚ã„ã„ã®ã§ã™ã‘ã©ã€‚ã“れã¯everyauthã‚‚åŒã˜ï¼ˆï¼Ÿï¼‰ãªã®ã§æˆ‘æ…¢ã™ã‚‹ã¨ã—ã¾ã™ã€‚
ç°¡å˜ã«ä»Šä½¿ã£ã¦ã¿ãŸæ–¹æ³•を紹介ã—ã¾ã™ã€‚
ã¾ãšã¯ã€ãƒ©ã‚¤ãƒ–ラリã®ãƒãƒ¼ãƒ‰ã§ã™ã€‚サンプルをコピペã—ãŸã ã‘ã§ã™ã€‚
var passport = require('passport');
var FacebookStrategy = require('passport-facebook').Strategy;
ç¶šã„ã¦ã€FacebookStrategyã®è¨å®šã§ã™ã€‚accessTokenã ã‘æ¬²ã—ã‹ã£ãŸã®ã§ã€ãれをuserオブジェクトã«ã—ã¾ã™ã€‚å¿…è¦ã§ã‚れã°ã€profileã¨ã‹ã‚‚入れれã°ã‚ˆã„ã§ã—ょã†ã€‚userオブジェクトã¯ã€req.user
ã§å‚ç…§ã§ãã‚‹ã®ã§ã€accessTokenã¯req.user.accessToken
ã«ãªã‚Šã¾ã™ã€‚
passport.use(new FacebookStrategy({
clientID: process.env.FACEBOOK_APP_ID,
clientSecret: process.env.FACEBOOK_SECRET,
callbackURL: process.env.CALLBACK_URL
}, function(accessToken, refreshToken, profile, done) {
done(null, {
accessToken: accessToken
});
}));
サンプルã«ã‚ã£ãŸã‚·ãƒªã‚¢ãƒ©ã‚¤ã‚¶ã‚‚入れã¦ãŠãã¾ã™ã€‚ã“ã‚Œã¯æ›¸ã‹ãªãã¦ã‚‚よã•ãã†ã¨æ€ã£ãŸã®ã§ã™ãŒã€ã‚½ãƒ¼ã‚¹ã¿ã¦ã‚‚デフォルトãŒã‚るよã†ã«è¦‹ãˆãšã€å¿µã®ãŸã‚ã„れã¦ãŠãã¾ã™ã€‚
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});
強制的ã«ãƒã‚°ã‚¤ãƒ³ã•ã›ã‚‹middlewareã§ã™ã€‚一度ã€ãƒã‚°ã‚¤ãƒ³ã‚’促ã™ãƒšãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã»ã†ãŒè¦ªåˆ‡ã‹ã‚‚ã—れã¾ã›ã‚“。
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
next();
} else if (req.url.lastIndexOf('/auth/', 0) >= 0) {
next();
} else {
res.redirect('/auth/facebook');
}
}
expressã®è¨å®šã§ã™ã€‚セッションを使ã†ã®ã§ãã®è¨å®šãŒå¿…è¦ã§ã™ã€‚
var app = express();
app.use(express.cookieParser());
app.use(express.session({ secret: 'foobar' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(ensureAuthenticated);
最後ã«ã€expressã®ãƒ«ãƒ¼ãƒˆã®è¨å®šã‚’ã—ã¾ã™ã€‚failureRedirectã¯æš«å®šã§ã™ã€‚
app.get('/auth/facebook', passport.authenticate('facebook'));
app.get('/auth/facebook/callback', passport.authenticate('facebook', {
successRedirect: '/',
failureRedirect: '/auth/loginfailed'
}));
app.get('/auth/loginfailed', function(req, res) {
res.send('login failed');
});
以上ã€ã“ã‚“ãªæ„Ÿã˜ã§ä½¿ã†ã‚ˆã†ã§ã™ã€‚/auth/facebookã®ã‚ˆã†ãªãƒ«ãƒ¼ãƒˆã‚’è¨å®šã—ãªã‘れã°ãªã‚‰ãªã„ã®ã‚’é¢å€’ã¨è€ƒãˆã‚‹ã‹ã€åˆ†ã‹ã‚Šã‚„ã™ã„ã¨è€ƒãˆã‚‹ã‹ãŒã€Passportã‚’å—ã‘入れられるã‹ã®å¢ƒç›®ã‹ã‚‚ã—れã¾ã›ã‚“。