Passport local auth plus passport mongoose local 不接受电子邮件作为用户名

Posted

技术标签:

【中文标题】Passport local auth plus passport mongoose local 不接受电子邮件作为用户名【英文标题】:Passport local auth plus passport mongoose local are not accepting email as username 【发布时间】:2018-11-07 03:47:32 【问题描述】:

我正在使用本地护照策略和本地护照猫鼬创建用户并检查用户身份验证。但是,我想探索使用电子邮件而不是用户名的选项。我按照文件的内容进行操作,但我正在获得未经授权的许可。有人可以告诉我为什么会出错,如果我只使用用户名作为登录名,它就可以工作。

来自护照本地猫鼬 注意: usernameField:指定保存用户名的字段名称。默认为“用户名”。如果您想使用不同的字段来保存用户名,例如“电子邮件”,则可以使用此选项。

从护照本地策略 默认情况下,LocalStrategy 期望在名为 username 和 password 的参数中找到凭据。如果您的网站希望以不同的方式命名这些字段,则可以使用选项来更改默认值。

我尝试同时将两者设置为 true,并且我还尝试将一个设置为 true,另一个设置为 off。我会得到同样的错误

表达 4.16.0 快速会话 1.15.6 猫鼬 5.1.2 护照 0.40 护照本地 1.0.0 护照本地猫鼬5.0.0

passport.js

module.exports = function (passport, LocalStrategy, User) 
    passport.use(new LocalStrategy(
        usernameField: 'email',
        passwordField: 'password',
        passReqToCallback: true,
        session: true
      ,
      function(req, username, password, done) 
        return done(null, req.user);
      
    ));
    passport.serializeUser(User.serializeUser());
    passport.deserializeUser(User.deserializeUser());
;

模型/User.js

var UserSchema = new mongoose.Schema(
    name:  type: String, required: true, default: '',
    username:  type: String, unique: true, uniqueCaseInsensitive: true, required: true, default: '',
    email:  type: String, required: true, unique: true, uniqueCaseInsensitive: true, default: '',
    profileImage: type: String, default: '',
    timestamp: type: String, default: () => moment().format("dddd, MMMM Do YYYY, h:mm:ss a") 
);

UserSchema.plugin(passportLocalMongoose, usernameField: 'email');
UserSchema.plugin(uniqueValidator);

module.exports = mongoose.model('UserSchema', UserSchema);

signinForm.js

<form class="form-signin" action="/users/signup" method="POST" enctype='multipart/form-data'>
    <h1 class="h3 mb-3 font-weight-normal">Please sign up</h1>
    <label for="inputName" class="sr-only">Name</label>
    <input type="bane" id="inputName" class="form-control" placeholder="Name" name='name' required autofocus />

    <label for="inputUsername" class="sr-only">Username</label>
    <input type="bane" id="inputUsername" class="form-control" placeholder="Username" name='username' required autofocus />

    <label for="inputEmail" class="sr-only">Email</label>
    <input type="email" id="inputEmail" class="form-control" placeholder="Email" name='email' required autofocus />

    <label for="inputPassword" class="sr-only">Password</label>
    <input type="password" id="inputPassword" class="form-control" placeholder="Password" name='password' required autofocus/>  

    <label for="inputConfirmPassword" class="sr-only">Confirm Password</label>
    <input type="password" id="inputConfirmPassword" class="form-control" placeholder="Confirm Password" name='confirmPassword' required autofocus/>  

    <input type='file' class='form-control' id='inputFile' name='profileImage' />
    <div style="height: 10px"></div>
    <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
    <p class="mt-5 mb-3 text-muted">&copy; 2017-2018</p>
</form>

路由/users.js

router.post('/signup', upload.single('profileImage'), function(req, res, next) 

  const name = req.body.name;
  const email = req.body.email;
  const password = req.body.password;
  const confirmPassword = req.body.confirmPassword;

  if (req.file) 
    console.log('Uploading File...');
    var profileImage = req.file.filename;
   else 
    console.log('No File Uploaded... Setting to no image');
    var profileImage = 'noimage.jpg';
  

  UserController.createUser(req.body, function(err, user) 
    if (err) 
      res.json(
        err: err
      );
      return;
    
    passport.authenticate('local')(req, res, function() 
      //res.render('index', currentUser: user, title: 'Product Page' );
      res.redirect('/');
      return;
     );
    return;
  )
);

我最终获得了授权和 401

提前致谢。

【问题讨论】:

【参考方案1】:

尝试去掉UserController.createUser()末尾的'return',需要等待passport.authenticate()的结果

【讨论】:

我明白了,您尝试使用您的应用程序访问“/users/signup”,但 Node.js 路由是“/signup”。如果您的路由器未处理“/users”前缀,则这是一个错误。 嘿 Copro,我有一条用户路由,所以 /users/signup 可以工作。我的 req.body 有我需要的所有信息,除了护照没有将电子邮件作为用户名

以上是关于Passport local auth plus passport mongoose local 不接受电子邮件作为用户名的主要内容,如果未能解决你的问题,请参考以下文章

Passport.js本地策略如何保护路线

passport.js 是不是支持 ajax?

Passport-auth0 访问 accessToken

使用 passport-auth0 进行 MEAN Stack 用户身份验证,在 Angular 中调用 Node Js passport-auth0 API

Laravel Passport:auth:api 的行为类似于 auth:web

登录时如何“记住”用户-passport.js-phonegap