MA *_*man 4 javascript authentication node.js express passport.js
我想通过passport.js的帮助从注册页面添加新用户注册表格如下
<form id="Signup-form" name="SignupForm" action="/signup" method="post"/>
<input type="text" id="firstname" name="Firstname" >
<input type="text" id="lastname" name="Lastname"/>
<input type="email" name="email" />
<input type="text" id="rollno" name="rollno"/>
<input type="password" name="password" id="password"/>
<input type="password" name="confirm" id="confirm-password"/>
<input type="radio" name='Gender' value="Male" />
<input type="radio" name='Gender' value="FeMale" />
</form>
Run Code Online (Sandbox Code Playgroud)
我的护照在 app.js 中初始化为
必需的
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
Run Code Online (Sandbox Code Playgroud)
数据库设置后
require('./config/passport');
Run Code Online (Sandbox Code Playgroud)
初始化为
app.use(passport.initialize());
app.use(passport.session());
Run Code Online (Sandbox Code Playgroud)
发布注册路径
router.post('/signup', passport.authenticate('local.signup' , {
successRedirect : '/home',
failuerRedirect : '/signup',
failuerFlash: true
}));
Run Code Online (Sandbox Code Playgroud)
我的用户模型
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var bcrypt = require('bcrypt-nodejs')
const UserSchema = new Schema({
First_Name : String,
Last_Name : String,
email : String,
Roll_No : String,
Gender : String,
password : String
},{collection : 'Users'});
UserSchema.methods.encryptPassword = function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(5), null);
};
UserSchema.methods.validPassword = function(password) {
return bcrypt.compareSync(password, this.password);
}
var User = mongoose.model('User' , UserSchema);
module.exports = User;
Run Code Online (Sandbox Code Playgroud)
现在我的配置目录中的passport.js文件是
var passport = require('passport');
var User = require('../models/user');
var LocalStrategy = require('passport-local').Strategy;
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});
Run Code Online (Sandbox Code Playgroud)
我的主要问题是如何为这条路线的所有领域编写策略
passport.use('local.signup', new LocalStrategy({
//strategy code here
}));
Run Code Online (Sandbox Code Playgroud)
Sta*_*mos 10
passport.use('local-signup', new LocalStrategy({
// by default, local strategy uses username and password, we will override with email
usernameField : 'email',
passwordField : 'password',
passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, email, password, done) {
// find a user whose email is the same as the forms email
// we are checking to see if the user trying to login already exists
User.findOne({ 'local.email' : email }, function(err, user) {
// if there are any errors, return the error
if (err)
return done(err);
// check to see if theres already a user with that email
if (user) {
return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
} else {
// if there is no user with that email
// create the user
var newUser = new User();
// set the user's local credentials
newUser.local.email = email;
newUser.local.password = newUser.generateHash(password);
// save the user
newUser.save(function(err) {
if (err)
throw err;
return done(null, newUser);
});
}
}));
Run Code Online (Sandbox Code Playgroud)
对于任何试图弄清楚除了用户名(可以是电子邮件)和密码之外如何向护照本地添加其他字段的人来说,接受的答案仅暗示如何做到这一点。假设您想使用用户模型的名称、电子邮件和密码。您可以使用 Passport-local 来完成此操作,如下所示:
const passport = require('passport');
const localStrategy = require('passport-local').Strategy;
const User = require('./model/user');
passport.use('signup', new localStrategy({
usernameField : 'email',
passwordField : 'password',
passReqToCallback: true
}, async (req, email, password, done) => {
try {
const name = req.body.name;
const user = await User.create({ name, email, password });
return done(null, user);
} catch (error) {
done(error);
}
}));
Run Code Online (Sandbox Code Playgroud)
需要注意的是: 护照 localStrategy 对象不接受除 usernameField 和 passwordField 之外的其他字段。但您可以将请求对象传递给回调。然后,在将用户保存到数据库之前,从 req.body 对象中提取字段并将其放入 create 方法中(如果您使用的是 Mongoose.js)。
| 归档时间: |
|
| 查看次数: |
15050 次 |
| 最近记录: |