質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.09%

express + passport-twitter でメールアドレスを取得するには

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 1,194

TEA

score 64

expressとpassportでユーザー認証を行う際、passport-twitterなどの使ってSNSアカウントで認証できるようなWebアプリを作っています。この中で、登録されているユーザーにメールで情報を配信したいと思っています。

そこでご質問ですが、メールアドレスはどのように取得するのが順当な方法でしょうか?例えばユーザーがtwitterアカウントで認証した際に、メールアドレスを登録するような処理が改めて必要になってくるのでしょうか?

ご存知な方がいらっしゃいましたら、アドバイスを宜しくお願いします。

コードはExpress4 + Passport を使った会員サイトの簡単サンプル | try catch and ...releaseを参考にしながら、tiwtter認証を追加しているところです。

package.json

{
  "name": "passport-express4-sample",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www",
    "test": "./node_modules/mocha/bin/mocha ./test/test.user.js"
  },
  "dependencies": {
    "body-parser": "~1.13.2",
    "chai": "*",
    "cookie-parser": "~1.3.5",
    "debug": "~2.2.0",
    "express": "~4.13.1",
    "express-session": "*",
    "jade": "~1.11.0",
    "mocha": "*",
    "mongoose": "*",
    "morgan": "~1.6.1",
    "passport": "*",
    "passport-local": "*",
    "passport-local-mongoose": "*",
    "passport-twitter": "^1.0.3",
    "serve-favicon": "~2.3.0",
    "should": "*"
  }
}

./app.js

var TWITTER_CONSUMER_KEY      = "*** your key ***";
var TWITTER_CONSUMER_SECRET   = "*** your secret key ***";
var BASE_URL                  = "*** your url ***";

var express      = require('express');
var path         = require('path');
var favicon      = require('serve-favicon');
var logger       = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser   = require('body-parser');
var session      = require('express-session');
var mongoose      = require('mongoose');
var passport      = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var TwitterStrategy = require('passport-twitter').Strategy;


var routes = require('./routes/index');
var users  = require('./routes/users');
var app    = express();
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');


app.use( logger('dev') );
app.use( bodyParser.json() );
app.use( bodyParser.urlencoded({ extended: false }) );
app.use( cookieParser() );

app.use(session({
  secret: 'secret secret' ,
  resave: false ,
  saveUninitialized: false
}));
app.use( passport.initialize() );
app.use( passport.session() );


app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
app.use('/users', users);


var Account = require('./models/account');
passport.use( new LocalStrategy(Account.authenticate()) );
passport.serializeUser( Account.serializeUser() );
passport.deserializeUser( Account.deserializeUser() );
mongoose.connect('mongodb://localhost/passport_local_mongoose_express4');

passport.use( new TwitterStrategy({
        consumerKey: TWITTER_CONSUMER_KEY,
        consumerSecret: TWITTER_CONSUMER_SECRET,
        callbackURL: BASE_URL+'/auth/twitter/callback'
    },
    function(token, tokenSecret, profile, done) {

        var acc = new Account();
        acc.username          = profile.username;
        acc.password          = "";
        acc.twitter.id        = profile.id;

        acc.save(function(err) {
            if (err)throw err;
            return done(null,acc);
        });
    }
));

app.get('/auth/twitter' , passport.authenticate('twitter') );
app.get('/auth/twitter/callback', passport.authenticate('twitter', {
        failureRedirect: '/'
    }),
    function(req, res) {
        res.redirect('/');
    }
);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});

module.exports = app;

./models/account.js

var mongoose              = require('mongoose');
var Schema                = mongoose.Schema;
var passportLocalMongoose = require('passport-local-mongoose');

var Account = new Schema({
          username: String ,
          password: String ,
          twitter : {
            id: String
        }
});

Account.plugin(passportLocalMongoose);
module.exports = mongoose.model('Account', Account);
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る