为已登录用户手动创建护照会话

5

我正在使用Passport JS来进行登录注册流程。当一个新用户登录时,浏览器会创建一个cookie(由我自定义),其中包含数据库的唯一键。

程序的工作原理如下:

如果一个新用户登录,则通过此函数创建一个cookie:

function setCookie(cname,cvalue,exdays) {
    //alert("Cookie set on tedJavascript");
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires="+d.toUTCString();
    document.cookie = cname + "=" + cvalue + "; " + expires;
}

然后在登录页面输入的详细信息将被发送到服务器上的发布功能(passport js)。 下面给出了本地策略认证代码(对于访客、fb等情况,均适用)。

passport.use('guest',new LocalStrategy(
function(username,password,done){
       User.getUserBycookie(password, function(err, user){
       if(err) throw err;

        //if cookie present (checked in terms of password)
       if(user){
                    //Some code
                    user.save()
                        }
                        else{
                            console.log("some problem with updating guest   user by db id!");
                        }
                    });

                    return done(null, user);
        }

//if cookie not present
else {              
                    // some part of code for new user

                    var newUser = new User();
                    newUser.guest.cookie = newUser._id;
                    trophytable_id = newUser._id;
                    newUser.guest.name = username;
                    newUser.save(function(err){
                        if(err) throw err;
                        return done(null, newUser);
                    });

     }});}));

Passport JS会自动使用本地、游客、Facebook、Twitter等策略来验证信息,如果正确则创建会话(session)。但如果已经登录的人进入站点,则首先检查浏览器上是否存在cookie,如果存在,则提取DB密钥(DB key)。在知道密钥后,它从数据库(mongodb)中找到用户详细信息,并直接跳过登录页面并重定向到主菜单。但问题是它重定向到主菜单,但无法创建会话,这可能会造成进一步的问题,因此需要再次创建会话,以便像新用户一样由Passport自动创建。这就是ensure authenticated函数。
function ensureAuthenticated(req, res, next){
console.log("Inside ensureAuthenticated...............");
if(req.isAuthenticated()){
    console.log("Inside if part of ensureAuthenticated-------");
    console.log(req.cookies);
    return next();
} else {
            console.log("Inside else part of ensureAuthenticated----------");
            console.log(req.cookies.user_id);
            if(isEmpty(req.cookies.user_id)){
                console.log("user_id == undefined");
                res.redirect('/users/login');
            }
            else{
                 console.log("user_id defined");
                 return next();
            }
        }

}

next() 会执行以下操作:

router.get('/',ensureAuthenticated, function(req,res){
console.log("Inside router get ensure authenticated--------------------");
if(isEmpty(req.session.passport)){
    //**have to create new session**

    //**getting user details from database**
    User.getUserBydbid(req.cookies.user_id, function(err, user){
        if(err) throw err;
        if(user){
            if(!isEmpty(user.local)){

               //**here i want to create session**

           }else if(!isEmpty(user.guest)){

                    //**here i want to create session**

                }
                 //skipped fb,twitter code
        }                   
        else console.log("*********some problem in finding     getUserBydbid");
    });

     //after creating session want to redirect to main menu 
     //it works but session not created
    //res.render('index',{userid:req.cookies.user_id});
}
else{
    //for newly logged in user
    res.render('index',{userid:req.session.passport.user});
}});

如何为已登录的用户手动创建护照会话?
2个回答

4

我认为你需要实现serializeUserdeserializeUser函数才能使它正常工作,如文档中配置部分的会话子部分所述。 链接


3
经过一番调查,我认为您正在寻找在此处文档中找到的护照openid。您可以从文档中了解有关OpenID的信息,但我认为您可以将DB密钥作为标识令牌,并在身份验证函数中进行DB检查,如果DB密钥检查通过,则发送用户返回,并应基于已登录的用户为用户创建会话。 我可以提供代码示例和如何安装OpenID,但它们已经在文档中说明了。

谢谢你的努力,但我应该把用户发送到哪里? - wrangler
对我来说有点不清楚。看文档的话,我猜测要么是示例中的用户对象 User.findOrCreate({ openId: identifier }, function(err, user) { done(err, user); }); 要么是在个人资料交换部分。 - Michael Warner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接