如何用护照开会?

     2023-03-08     48

关键词:

【中文标题】如何用护照开会?【英文标题】:how to hold a session with passport? 【发布时间】:2018-08-27 21:22:12 【问题描述】:

所以,我希望我的用户会话在登录/注册时持续存在,但事实并非如此。

官方文档说要添加这个开头:

  app.use(express.session( secret: 'keyboard cat' ));
  app.use(passport.initialize());
  app.use(passport.session());

我做到了。然后它继续指定:

在典型的 Web 应用程序中,用于验证用户身份的凭据只会在登录请求期间传输。如果身份验证成功,将通过用户浏览器中设置的 cookie 建立和维护会话。 每个后续请求将不包含凭据,而是包含标识会话的唯一 cookie。为了支持登录会话,Passport 将对会话中的用户实例进行序列化和反序列化。

passport.serializeUser(function(user, done) 
  console.log("serialize user: ", user);
  done(null, user[0]._id);
);

passport.deserializeUser(function(id, done) 
  User.findById(id, function(err, user) 
    done(err, user);
  );
);

如果我理解正确,在登录时,用户应该会看到正在设置的新 cookie。 我的序列化和反序列化功能似乎有效。登录用户后,控制台将记录用户详细信息。控制台中没有错误消息。 但是,当我登录用户时,我没有看到任何 cookie。

我应该手动添加一个额外的命令吗?像这样:

res.cookie('userid', user.id,  maxAge: 2592000000 );

我正在使用 Redux,所以我是否应该通过 reducer 来处理持久会话,而不是使用经过身份验证的(真或假)变量?

我想我现在在服务器端应该做什么和客户端应该做什么之间有点困惑。

【问题讨论】:

【参考方案1】:
//npm modules
const express = require('express');
const uuid = require('uuid/v4')
const session = require('express-session')
const FileStore = require('session-file-store')(session);
const bodyParser = require('body-parser');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

const users = [
  id: '2f24vvg', email: 'test@test.com', password: 'password'
]

// configure passport.js to use the local strategy
passport.use(new LocalStrategy(
   usernameField: 'email' ,
  (email, password, done) => 
    console.log('Inside local strategy callback')
    // here is where you make a call to the database
    // to find the user based on their username or email address
    // for now, we'll just pretend we found that it was users[0]
    const user = users[0] 
    if(email === user.email && password === user.password) 
      console.log('Local strategy returned true')
      return done(null, user)
    
  
));

// tell passport how to serialize the user
passport.serializeUser((user, done) => 
  console.log('Inside serializeUser callback. User id is save to the session file store here')
  done(null, user.id);
);

// create the server
const app = express();

// add & configure middleware
app.use(bodyParser.urlencoded( extended: false ))
app.use(bodyParser.json())
app.use(session(
  genid: (req) => 
    console.log('Inside session middleware genid function')
    console.log(`Request object sessionID from client: $req.sessionID`)
    return uuid() // use UUIDs for session IDs
  ,
  store: new FileStore(),
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true
))
app.use(passport.initialize());
app.use(passport.session());

// create the homepage route at '/'
app.get('/', (req, res) => 
  console.log('Inside the homepage callback')
  console.log(req.sessionID)
  res.send(`You got home page!\n`)
)

// create the login get and post routes
app.get('/login', (req, res) => 
  console.log('Inside GET /login callback')
  console.log(req.sessionID)
  res.send(`You got the login page!\n`)
)

app.post('/login', (req, res, next) => 
  console.log('Inside POST /login callback')
  passport.authenticate('local', (err, user, info) => 
    console.log('Inside passport.authenticate() callback');
    console.log(`req.session.passport: $JSON.stringify(req.session.passport)`)
    console.log(`req.user: $JSON.stringify(req.user)`)
    req.login(user, (err) => 
      console.log('Inside req.login() callback')
      console.log(`req.session.passport: $JSON.stringify(req.session.passport)`)
      console.log(`req.user: $JSON.stringify(req.user)`)
      return res.send('You were authenticated & logged in!\n');
    )
  )(req, res, next);
)

// tell the server what port to listen on
app.listen(3000, () => 
  console.log('Listening on localhost:3000')
)

尝试通过链接 https://medium.com/@evangow/server-authentication-basics-express-sessions-passport-and-curl-359b7456003d

【讨论】:

【参考方案2】:

1 检查主机名。 就我而言,cookie 设置在 127.0.0.1,而不是 localhost

2 确保在 passport session 之前调用 express session

【讨论】:

【参考方案3】:

如果有人将 mongooseexpressjspassportjs 一起使用,您可以尝试以下方法。这也会在服务器重新启动后保存 cookie。对于其他数据库,您可以查看Expressjs Compatible Session Stores List

const session = require("express-session");
const MongoStore = require("connect-mongo")(session);

// before this setup mongoose connection then add this code.
app.use(
  session(
    store: new MongoStore(
      mongooseConnection: mongoose.connection,
      ttl: 365 * 24 * 60 * 60, // = 365 days.
    ),
    secret: process.env.AUTH_SECRET,
    resave: true,
    saveUninitialized: true,
    cookie: 
      secure: app.get("env") === "production",
    ,
  )
);

【讨论】:

如何处理异步。护照和猫鼬的 findOrCreate 方法

