expressとpassportでユーザー認証を行う際、passport-twitterなどの使ってSNSアカウントで認証できるようなWebアプリを作っています。この中で、登録されているユーザーにメールで情報を配信したいと思っています。
そこでご質問ですが、メールアドレスはどのように取得するのが順当な方法でしょうか?例えばユーザーがtwitterアカウントで認証した際に、メールアドレスを登録するような処理が改めて必要になってくるのでしょうか?
ご存知な方がいらっしゃいましたら、アドバイスを宜しくお願いします。
コードはExpress4 + Passport を使った会員サイトの簡単サンプル | try catch and ...releaseを参考にしながら、tiwtter認証を追加しているところです。
package.json
json
1{ 2 "name": "passport-express4-sample", 3 "version": "0.0.0", 4 "private": true, 5 "scripts": { 6 "start": "node ./bin/www", 7 "test": "./node_modules/mocha/bin/mocha ./test/test.user.js" 8 }, 9 "dependencies": { 10 "body-parser": "~1.13.2", 11 "chai": "*", 12 "cookie-parser": "~1.3.5", 13 "debug": "~2.2.0", 14 "express": "~4.13.1", 15 "express-session": "*", 16 "jade": "~1.11.0", 17 "mocha": "*", 18 "mongoose": "*", 19 "morgan": "~1.6.1", 20 "passport": "*", 21 "passport-local": "*", 22 "passport-local-mongoose": "*", 23 "passport-twitter": "^1.0.3", 24 "serve-favicon": "~2.3.0", 25 "should": "*" 26 } 27} 28
./app.js
javascript
1var TWITTER_CONSUMER_KEY = "*** your key ***"; 2var TWITTER_CONSUMER_SECRET = "*** your secret key ***"; 3var BASE_URL = "*** your url ***"; 4 5var express = require('express'); 6var path = require('path'); 7var favicon = require('serve-favicon'); 8var logger = require('morgan'); 9var cookieParser = require('cookie-parser'); 10var bodyParser = require('body-parser'); 11var session = require('express-session'); 12var mongoose = require('mongoose'); 13var passport = require('passport'); 14var LocalStrategy = require('passport-local').Strategy; 15var TwitterStrategy = require('passport-twitter').Strategy; 16 17 18var routes = require('./routes/index'); 19var users = require('./routes/users'); 20var app = express(); 21app.set('views', path.join(__dirname, 'views')); 22app.set('view engine', 'jade'); 23 24 25app.use( logger('dev') ); 26app.use( bodyParser.json() ); 27app.use( bodyParser.urlencoded({ extended: false }) ); 28app.use( cookieParser() ); 29 30app.use(session({ 31 secret: 'secret secret' , 32 resave: false , 33 saveUninitialized: false 34})); 35app.use( passport.initialize() ); 36app.use( passport.session() ); 37 38 39app.use(express.static(path.join(__dirname, 'public'))); 40app.use('/', routes); 41app.use('/users', users); 42 43 44var Account = require('./models/account'); 45passport.use( new LocalStrategy(Account.authenticate()) ); 46passport.serializeUser( Account.serializeUser() ); 47passport.deserializeUser( Account.deserializeUser() ); 48mongoose.connect('mongodb://localhost/passport_local_mongoose_express4'); 49 50passport.use( new TwitterStrategy({ 51 consumerKey: TWITTER_CONSUMER_KEY, 52 consumerSecret: TWITTER_CONSUMER_SECRET, 53 callbackURL: BASE_URL+'/auth/twitter/callback' 54 }, 55 function(token, tokenSecret, profile, done) { 56 57 var acc = new Account(); 58 acc.username = profile.username; 59 acc.password = ""; 60 acc.twitter.id = profile.id; 61 62 acc.save(function(err) { 63 if (err)throw err; 64 return done(null,acc); 65 }); 66 } 67)); 68 69app.get('/auth/twitter' , passport.authenticate('twitter') ); 70app.get('/auth/twitter/callback', passport.authenticate('twitter', { 71 failureRedirect: '/' 72 }), 73 function(req, res) { 74 res.redirect('/'); 75 } 76); 77 78// catch 404 and forward to error handler 79app.use(function(req, res, next) { 80 var err = new Error('Not Found'); 81 err.status = 404; 82 next(err); 83}); 84 85// development error handler 86// will print stacktrace 87if (app.get('env') === 'development') { 88 app.use(function(err, req, res, next) { 89 res.status(err.status || 500); 90 res.render('error', { 91 message: err.message, 92 error: err 93 }); 94 }); 95} 96 97// production error handler 98// no stacktraces leaked to user 99app.use(function(err, req, res, next) { 100 res.status(err.status || 500); 101 res.render('error', { 102 message: err.message, 103 error: {} 104 }); 105}); 106 107module.exports = app;
./models/account.js
javascript
1var mongoose = require('mongoose'); 2var Schema = mongoose.Schema; 3var passportLocalMongoose = require('passport-local-mongoose'); 4 5var Account = new Schema({ 6 username: String , 7 password: String , 8 twitter : { 9 id: String 10 } 11}); 12 13Account.plugin(passportLocalMongoose); 14module.exports = mongoose.model('Account', Account);
あなたの回答
tips
プレビュー