gho*_*... 5 facebook node.js express passport.js
我正在尝试使用express使用passportjs验证用户身份.
Passport.js看起来像这样.
var USER_INFO = {};
var FB_CALLBACK = 'http://localhost:3000/auth/facebook/callback';
module.exports = function(passport) {
passport.use(new FacebookStrategy({
clientID: FB_CLIENT_ID,
clientSecret: FB_CLIENT_SECRET,
callbackURL: FB_CALLBACK
},
function(accessToken, refreshToken, profile, done) {
process.nextTick(function() {
USER_INFO.id = profile.id;
});
}));
}Run Code Online (Sandbox Code Playgroud)
var express = require('express'); // call express
var app = express(); // define our app using express
var router = express.Router(); // get an instance of the express Route
var passport = require('passport');
USER_INFO = {};
require('./config/passport')(passport);
app.get('/auth/facebook', passport.authenticate('facebook'));
app.get('/auth/facebook/callback', passport.authenticate('facebook', {
successRedirect : '/fb',
failureRedirect : '/error'
}));
app.get('/fb', function (req, res) {
res.json(USER_INFO);
});
Run Code Online (Sandbox Code Playgroud)
我想要在res.json(user_info)中提取所有信息.但它变得空洞.我在这里失踪了什么.保存用户用户基本信息以保持登录状态的最佳方法是什么.
首先,您不应将存储USER_INFO = {}超出当前请求的范围。如果两个单独的用户发出请求,那么他们将获得相同的对象。
你至少应该把它们存储在你可以检索它们的方式分别
var USERS = {};
...
module.exports...
passport.use...
...
function(accessToken, refreshToken, profile, done) {
USERS[profile.id] = profile;
done(null, profile);
}));
Run Code Online (Sandbox Code Playgroud)
现在,如果两个单独的用户发出请求,他们将把他们的信息分别存储在USERS
{
1234: {id: 1234, name: FOO},
6789: {id: 6789, name: BAR},
}
Run Code Online (Sandbox Code Playgroud)
而done(null, profile)将serialize用户。如果尚未定义序列化/反序列化函数,则应这样进行:
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
var user = USERS[id];
done(null, user);
});
Run Code Online (Sandbox Code Playgroud)
现在,您的用户将在他们各自的请求上下文中可用 req.user
因此,您只需要执行以下操作:
app.get('/fb', function (req, res) {
res.json(req.user);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1660 次 |
| 最近记录: |