Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 护照重新认证_Javascript_Node.js_Passport.js - Fatal编程技术网

Javascript 护照重新认证

Javascript 护照重新认证,javascript,node.js,passport.js,Javascript,Node.js,Passport.js,我想用Passport.js和Github策略实现登录。以下是我使用的代码: 。。。 /*确保身份验证功能*/ 功能确保重新验证(req、res、next){ if(req.isAuthenticated())返回next() else res.redirect('/'); } /*一些模块*/ global.passport=require('passport'); global.GithubStrategy=require('passport-github2')。策略; global.ut

我想用Passport.js和Github策略实现登录。以下是我使用的代码:

。。。
/*确保身份验证功能*/
功能确保重新验证(req、res、next){
if(req.isAuthenticated())返回next()
else res.redirect('/');
}
/*一些模块*/
global.passport=require('passport');
global.GithubStrategy=require('passport-github2')。策略;
global.util=require('util');
global.session=require('express-session');
global.bodyParser=require('body-parser');
global.methodOverride=require('method-override');
global.partials=require('express-partials');
global.request=require('request');
/*护照*/
passport.user(函数(user,done){
完成(空,用户);
});
passport.deserializeUser(函数(obj,done){
完成(空,obj);
});
passport.use(新策略)({
clientID:config.githubID,
clientSecret:config.githubSecret,
callbackURL:config.githubURL
},
函数(accessToken、refreshToken、profile、done){
process.nextTick(函数(){
返回完成(空,配置文件);
});
}
));
app.use(partials());
use(bodyParser.urlencoded({extended:true}));
use(bodyParser.json());
使用(methodOverride());
使用(会话({secret:'keyboard cat',resave:false,saveUninitialized:false});
app.use(passport.initialize());
app.use(passport.session());
/*控制器*/
app.get('/auth/github',passport.authenticate('github',{scope:['user:email']}),function(req,res){};
app.get('/auth/github/callback',passport.authenticate('github',{failureRedirect:'/')),函数(req,res){
res.redirect('/dashboard');
});
app.get('/logout',函数(req,res){
请求注销();
res.redirect('/');

});前言/序言

我也有同样的问题。我没有太多关于您的系统架构的信息,但是我的系统使用了以下内容:

  • PassportJS(带本地策略)
  • ExpressJS处理会话和路由(带Redis MemoryStore)
  • NodeJS服务器
  • AngularJS 2前端
要签出的内容

  • CORS在这一问题上发挥了重要作用 我利用图书馆来缓解那里的问题。特别是,我对配置做了以下更改:

    let cors_config = {
        origin: "http://localhost:8080",
        credentials: true
    };
    
    这将配置您的CORS设置,以便在飞行前请求中包含Access Control Allow Credentials:true标头

  • 确保您的内存存储和会话配置正确
  • 从没有指定的内存存储(默认为LocalStore)开始,然后从那里开始工作。我看你现在不用了,还是继续读吧

    server.use(session({
        secret: "secret_c0de",
        resave: false,
        saveUninitialized: false//,
        //store: new redis_store(redis_settings)
    }));
    
    检查验证时,验证后会话cookie是否返回。它应该包含一个键值,键值为“connect.sid”,即会话ID

    如果您没有获得会话cookie,那么您知道您的会话可能配置不正确,在这种情况下,您应该:

    • 检查“使用”调用的加载顺序
    • 尝试识别会话处理代码中的任何错误或问题
    如果您正在接收cookie,但isAuthenticated()检查在后续请求中失败,这通常暗示您的MemoryStore不工作

    • 如果您最初使用的是LocalStore,则不需要太多配置,因此再次提示您的会话配置存在问题
    • 如果您使用的是Redis之类的存储,请尝试收听(主要是“连接”和“错误”),并将输出记录到控制台,以便查看它是否正常工作
    我在你的代码中注意到了一些东西

    • 检查序列化函数,您正在序列化整个用户对象
    这更像是一种优化,但已经注意到人们仅仅序列化用户ID并反序列化它就取得了更大的成功

    passport.serializeUser(function(user, done){
        done(null, user.id);
    });
    passport.deserializeUser(function(obj, done){
        User.findById(obj, function(err, user){
            if(err){/*code to handle error with not finding user*/}
            done(null, user);
        });
    });
    
    • 您应该需要会话,因为会话使用会话cookie
    回答您的问题

    • 在我的例子中,为什么会话不保存身份验证
    应用程序中的会话创建已中断,因此您应该尝试并调试它。如上所述,您应该检查在身份验证请求之后会话cookie中是否返回了会话ID,然后从那里继续

    • 为什么我无法从req.user访问用户信息以查看用户信息
    在从Passport成功进行反序列化尝试后,将注入用户。在您的情况下,会话从一开始就不会创建,也不会序列化到MemoryStore中,因此永远无法反序列化(因为它不存在)

    • 为什么注销路径不起作用
    req.logout()仅在成功创建的会话上有效。 从你提供的其他代码和信息判断,我想这就是你所指的


    希望您能在这里找到一些有价值的信息,如果您想聊一些特别的事情,请随时发表评论!:)

    这里是理解和实现基于passport的身份验证代码的最佳来源。检查一下

    哈哈,我现在正面临着同样的问题。如果您检查您的请求(使用您的Chrome/Firefox开发工具或POSTMAN),在您的身份验证请求之后是否会返回会话cookie?(它应该包含键“connect.sid”和会话id值)您解决了吗?我的想法是它不保存会话,但我想存储的会话是Mongo/Redis。我想这会管用的。对,我昨晚确实让它管用了,我很快会写一个答案,详细说明我做的事情。在我这么做之前,你有像Angular这样的特定前端吗?还是在NodeJS服务器中准备视图?啊,我看到您使用的是“partials”,我认为假设您是rend是安全的