】如何处理异步。护照和猫鼬的findOrCreate方法【英文标题】:Howtodealwithasync.findOrCreatemethodforpassportandmongoose【发布时间】:2012-06-2416:30:59【问题描述】:身份验证模块“Passport”需要FindOrCreate方法才能进行登录。我正在使用猫鼬... 查看详情

护照-facebook-token vs 护照-facebook

】护照-facebook-tokenvs护照-facebook【英文标题】:passport-facebook-tokenvspassport-facebook【发布时间】:2019-01-0615:50:25【问题描述】:对于node.js中的社交身份验证,我看到许多项目使用passport-facebook-token包而不是默认的passport-facebook。我... 查看详情

Laravel 护照范围

】Laravel护照范围【英文标题】:LaravelPassportScopes【发布时间】:2017-01-1901:50:04【问题描述】:我对laravel范围部分有点困惑。我有一个用户模型和表格。如何为用户分配用户、客户和/或管理员的角色。我有一个带有vue和laravelapi... 查看详情

如何在默认响应护照中添加状态

】如何在默认响应护照中添加状态【英文标题】:Howtoaddstatusindefaultresponsepassport【发布时间】:2018-12-1507:49:54【问题描述】:我正在Web和App中开发和应用。对于应用程序的API,我在laravel中使用了Passport。使用护照我可以创建令牌... 查看详情

keil中如何用keil中如何用汇编调用c函数?

如图所示,我在汇编中用IMPORT声明,调用C函数,但是编译提示错误,请问是什么原因?检查C文件是否加入项目。检查C文件中是否有这两个函数的原型声明。参考技术A关注这个问题 查看详情

如何用excel做散点图(如何用excel做柱状图)

参考技术A您好,现在我来为大家解答以上的问题。如何用excel做散点图,如何用excel做柱状图相信很多小伙伴还不知道,现在让我们一起来看看吧!1、exc...您好,现在我来为大家解答以上的问题。如何用excel做散点图,如何用excel做... 查看详情

如何用手机查看ip地址

...A  如何查看手机IP地址和MAC地址呢?下面是我整理的如何用手机查看ip地址的两个方法,欢迎大家阅读!  如何用手机查看ip地址  方法1:进入【设置】—【WLAN】—【高级设置】查看。  方法2:进入【设置】—【关于... 查看详情

如何用端口访问网站

1、准备一台windows2008R2操作系统的虚拟机环境2、3、 查看详情

如何用黑色填充灰色空间? SwiftUI

】如何用黑色填充灰色空间?SwiftUI【英文标题】:Howtofillgrayspacewithblack?SwiftUI【发布时间】:2021-10-2814:08:42【问题描述】:如何用黑色绘制一个完全灰色的空间?看图片这是我的代码:.onTapGestureself.showModal=true.sheet(isPresented:self.$... 查看详情

脑筋急转弯:如何用两个栈实现一个队列&&如何用两个队列实现一个栈(代码片段)

文章目录前言我的想法如何用两个栈实现一个队列如何用两个队列实现一个栈别人的想法两个栈实现一个队列如何用两个队列实现一个栈前言其实我也不知道这两个问题又什么意义,就像不知道我们平时刷的算法题除了练脑... 查看详情

如何用电脑发布视频号?

用电脑发布视频号的方法有以下几步: 查看详情

如何用动态值编写场景大纲?

】如何用动态值编写场景大纲?【英文标题】:HowtowriteScenarioOutlineswithdinamicvalues​?【发布时间】:2021-09-0115:45:49【问题描述】:enterimagedescriptionhere例如:ScenarioOutline:GiventheuserisloggedintoHomeOperationsWhensearchingfor"<status>"Thenthe" 查看详情

如何用零填充数组?

】如何用零填充数组?【英文标题】:Howtopadanarraywithzeros?【发布时间】:2021-11-2509:42:57【问题描述】:fnmain()letarr:[u8;8]=[97,112,112,108,101];println!("Lenis",arr.len());println!("Elementsare:?",arr);error[E0308]:mismatchedtypes-->src/main.rs 查看详情

如何用java写一个小数

】如何用java写一个小数【英文标题】:Howtowriteasmallnumberusingjava【发布时间】:2015-11-1501:12:49【问题描述】:如何写一个非常小的数,接近极限0?像这样:doubleeps=0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000... 查看详情

你如何用 Javascript 编写一个类? [复制]

】你如何用Javascript编写一个类?[复制]【英文标题】:HowdoyouwriteaclassinJavascript?[duplicate]【发布时间】:2010-10-2923:37:08【问题描述】:可能重复:What\'sthebestwaytodefineaclassinjavascript你如何用Javascript编写一个类?有没有可能?【问题... 查看详情

如何用androidstudio查看jar包源码

参考技术A您好,请问您是想知道如何用androidstudio查看jar包源码吗? 查看详情

如何用动画添加数字

】如何用动画添加数字【英文标题】:Howtoaddnumberwithanimation【发布时间】:2012-12-1020:38:15【问题描述】:我想在现有数字中添加数字,如秒表,我的功能是完美地添加数字,但我想添加像秒表这样的动画,我试过但我没有任何线... 查看详情

如何用酶测试反应钩

】如何用酶测试反应钩【英文标题】:Howtotestreacthookswithenzyme【发布时间】:2020-06-0113:23:10【问题描述】:我在TDD过程中遇到问题,reacthooks的状态没有按预期改变//Header.tsximportReact,useState,ChangeEvent,KeyboardEventfrom\'react\';interfacePropsa... 查看详情