passportを使ってtwitterアカウントでの認証を実装しようと思ったら3時間ほどハマりました。日本語の情報があまり出てこなかったので自分用にメモ。尚、Node.jsのExpressを使って開発中です。
ライブラリ
- express
- passport
- passport-twitter
- express-session
ます必要なライブラリ・モジュールをインストール。passportは手軽にSNS認証を実装できるのですが、各サービスごとのモジュールが必要です。
Twitter Appsに登録
認証にはkeyとaccess tokenが必要なのでここから登録します。開発用であれば、URLとcallback URLに http://localhost:8000 などと書きたいところですが、これだと弾かれます。http://127.0.0.1:8000/ と書きましょう。その後、ローカルで認証を試すときは、localhostではなく、127.0.0.1を使うようにしてください。私は前者でやっていたらエラーが出続けて苦しみました。
Additional Permissions
アプリケーションを登録したら、Permissionタブをクリックし、Additional Permissionsのリクエストを送りましょう。その際、Privacy Policy URLとTerms of Service URLを設定しておく必要がありますが、これはURL先の中身は精査されません(おそらく)。僕の場合はすぐにリクエストが承認されました。
コード
準備が出来たら実装していきましょう。コードの解説は特にしません。
// モジュールを読み込む
var session = require('express-session');
var passport = require('passport');
var TwitterStrategy = require('passport-twitter').Strategy;
// セッションへの保存と読み出し
passport.serializeUser(function (user, done) {
done(null, user);
});
passport.deserializeUser(function (obj, done) {
done(null, obj);
});
// 認証の設定
passport.use(new TwitterStrategy({
consumerKey: info.TWITTER_API_KEY,
consumerSecret: info.TWITTER_API_SECRET,
callbackURL: "http://127.0.0.1:8000/auth/twitter/callback",
includeEmail: true // これ大事!これがないとEmailは出力されない!
},
// 認証後のアクション
function(accessToken, refreshToken, profile, done){
process.nextTick(function(){
console.log(profile); //必要に応じて変更
return done(null, profile);
});
}
));
// セッションの設定
app.use(session({
secret: info.SESSION_SECRET,
resave: false,
saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
// 指定のpathで認証
app.get('/auth/twitter',
passport.authenticate('twitter'));
// callback後の設定
app.get('/auth/twitter/callback',
passport.authenticate('twitter', {failureRedirect: '/login' }),
function(req, res) {
res.redirect('/');
});
new TwitterStrategyで "includeEmail: true"とするのが重要です。Githubとか他のサービスで認証を作るときは、サクッとemailが取れるのですが、Twitterでは記載したような面倒な手順が要ります。Twitter Developerでアプリの登録だけでなく、additional requestの申請とincludeEmailをtrueにすること、僕はここで3時間ハマりました。同じような人の参考になれば幸いです。
参考
- jaredhanson/passport-twitter
- Get user email #67
- [Twitter Developer Documentation/GET account/verify_credentials] (https://dev.twitter.com/rest/reference/get/account/verify_credentials)