护照谷歌身份验证非持久性

Posted

技术标签:

【中文标题】护照谷歌身份验证非持久性【英文标题】:passport google authentication non persistent 【发布时间】:2020-10-14 10:20:21 【问题描述】:

我在使用 cookie 会话使用 google oauth2 构建持久身份验证系统时遇到了麻烦。 我正在使用以下软件包:

快递 cookie 会话 护照 passport-google-oauth2

这是我的主要应用

const express = require('express');
const config = require('./config.json');
const cors = require('cors');
const cookieSession = require('cookie-session');
const passport = require('passport');
const path = require('path');
const auth = require('./middleware/auth.service');
const app = express();

app.use(express.json());
app.use(express.urlencoded( extended: false ));
app.use(cors());

app.use(cookieSession(
    name: 'session',
    keys: config.session.keys,
    secret: config.secretkey,
    cookie: 
        secure: false,
        httpOnly: true,
        path: 'cookie',
        expires: new Date(Date.now() + 60 * 60 * 1000 * 24 * 365)
    
))

passport.use(require('./middleware/passport.service'));

app.use(passport.initialize());
app.use(passport.session());

app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
app.use(express.static(path.join(__dirname, 'views')));

app.use('/auth', auth.router);

app.get('/', auth.isAuthenticated, (req,res)=>
    res.json(req.session.passport);
);

app.listen(3001,()=>
    console.log("Listening on port 3001...");
);

这是我的身份验证服务:

const express = require('express');
const passport = require('passport');
const router = express.Router();

router.get('/login',(req,res)=>
    res.render('login');
);

router.get('/google',
  passport.authenticate('google',  scope:
    [ 'email', 'profile' ] 
));

router.get('/google/failure',(req,res)=>
    res.redirect('/auth/login');
);
 
router.get( '/google/callback',
    passport.authenticate( 'google',  failureRedirect: '/auth/google/failure', successRedirect: '/' ));

function isAuthenticated(req, res, next) 
    if(req.session.passport)
        next();
     else 
        res.redirect('/auth/login');
    


module.exports =  
    router,
    isAuthenticated

基本上身份验证有效,但它不是持久的,这意味着当我关闭浏览器时,用户会话过期,你知道我可能错在哪里吗?

【问题讨论】:

【参考方案1】:

我发现了问题,但我不知道为什么,基本上我将包从 cookie-session 切换到 express-session 重新排列了会话代码并开始工作,也许护照和 cookie-session 之间存在一些不兼容我不知道???无论如何,下面的代码都有效。

const express = require("express");
const config = require("./config.json");
const cors = require("cors");
var session = require("express-session");
const passport = require("passport");
const path = require("path");
const auth = require("./middleware/auth.service");
const app = express();

app.use(express.json());
app.use(express.urlencoded( extended: false ));
app.set("trust proxy", 1);
app.use(cors());

app.use(
  session(
    secret: config.secretKey,
    resave: false,
    saveUninitialized: true,
    cookie: 
      secure: false,
      maxAge: 60 * 60 * 1000 * 24 * 365,
    ,
  )
);

app.use(passport.initialize());
app.use(passport.session());

passport.use(require("./middleware/passport.service"));

app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "views"));
app.use(express.static(path.join(__dirname, "views")));

app.use("/auth", auth.router);

app.get("/", auth.isAuthenticated, (req, res) => 
  res.json(req.session.passport);
);

app.listen(3001, () => 
  console.log("Listening on port 3001...");
);

【讨论】:

以上是关于护照谷歌身份验证非持久性的主要内容,如果未能解决你的问题,请参考以下文章

护照身份验证不适用于使用快速路由器的特定路由

Google oauth 不返回电子邮件护照身份验证

有啥区别:Windows 身份验证、护照身份验证和表单身份验证?

使用身份验证护照系统覆盖 laravel 中 apis url 的身份验证重定向

使用电子邮件进行身份验证时,NestJS 护照身份验证返回 401

本地护照和本地护照猫鼬的身份验证错误