2014-09-21 75 views
2

我正在使用node.sdk,stormpath,express.js和passport.js爲我的新網站創建一個用戶帳戶系統。所以我建立了一個自定義數據槽的帳戶。我想知道如何在登錄時將新數據發佈到此自定義數據插槽,並在登錄時檢索它。我對使用節點很陌生,並且我不知道在哪裏放置代碼或如何訪問'用戶'的帳戶信息,他們已經登錄。從我能告訴passport.js處理身份驗證,所以我可能無法看到用戶的電子郵件搜索他們的用戶帳戶url在stormpath API ...也許我'米在這裏錯過了什麼?調用和保存用戶帳戶自定義數據

router.post('/register', function(req, res) { 

var username = req.body.username; var password = req.body.password; 

// Grab user fields. if (!username || !password) { return res.render('register', { title: 'Register', error: 'Email and password required.' }); } 

// Initialize our Stormpath client. var apiKey = new stormpath.ApiKey(process.env['STORMPATH_API_KEY_ID'], process.env['STORMPATH_API_KEY_SECRET']); var spClient = new stormpath.Client({ apiKey: apiKey }); 

var app = spClient.getApplication(process.env['STORMPATH_APP_HREF'], function(err, app) { if (err) throw err; 

account = { 

    givenName: 'John', 
    surname: 'Smith', 
    username: username, 
    email: username, 
    password: password, 
    customData:{ 
    favList:'', 
    }, 
}; 
app.createAccount(account, function (err, createdAccount) { 

    if (err) { 
    return res.render('register', {'title': 'Register', error: err.userMessage }); 
    } else { 
    passport.authenticate('stormpath')(req, res, function() { 
     return res.redirect('/home'); 
    }); 
    } 
}); 
}); 

}); 

//呈現登錄頁面。 router.get('/ login',function(req,res){res.render('login',{title:'Login',error:req.flash('error')[0]});}) ;

//驗證用戶。 router.post('/ login', passport.authenticate('stormpath',{successRedirect:'/ home',failureRedirect:'/ login',failureFlash:'哎呀,我猜你需要一個賬號才能進入這裏。 ',}));

//呈現儀表板頁面。 router.get('/ home',function(req,res){if(!req.user || req.user.status!=='ENABLED'){return res.redirect('/ login');}

res.render('home',{title:'Home',user:req.user,});});

回答

5

這是一個很好的問題。謝天謝地,您已經介紹了Passport API。你想使用「自定義回調」功能,那麼你可以訪問該功能內的用戶。在Stormpath策略的情況下,用戶對象將成爲Stormpath帳戶實例。但是,您需要重新實現當前傳遞的一些重定向邏輯作爲選項。下面是如何將看起來與Stormpath戰略的一個例子:

app.post('/login', function(req, res, next) { 
    passport.authenticate('stormpath', function(err, user, info) { 
    if (err) { 
     return next(err); 
    } 
    else if (user) { 
     console.log('The account is: ', user); 
     req.logIn(user, function(err) { 
     if (err) { 
      next(err); 
     }else{ 
      res.redirect('/dashboard'); 
     } 
     }); 
    }else{ 
     req.flash('error',info.message); 
     res.redirect('/login'); 
    } 
    })(req, res, next); 
}); 

此自定義策略的文檔可以在這裏找到:http://passportjs.org/guide/authenticate/

另注:我建議之外創建spClient路由處理器。 Stormpath Client可以用於多個請求,並且只需要在每個進程中創建一次。

+0

oooh好吧,這使得現在更有意義:)。所以讓我弄清楚這一點。我可以通過使用user.email訪問用戶電子郵件? – CHeffernan087 2014-09-22 19:50:12

+1

這是正確的,user.email會給你賬戶的電子郵件地址 – robertjd 2014-09-23 15:45:52