javascript - 需要了解 passport.js 本地策略

标签 javascript node.js mongodb mongoose passport.js

我正在尝试在 Passport 策略的 usernameField 中添加一个电话,以便用户也可以使用那里的电话号码和电子邮件登录,但是在互联网上搜索后有点卡住如何去做 - 阅读 passport.js 文档它不是对我来说没有任何意义。 Q1:我应该更改我的 schemamongoose 模型还是什么,因为我无法在 Passport 本地策略中添加第三个字段。

import  mongoose from 'mongoose';
import { Router } from 'express';
import Account from '../model/account';
import bodyParser from 'body-parser';
import passport from 'passport';

import {generateAccessToken, respond, authenticate} from '../middleware/authMiddleware';

api.post('/register', (req, res) => {
  Account.register(new Account({
    username: req.body.email,
    phoneNumber: req.body.phoneNumber,
    myId: req.body.myId,
    termsandcondition: req.body.termsandcondition,

    verifiedEmailCode: uuid()
  }), req.body.password, function(err, account) {

    if (err) {
      return res.json({
                        "status": false,
                        "code" : 500,
                        "message": 'An error occurred: ' + err
                      });
    }

    passport.authenticate(
      'local', {
        session: false
    })(req, res, () => {
      // send email
      const confirmUrl = `${config.siteUrl}/api/v1/account/register/verifyemail?token=${req.user.verifiedEmailCode}`;
      gmail.sendMail({
        from: config.gmail.user,
        to: req.user.username,
        subject: 'Please confirm your email with Beamlive',
        html: `<a href="${confirmUrl}">Please confirm your email with mylive</a>`,
        auth: {
          user: config.gmail.user,
          refreshToken: config.gmail.refreshToken,
          accessToken: config.gmail.accessToken
        }
      }, (err, info) => {
        if(err) {
          console.log('error sending email', err);
          return;
        }
          console.log('successfully sent registration email');
      })


      })
      .then(message => {

      })
      .done();
      res.json({
                 "User":{"UserID": req.user.username,
                         "PhoneNumber": req.user.phoneNumber,
                         "myId": req.user.beamId.IdOne,
                         "termsandcondition": req.user.termsandcondition
                          },
                 "status": true,
                 "code": 200,
                 "message": 'You have successfully registered with  mylive'
      });

      });
    });
  });

  api.post('/login', (req, res, next) => passport.authenticate(
    'local', {
      session: false,
      scope: []
    }, (err, user, info) => {
      if(err) {
        return next(err);
      }

      if(!user.verifiedEmail && !user.verifiedPhone) {
        return res.json({ "status": false, "code": 403, "message": "You need to verify your email or Phone number" });
      }

      req.logIn(user, next);
    })(req, res, next), generateAccessToken, respond);

  return api;
}

//授权中间件:

import jwt from 'jsonwebtoken';
import expressJwt from 'express-jwt';

const TOKENTIME = 60*60*24*30 // 30 days
const SECRET = "server key will go here";

let authenticate = expressJwt({ secret : SECRET })

let generateAccessToken = (req, res, next) => {
  req.token = req.token || {};
  req.token = jwt.sign({
    id: req.user.id,
  }, SECRET, {
    expiresIn: TOKENTIME// 30 days
  });
  next();
}

let respond = (req, res) => {
  res.status(200).json({
    user: {userID: req.user.username,
    token: req.token,
    tokenTime: TOKENTIME},
    status: true,
    code: 200,
    message: 'User logged In'
  });
}

module.exports = {
  authenticate,
  generateAccessToken,
  respond
};

//索引.js:

app.use(passport.initialize());
let Account = require('./model/account');
passport.use(new LocalStrategy({
  usernameField: 'email',
  passwordField: 'password'
},
  Account.authenticate()
));
passport.serializeUser(Account.serializeUser());
passport.deserializeUser(Account.deserializeUser());

//模式mongodb:

import passportLocalMongoose from 'passport-local-mongoose';

let Account = new Schema({

phoneNumber: String,
email: String,
password: String

Account.plugin(passportLocalMongoose);
module.exports = mongoose.model('Account', Account);

最佳答案

passport-local-mongoose 库允许您在添加插件时传递一些选项,其中一个选项是 usernameQueryFields,根据文档:

usernameQueryFields: specifies alternative fields of the model for identifying a user (e.g. email).

因此,为了使用 phoneNumber 字段,您应该能够执行如下操作:

let Account = new Schema({
  phoneNumber: String,
  email: String,
  password: String
});

Account.plugin(passportLocalMongoose, { usernameQueryFields: ["phoneNumber", "email"] });
module.exports = mongoose.model("Account", Account);

关于javascript - 需要了解 passport.js 本地策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50623374/

相关文章:

MongoDb 查询需要很长时间

mongodb - 获取所有子文档都符合条件的 MongoDB 文档

javascript - 如何以编程方式删除附加的 jQuery 函数?

javascript - 我可以使用 res.send(foo) 两次吗?

javascript - 如果通过套接字连接的用户数量至少为 1,则运行用户定义的函数 - Nodejs

angularjs - Restangular 响应和 ng-repeat

javascript - 未知的顶级运营商 : $orderby

javascript - POST 上的请求正文始终为空

javascript - 如果所有 ajax 未完成且用户离开窗口或页面

javascript - 如何在 VS code/Prettier 中为不同文件指定不同格式