首先,我是法语,我的英语不太好,我会尽力而为:)
我使用PassportJs,Mongoose和Expressjs(v3.x)创建了本地身份验证。它运作完美。登录用户后,在/ account /空间中,我创建了一个用于更改当前密码的表单(3个输入:pass,newpass,newpassconfirm)。但是之后,我不知道如何处理...
我是否必须创建另一个通行证LocalStrategy来查找我的用户并调用在我的用户架构中声明的“ setPassword”函数?我可以不使用passport.js来执行此操作吗?如果有可能,我如何让我的用户访问数据库?
这是我的认证有效的代码。
我的/ login POST(/routes/user.js)
app.post('/login', function(req, res, next) {
passport.authenticate('local-login', function(err, user, info) {
if (err) {
return next(err);
}
if (!user) {
return res.redirect('/login');
}
req.logIn(user, function(err) {
if (err) {
return next(err);
}
req.session.pseudo = user.pseudo;
return res.redirect('/');
});
})(req, res, next);
});
Run Code Online (Sandbox Code Playgroud)
我的护照脚本(/script/passport.js)
passport.use('local-login', new LocalStrategy({
usernameField : 'pseudo',
passwordField : 'pass',
passReqToCallback : true // permet de passer l'objet req dans le callback
}, function (req, pseudo, pass, done) { …Run Code Online (Sandbox Code Playgroud) 我想用passport.js进行ajax登录.我有通常的代码来设置passport.js:
//route
app.post('/api/auth/login', passport.authenticate('local-login', {
successRedirect: '/',
failureRedirect: '/login'
}));
//config strategy
passport.use('local-login', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
}, loginUser));
var loginUser = function(req, email, password, done) {
UserRepo.getOne({
'local.email': email
}).done(function(user) {
if (!user || !user.validPassword(password)) {
return done(null, false, {
message: 'user or password is incorrect'
});
}
return done(null, user);
},
function(err) {
return done(err);
});
};
Run Code Online (Sandbox Code Playgroud)
这是我的react组成部分:
var Login = React.createClass({
//...
handleSubmit: function (e) {
e.preventDefault();
var email = this.state.email.trim(); …Run Code Online (Sandbox Code Playgroud) 我正在关注本教程.
但是当我sails lift运行我的应用程序时,我遇到了错误.
抛出新的TypeError('JwtStrategy需要一个函数来从请求中检索jwt(参见选项jwtFromRequest)');
^TypeError:JwtStrategy需要一个函数来从请求中检索jwt(参见选项jwtFromRequest)
请帮我解决这个错误.
我正在使用Passport来保护MEAN堆栈应用程序的前端和后端.该应用程序的结构如下:
monstermash
config // server configuration
public // static directory that will serve the entire Angular frontend
app
index.js // initialization of the server
models
index.js // mongoose schemas and models
passport
index.js // configuration for passport and all my strategies
routes
index.js // basic route definitions for the API (using functions defined under v1, below) and UI (routes defined inline here for simplicity's sake)
v1
index.js // all the functions called to power the API routes
Run Code Online (Sandbox Code Playgroud)
这是app/index.js因为我知道有时候需要以正确的顺序调用应用程序中间件: …
我正在使用 PassportJS 进行登录功能有没有办法更改请求中的“用户”对象名称?
默认情况下,这就是它现在的工作方式(req.user):
function (req, res, next) {
if (!req.user) {
req.flash('error', 'Please sign in to access this page.');
res.redirect('/login');
} else {
next();
}
}
Run Code Online (Sandbox Code Playgroud)
我想改用以下内容(req.candidate):
function (req, res, next) {
if (!req.candidate) {
req.flash('error', 'Please sign in to access this page.');
res.redirect('/login');
} else {
next();
}
}
Run Code Online (Sandbox Code Playgroud) 我目前正在使用此代码登录:
passport.use(new localStrategy({
usernameField: 'username'
}, User.authenticate()));
Run Code Online (Sandbox Code Playgroud)
当我使用用户名和密码登录时,这很好用。现在我想用电子邮件而不是用户名登录。我已将代码更改为:
passport.use(new localStrategy({
usernameField: 'email',
usernameQueryFields: ['email']
}, User.authenticate()));
Run Code Online (Sandbox Code Playgroud)
我还更改了我的 HTML 代码以显示带有电子邮件名称的电子邮件字段:
<input type="text" name="email" id="email" placeholder="Your Email" class="form-control">
Run Code Online (Sandbox Code Playgroud)
这是我的用户的架构:
{
"_id" : ObjectId("585f62d63158ec1f608f82a2"),
"salt" : "d7fd24ab337be7341bb6c54df69eccdce607a6cffc8457be4d44",
"hash" : "(long text)",
"username" : "joseph320",
"email" : "joseph@gmail.co",
"name" : "joseph",
"__v" : 0,
}
Run Code Online (Sandbox Code Playgroud)
所以现在它应该在数据库中查找电子邮件字段,并将其与登录表单中提供的电子邮件用户进行比较。但它不起作用。当我尝试使用电子邮件和密码登录时,它给了我“无效的用户名或密码”错误。
但是当我尝试使用用户名和确切密码登录时,它会成功登录。问题出在哪里,我该如何解决?
我正在使用此软件包进行身份验证:
"passport": "^0.3.2",
"passport-local": "^1.0.0",
"passport-local-authenticate": "^1.2.0",
"passport-local-mongoose": "^4.0.0",
Run Code Online (Sandbox Code Playgroud) 试图设置护照本地。使用本指南作为灵感。
我遇到的问题是,当我从路由文件调用函数到控制器文件时,它不起作用。如果我将控制器文件中的代码放在路由文件中,它就可以工作。
这是我的 app.js
const express = require('express');
const bodyParser = require('body-parser');
const passport = require('passport');
const flash = require('connect-flash');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const Data = require('./app/models/data.js');
const User = require('./app/models/user.js');
require('./config/passport')(passport)
// create express app
const app = express();
// set the view engine to ejs
app.set('view engine', 'ejs');
// parse requests of content-type - application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }))
// parse requests of content-type - application/json
app.use(bodyParser.json()) …Run Code Online (Sandbox Code Playgroud)身份验证后,我无法从我的应用程序的前端请求数据 - 但只能通过服务器端视图和Postman我可以在登录后进行后续数据请求,或者通过在Postman中对我的用户进行身份验证然后在我的数据请求中进行数据请求应用程序.
首先,我是服务器端的新手.
我有一个SailsJS后端,我正在使用REST.使用LocalStrategy创建和验证用户工作正常 - 实际上,甚至使后续数据请求工作正常 - 但不是通过我的应用程序的AJAX.
我可以使用Postman或服务器端视图来访问数据,例如/list; 在我的应用程序中进行身份验证后发出请求不起作用 - 除非我跳回Postman并登录,然后跳回我的应用程序并重新发送请求.
我注意到set-cookie我的应用程序在第一个身份验证请求和请求之间有所不同/list.
如果有必要,我可以展示一些代码,但这似乎是我在制作经过身份验证的AJAX请求时缺少一个非常高级的基本概念.
编辑:
我的前端是在不同的领域-帆上运行localhost:1337,而我的UI上运行localhost:8100.
这是我的/api/config/cors.js样子:
module.exports.cors = {
allRoutes: true,
origin: '*',
credentials: true,
// methods: 'GET, POST, PUT, DELETE, OPTIONS, HEAD',
// headers: 'content-type'
};
Run Code Online (Sandbox Code Playgroud)
我在前端使用了角度,随后的请求正在使用withCredentials: true- 我是否需要将此添加到登录请求中?我是否必须在请求中同时发送用户名/电子邮件?
如何在登录后允许我的所有后续数据验证请求?
我正在使用nodejs和express来构建用户注册.我正在创建一个没有任何护照或任何身份验证策略的新用户.我想要的是用户应该在注册成功后被视为已登录.所以我正在为用户构建登录api.用户只能使用电子邮件字段进行真实身份验证(因为我没有使用用户存储任何密码).但我无法验证用户,因为我在护照身份验证中收到"缺少凭据".
app.js
var config = require('./config/development');
var passport = require('passport');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var app = express();
//connect db
mongoose.connect(config.db);
mongoose.set('debug', config.mongoose.debug);
require('./config/passport')(passport); // pass passport for configuration
//initialize all models
var modelsPath = require('path').join(__dirname, 'models');
require('fs').readdirSync(modelsPath).forEach(function(file) {
require('./models/' + file);
});
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(expressValidator());
app.use(bodyParser.urlencoded({
extended: false
}));
app.use(cookieParser());
/// required for passport
app.use(session({
secret: 'anystringoftext',
saveUninitialized: true,
resave: true …Run Code Online (Sandbox Code Playgroud) 只是想在 LocalStrategy 的回调中获取 http 请求或 request.body,正如您在附件中看到的那样,我们像这样编码 new LocalStrategy({ usernameField: 'email', passwordField: 'pwd' },(username: any, password :any,done:any) => { 我们能够获取用户名和密码,但我想获取整个 req.body
代码
import UserDetailsRepo from '../../repo/UserDetailsRepo'
import UserDetails from '../../model/UserDetails'
import * as passport from 'passport'
import { Strategy as LocalStrategy } from 'passport-local'
// import JwtConfiguration from './express-jwt-config'
import * as HttpStatus from 'http-status-codes'
class PassportAuth {
public passport: any;
constructor() {
this.passport = passport.use(new LocalStrategy({
usernameField: 'email', …Run Code Online (Sandbox Code Playgroud) passport-local ×10
node.js ×9
passport.js ×7
express ×3
mongodb ×2
sails.js ×2
ajax ×1
jwt ×1
mongoose ×1
reactjs ×1