Node.jsのpassport-twitterで認証時にメールアドレスを取得する


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先の中身は精査されません(おそらく)。僕の場合はすぐにリクエストが承認されました。

コード

準備が出来たら実装していきましょう。コードの解説は特にしません。

app.js
// モジュールを読み込む
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時間ハマりました。同じような人の参考になれば幸いです。

参考

  1. jaredhanson/passport-twitter
  2. Get user email #67
  3. Twitter Developer Documentation/GET account/verify_credentials