Passport.js在Node.js中提供身份验证框架.它只处理身份验证.
现在我想启用密码重置.由于用户模型中没有密码字段,只有护照,如何在护照本地策略中重置密码?我假设用户需要生成一个新密码并调用一些东西来覆盖旧密码的现有哈希值.我可以在哪些方法找到它们?
我正在尝试使用 Advanced Rest Client 来查看我的 MongoDB 是否已正确设置,但它不断向我显示 500:内部服务器错误。
这是我的 app.js 文件:
var express = require('express');
var path = require('path');
var logger = require('morgan');
var passport = require('passport');
var session = require('express-session');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/emedb');
var app = express();
var routes = require('./routes/index');
var users = require('./routes/users');
var authenticate = require('./routes/authenticate')(passport);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(logger('dev'));
app.use(session({
secret: '<never-tell>',
saveUninitialized: true,
resave: true
}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false })); …Run Code Online (Sandbox Code Playgroud) 我正在使用passport,express-session而且connect-pg-simple.
问题是会话没有从存储中正确获取,它正确地(我希望,但怀疑)保存.
我的设置是一样的,就像很多教程一样,我已经找到了.
server.js:
import express from 'express';
import next from 'next';
import bodyParser from 'body-parser';
import session from 'express-session';
import connectPgSimple from 'connect-pg-simple';
const sessionStorage = connectPgSimple(session);
import initAuthentication from '!/server/authentication';
const dev = process.env.NODE_ENV !== 'production'; // eslint-disable-line
const port = process.env.PORT || 3000; // eslint-disable-line
const app = next({ dev });
app.prepare()
.then(() => {
const server = express();
server.use(express.static('public'));
/* Note Since version 1.5.0, the cookie-parser middleware no …Run Code Online (Sandbox Code Playgroud) 我想要两种类型的用户登录(用户、客户端)。我到底如何在 app.js 中为两种类型创建 localStrategies、序列化和反序列化用户 我有两个单独的架构,都使用 PassportLocalMongoose 插件。
我目前配置我的护照如下,
var User = require('./models/User');
var Client= require('./models/Client');
passport.use(new LocalStrategy(User.authenticate(), Client.authenticate()));
passport.serializeUser(User.serializeUser(), Client.serializeUser());
passport.deserializeUser(User.deserializeUser(), Client.deserializeUser());
Run Code Online (Sandbox Code Playgroud)
问题出在我尝试注册时。注册为用户有效,但作为客户端显示“未经授权”错误。我该如何解决这个问题?
因此,我希望我的用户会话在登录/注册时持续存在,但事实并非如此。
官方文档说要添加以下内容:
app.use(express.session({ secret: 'keyboard cat' }));
app.use(passport.initialize());
app.use(passport.session());
Run Code Online (Sandbox Code Playgroud)
我做到了。然后它继续指定:
在典型的 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);
});
});
Run Code Online (Sandbox Code Playgroud)
如果我理解正确的话,登录后,用户应该看到一个新的 cookie 被设置。我的序列化和反序列化功能似乎有效。当我登录用户后,控制台将记录用户详细信息。控制台中没有错误消息。但是,当我登录用户时,我没有看到任何 cookie。
我应该手动添加额外的命令吗?像这样的东西:
res.cookie('userid', user.id, { maxAge: 2592000000 });
Run Code Online (Sandbox Code Playgroud)
我正在使用 Redux,那么我是否应该使用经过身份验证的(true 或 false)变量通过化简器处理持久会话?
我想我现在对服务器端应该做什么和客户端应该做什么之间有点困惑。
我已经创建了登录并注册了 Express 和 Passport js。我想添加错误密码或电子邮件的消息。
在我的 index.js (main) 中添加了护照和正文解析器中间件,并引用了路由:
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
// route files
let index = require("./routes/index");
let auth = require("./routes/auth");
app.use("/", index);
app.use("/auth", auth);
Run Code Online (Sandbox Code Playgroud)
我创建了护照配置:
const LocalStrategy = require("passport-local").Strategy;
const User = require("../models/User");
const config = require("../config/database");
const bcrypt = require("bcryptjs");
module.exports = function(passport) {
// Local Strategy
passport.use(
new LocalStrategy(
{
usernameField: "email",
passwordField: "password"
},
(username, password, done) => {
// Match Email
let query = { email: username };
User.findOne(query, function(err, user) …Run Code Online (Sandbox Code Playgroud) 最初的问题: 我在后端使用passportJS,并使用MongoStore作为会话存储,并使用react前端。
我想做的是允许用户拥有持久的登录会话。已经有一个由express-session 自动设置的名为connect.sid 的cookie。然而,会话似乎不是持久的,因为req.user在使用登录时设置的相同 cookie 的后续请求中未定义该会话。req.user不断返回未定义,这意味着护照没有以某种方式验证会话cookie。
根据护照的文件,这是不应该发生的。
每个后续请求将不包含凭据,而是包含标识会话的唯一 cookie。为了支持登录会话,Passport 将对会话中的用户实例进行序列化和反序列化。
那么我想了解的是 PassportJS 到底如何处理客户端发送的 cookie?
有人可以帮我解释一下护照在这方面采取的步骤吗?
我还在我的猫鼬模型中使用了 Passport-local-mongoose 插件,其中包括下面 auth.js 中使用的内置身份验证/序列化/反序列化方法。
我的代码的相关部分供参考:
app.js:(没有包含完整的文件,因此可以很清楚,因为它有 100 多行,如果有人建议这可能是中间件顺序的问题,我将包含完整的代码)
//session and passport initialization
const sessionStore = new MongoStore({
mongooseConnection: mongoose.connection,
collection: "sessions",
});
app.use(
session({
secret: process.env.SERVER_SECRET_KEY,
resave: false,
saveUninitialized: false,
store: sessionStore,
cookie: {
path:"/",
httpOnly: true,
expires: 9999999999999999
}
})
);
app.use(passport.initialize());
app.use(passport.session());
Run Code Online (Sandbox Code Playgroud)
auth.js
const passport = require("passport");
const LocalStrategy = require("passport-local").Strategy;
const config = require("./config"); …Run Code Online (Sandbox Code Playgroud) 我用 构建了一个简单的用户身份验证应用程序React, node and Passport JS。打开时localhost,它会成功存储会话并保留用户,但在 Heroku 上部署后,它不会保留会话。
我检查了网络选项卡,发现 SameSite 属性默认设置为lax
,如果客户端想要获取跨站点 Cookie,则应设置为none并且必须设置secure属性。但是当我将 SameSite 设置为 none 并将 secure 设置为 true 时,客户端不会从服务器获取 cookie(例如,响应中不存在 set-cookie 标头)
。
我不知道我哪里做错了。
这是我的服务器 JS
// Middlewares
app.use(express.json());
app.use(
cors({
origin: "https://authclient.netlify.app",
credentials: true,
})
);
app.use(
session({
secret: "secret",
resave: true,
saveUninitialized: true,
cookie: {
sameSite: "none",
secure: true,
},
store: MongoStore.create({ mongoUrl: dbURI }),
})
);
app.use(cookieParser("secret"));
app.use(passport.initialize());
app.use(passport.session());
require("./passportConfig")(passport);
//______________________________________
//Routes
app.post("/login", (req, res, …Run Code Online (Sandbox Code Playgroud)我在 NestJs 中有这段代码,下面有以下文件,但现在它说“未知的身份验证策略“本地””,我已经寻找解决方案,它们都指向导入错误,但我已将 localstrategy 导入到 auth. module 和 app.module (我已经测试过将其从 app.module 中取出,但它不会改变任何内容。)
应用程序模块.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ThrottlerModule } from '@nestjs/throttler';
import { MongooseModule } from '@nestjs/mongoose';
import { AuthModule } from './auth/auth.module';
import { UsersModule } from './users/users.module';
import { LocalStrategy } from './auth/local.strategy';
@Module({
imports: [
MongooseModule.forRoot(
'mongodb+srv://user:password@db.db.mongodb.net/db?retryWrites=true&w=majority',
),
ThrottlerModule.forRoot({
ttl: 60,
limit: 10,
}),
AuthModule,
UsersModule,
],
controllers: [AppController],
providers: [AppService, …Run Code Online (Sandbox Code Playgroud) 我已一步步遵循官方 Nest 文档(https://docs.nestjs.com/security/authenticationvalidate() ),但在使用@AuthGuard('local')或@AuthGuard(LocalAuthGuard)登录操作时无法调用方法。
如果我不使用该保护装饰器,则一切都会按预期工作(但我需要使用它来将我的令牌添加到请求对象中)。
auth.controller.ts
@UseGuards(AuthGuard('local')) // or AuthGuard(LocalAuthGuard)
@Post('login')
async login(
@Request() req
) {
const { access_token } = await this.authService.login(req.user);
return access_token;
}
}
Run Code Online (Sandbox Code Playgroud)
本地策略.ts
@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
constructor(private authService: AuthService) {
super({ usernameField: 'email' });
}
async validate(email: string, password: string): Promise<any> { // class is constructed but this method is never called
const user: UserDto = await this.authService.login({
email,
password,
});
if (!user) { …Run Code Online (Sandbox Code Playgroud) passport-local ×10
passport.js ×8
node.js ×7
express ×5
mongodb ×2
nestjs ×2
cookies ×1
javascript ×1
nestjs-jwt ×1
redux ×1
sails.js ×1
session ×1
typescript ×1