我正在使用Express和Passport OpenID Google策略,我想在每个auth请求上设置returnURL,以便能够返回启动该身份验证的页面.
情况是我有带有Node.js后端的HTML5幻灯片应用程序(以及社交内容和编辑器以及Portal和扩展... https://github.com/bubersson/humla)我希望能够登录用户一些幻灯片(通过幻灯片菜单...)但我希望他能轻松回到同一张幻灯片.
所以我需要这样的东西?
app.get('/auth/google', function(req,res) {
var cust = "http://localhost:1338/"+req.params.xxx;
passport.authenticate('google', returnURL:cust, function ...
}
Run Code Online (Sandbox Code Playgroud)
我读过Passport的指南,但仍然不知道该怎么做.我知道这不安全,但我怎么办呢?
或者,如何让应用程序返回到启动登录的页面?或者有没有办法使用AJAX进行OpenID身份验证(并且仍然可以使用护照)?
我试图使用node.js的passport模块返回一个refreshToken.但是我使用下面的代码,我无法记录任何刷新令牌,但访问令牌工作正常.有没有办法为这个模块指定脱机访问类型,希望能够返回这个?
var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
passport.use(new GoogleStrategy({
clientID: GOOGLE_CLIENT_ID,
clientSecret: GOOGLE_CLIENT_SECRET,
callbackURL: "http://myurl/auth/callback"
},
function(accessToken, refreshToken, profile, done) {
console.log(refreshToken);
process.nextTick(function () {
return done(null, [{token:accessToken}, {rToken:refreshToken}, {profile:profile}]);
});
}
));
Run Code Online (Sandbox Code Playgroud)
这会将refreshToken返回为undefined.
任何帮助将不胜感激.
一旦用户进行了身份验证,我想要一种方法来设置用户可以查看,编辑和删除的限制.具体来说,除非他们是管理员,否则他们可以查看,编辑和删除他们拥有的唯一文件.我看过EveryAuth和Ability.js的一些例子,只是想知道是否有使用Passport.js的等价物.
我正在使用带有快速2.x和会话存储的pssportjs.登录后,我只得到req.User一次.只要我再次重定向req.User是未定义的.
这是我的配置:
passport.serializeUser(function(user, done) {
done(null, user._id);
});
passport.deserializeUser(function(userId, done) {
User.findOne({_id: userId} ,function(err, user){
done(err, user);
});
});
// Authentication Strategy
passport.use(new FacebookStrategy({
clientID: CONFIG.fb.appId,
clientSecret: CONFIG.fb.appSecret,
callbackURL: CONFIG.fb.callbackURL
},
function(accessToken, refreshToken, profile, done) {
// asynchronous verification, for effect...
process.nextTick(function () {
User.findOne({ 'accounts.uid': profile.id, 'accounts.provider': 'facebook' }, function(err, olduser) {
if(olduser) {
done(null, olduser);
} else {
var newuser = new User();
var account = {provider: "facebook", uid: profile.id};
newuser.accounts.push(account);
newuser.firstname = profile.name.givenName;
newuser.lastname = profile.name.familyName; …Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用Passport进行身份验证,我也在使用Express.总结一下我的问题:我的登录功能最初工作正常,但在任何用户的会话超时后,没有用户能够登录.
我使用标准的本地策略进行身份验证.
我会根据我的设置尽可能包含一个例子:
//-------------
//Set up authentication with Passport
//-------------
var userModel = require('./models/user')(db);
passport.use(new LocalStrategy(
function(username, password, done) {
var errorMessage = 'Incorrect username/password combination.';
userModel.GetUserByUsername(username, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: errorMessage });
}
user.validatePassword(password, function(isPasswordCorrect) {
if (!isPasswordCorrect)
{
return done(null, false, { message: errorMessage });
}
//Update with login date
userModel.UpdateUserWithLogin(username, user.currentLoginTime, function(err){
//if we have an error here, we …Run Code Online (Sandbox Code Playgroud) 难道http://localhost:7474/browser/不支持多个不相关的查询?
这段代码:
MATCH (a {cond:'1'}), (b {cond:'x'}) CREATE a-[:rel]->b
MATCH (a {cond:'2'}), (b {cond:'y'}) CREATE a-[:rel]->b
MATCH (a {cond:'3'}), (b {cond:'z'}) CREATE a-[:rel]->b
Run Code Online (Sandbox Code Playgroud)
导致错误:
CREATE和MATCH之间需要WITH
但由于我的查询不相关,我认为我不需要WITH.
如何在不必一次一行输入的情况下完成上述操作?
在护照[configure authentication]文档中,它有一个相当可怕的功能,使用神秘的功能"完成".
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
}
));
Run Code Online (Sandbox Code Playgroud)
现在,在快速文档中,有很多方法可以传递下一个名为next的东西.
app.use(function(err, req, res, next){
console.error(err.stack);
res.status(500).send('Something broke!');
});
Run Code Online (Sandbox Code Playgroud)
这是两个框架,快递和护照之间的区别吗?或者他们正在做两件事吗?
我正在按照这个例子来设置FacebookStrategy - https://github.com/jaredhanson/passport-facebook/blob/master/examples/login/app.js
我想动态设置callbackURL,即:用户访问/ posts/34所以回调将是/ posts/34/callback
我怎样才能实现这样的目标?
我在主要护照回购中发现了一些问题,但是,我认为这主要与这个特定策略有关,因为我能够使用passport-google-oauth策略成功进行身份验证.
Error: failed to find request token in session
at Strategy.OAuthStrategy.authenticate (/home/glug/application/node_modules/passport-dropbox/node_modules/passport-oauth/lib/passport-oauth/strategies/oauth.js:124:54)
at attempt (/home/glug/application/node_modules/passport/lib/passport/middleware/authenticate.js:243:16)
at Passport.authenticate (/home/glug/application/node_modules/passport/lib/passport/middleware/authenticate.js:244:7)
at callbacks (/home/glug/application/node_modules/express/lib/router/index.js:161:37)
at param (/home/glug/application/node_modules/express/lib/router/index.js:135:11)
at pass (/home/glug/application/node_modules/express/lib/router/index.js:142:5)
at Router._dispatch (/home/glug/application/node_modules/express/lib/router/index.js:170:5)
at Object.router (/home/glug/application/node_modules/express/lib/router/index.js:33:10)
at Context.next (/home/glug/application/node_modules/express/node_modules/connect/lib/proto.js:190:15)
at Context.actions.pass (/home/glug/application/node_modules/passport/lib/passport/context/http/actions.js:77:8)
Run Code Online (Sandbox Code Playgroud)
我使用redis作为会话存储,但是,即使在消除了它之后,仍然会出现相同的错误消息.
var DropboxStrategy = require('passport-dropbox').Strategy;
app.configure(function(){
app.set('port', config.express.port);
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({
// store: new RedisStore({ client: redis}),
secret: config.express.secret
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
});
passport.serializeUser(function(user, done) {
// console.log('Serializing: ' + JSON.stringify(user));
done(null, user);
});
passport.deserializeUser(function(obj, done) { …Run Code Online (Sandbox Code Playgroud) 我可以通过passport-facebook检索基本用户信息,按照以下代码并保存在mongodb中:
app.get("/auth/facebook", passport.authenticate("facebook", { scope : ["email", "publish_stream", "user_location", "user_hometown", "user_birthday", "read_friendlists"]}));
app.get("/auth/facebook/callback", passport.authenticate("facebook",{ successRedirect: '/', failureRedirect: '/'}));
var mongoose = require('mongoose'),
FacebookStrategy = require('passport-facebook').Strategy,
Users = mongoose.model('Users');
module.exports = function (passport, config) {
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
Users.findOne({ _id: id }, function (err, user) {
done(err, user);
});
});
passport.use(new FacebookStrategy({
clientID: config.facebook.clientID,
clientSecret: config.facebook.clientSecret,
callbackURL: config.facebook.callbackURL
}, function(accessToken, refreshToken, profile, done) {
Users.findOrCreateFaceBookUser(profile, done);
}));};
Run Code Online (Sandbox Code Playgroud)
但是,我无法在"个人资料"中看到个人资料图片.
文档https://github.com/jaredhanson/passport-facebook说要检索我们需要传递profileFields的照片,如下所示.但是这样做,我能够看到照片网址,但却丢失了_json中包含的其他数据,例如profile._json.location.name.如何检索包含其他用户信息的照片?
passport.use(new FacebookStrategy({
// clientID, …Run Code Online (Sandbox Code Playgroud) node.js ×9
passport.js ×9
express ×8
javascript ×2
cypher ×1
dropbox-api ×1
neo4j ×1
oauth-2.0 ×1