8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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] (https://dev.twitter.com/rest/reference/get/account/verify_credentials)
8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?