2012-11-03 10 views
6

私の最初のパブリック向きのノードアプリケーションの基本認証を設定しようとしています。私は2つのパスポート戦略を持っています:1)Facebookのため、2)Twitterのため。私はセキュリティの意味を理解するまで少なくとも今のところ電子メール/パスワードシステムを含める予定はありません。 私は、新しいユーザーを作成するために、箱から離れて作業し、Mongooseを結ぶことができました。Passportでのカスタムリダイレクト

私は現在、ソーシャルアカウントユーザーを除外したいと考えています。したがって、新しいユーザーがtwitter auth経由で入ったときは、メールを収集するページにそれらをリダイレクトする必要があります。セッション変数として返されたトークンとプロファイルオブジェクトを保存していて、フォームを非表示フィールドとして送信するときにそのページでそれらを再利用します。

しかし、私はPassportを使用してこの側面を実装する方法を理解できません。これまでのところ、私が各部で何をしようとしているのかについてのコメントがあります。基本的に私は、Twitterユーザーが古いユーザーであるかどうかをチェックしていますが、/ addemailページで再利用するセッション変数を設定していて、ユーザーオブジェクトを初期化しています(Serialize、Deserialize関数は何かシリアライズ/デシリアライズが実際に行っていること)。ユーザーが新しいものであれば、セッション変数NewTwitterUserがtrueになり、ユーザーを適切なページにリダイレクトするための認証/コールバックURLでチェックしますが、これはうまくいかない。

//basic modules and setup 
var express = require('express') 
    , passport = require('passport') 
    , mongoose = require('mongoose') 
    , http = require('http') 
    , util = require('util') 
    , TwitterStrategy = require('passport-twitter').Strategy 
    , FacebookStrategy = require('passport-facebook').Strategy 
    , path = require('path'); 

var app = express(); 


//Mongodb setup 
var Schema = mongoose.Schema; 
var ObjectId = Schema.ObjectId; 

var UserSchema = new Schema({ 
    provider: String, 
    uid: String, 
    fb_uid: String, 
    twitter_uid: String, 
    name: String, 
    first_name: String, 
    gender: String, 
    fb_username: String, 
    twitter_username: String, 
    profile_pic: String, 
    email: String, 
    location: String, 
    birthday: String, 
    created: {type: Date, default: Date.now} 
}); 


var User = mongoose.model('User', UserSchema); 
mongoose.connect('MongoHQ db connection here')' 


//User Authentication - Twitter 
passport.use(new TwitterStrategy({ 
    consumerKey: 'KEY', 
    consumerSecret : 'SECRET', 
    callbackURL: "CALLBACKURL", 
    passReqToCallback: true 
}, 
    function(req, token, tokenSecret, profile, done){ 
     User.findOne({twitter_uid: profile.id}, function(err, user){ 
      if (err) { 
      console.log('this is an error 1' + err); 
      return done(err);} 
      if(user){ 
       console.log('this user' + user); 
       done(null, user); 
      } else { 
       console.log('this is a new user'); 
       req.session.token = token; 
       req.session.tokenSecret = tokenSecret; 
       req.session.profile = profile; 
       req.session.newtwitteruser = true; 
       var user = new User(); 
       user.uid = profile.id; 
       done(null, user); 

       /* This part is commented and is the default code I had if I needed to simply create a Twitter User right here. 
       var user = new User(); 
       user.provider = profile.provider; 
       user.uid = profile.id; 
       user.twitter_uid = profile.id; 
       user.name = profile.displayName; 
       user.first_name = profile.displayName[0]; 
       user.twitter_username = profile._json.screen_name; 
       user.profile_pic = profile._json.profile_image_url; 
       user.location = profile._json.location; 
       user.save(function(err){ 
        if(err) {throw err;} 
        else {done(null, user);} 
       });*/ 
      } 
     }); 
    } 
)); 


//User Authentication - Facebook 
passport.use(new FacebookStrategy({ 
    clientID: 'ID', 
    clientSecret: 'SECRET', 
    callbackURL: "URL" 
}, 
    function(accessToken, refreshToken, profile, done){ 
     User.findOne({fb_uid: profile.id}, function(err, user){ 
      if (err) {return done(err);} 
      if(user){ 
       done(null, user); 
      } else { 
       var user = new User(); 
       user.provider = profile.provider; 
       user.uid = profile.id; 
       user.fb_uid = profile.id; 
       user.name = profile.displayName; 
       user.first_name = profile._json.first_name; 
       user.gender = profile._json.gender; 
       user.fb_username = profile._json.username; 
       user.profile_pic = 'https://graph.facebook.com/' + profile.id + '/picture'; 
       user.email = profile._json.email; 
       user.location = profile._json.location.name; 
       user.birthday = profile._json.birthday; 
       user.save(function(err){ 
        if(err) {throw err;} 
        else {done(null, user);} 
       }); 
      } 
     }) 
    } 
)); 


passport.serializeUser(function(user, done) { 
    done(null, user.uid); 
}); 

passport.deserializeUser(function(uid, done) { 
    User.findOne({uid: uid}, function (err, user) { 
    done(err, user); 
    }); 
}); 


//app configurations 
app.configure(function(){ 
    app.set('port', process.env.PORT || 3000); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.cookieParser("freecookie")); 
    app.use(express.session({secret:"freecookie"})); 
    app.use(express.static(path.join(__dirname, 'public'))); 
    app.use(express.errorHandler()); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
}); 


//Basic Routing 
app.get('/', function(req, res){ 
    res.render('home', {title: 'App Title', user: req.user}); 
}); 


app.get('/auth/twitter', passport.authenticate('twitter')); 

app.get('/auth/twitter/callback', 
    passport.authenticate('twitter', {failureRedirect: '/login' }), 
    function(req, res) { 
     if (req.session.newtwitteruser){ 
     res.redirect('/addemail');} 
     else {res.redirect('/');} 
    }); 

app.get('/addemail', function(req, res){ 
    if (req.session.newtwitteruser){ 
    res.render('email', {title: 'Add your Email'});} 
    else {res.redirect('/');} 
}); 


app.get('/auth/facebook', passport.authenticate('facebook', {scope: ['email', 'user_location', 'user_birthday'] })); 

app.get('/auth/facebook/callback', 
    passport.authenticate('facebook', { successRedirect: '/', failureRedirect: '/login' })); 


app.get('/logout', function(req, res){ 
    req.logout(); 
    res.redirect('/'); 
}); 



//create the server 
var server = http.createServer(app); 
server.listen(app.get('port')); 


//Checks if a request is authenticated 
function ensureAuthenticated(req, res, next) { 
    if (req.isAuthenticated()) { return next(); } 
    res.redirect('/login') 
} 

答えて

6

私が最初に自分のTwitterのルート中にあなたaddemail関数に成功したログインをリダイレクトします:

app.get('/auth/twitter', passport.authenticate('twitter')); 
    app.get('/auth/twitter/callback', 
    passport.authenticate('twitter', { successRedirect: '/addemail', 
             failureRedirect: '/' })); 

のThあなたのaddemail関数の中に、私は彼らが既に電子メールを持っているかどうかを確認し、その後、それらを適切な場所にリダイレクトすることができます。

app.get('/addemail', function(req, res){ 
     if (req.user.email){ 
      res.render('email', {title: 'Add your Email'});} 
     else {res.redirect('/');} 
    }); 
関連する問題