简体   繁体   English

需要了解passport.js本地策略

[英]Needs to understand passport.js local strategy

I'm trying to add a phone in usernameField in passport strategy so users can also login using there phone number and email, but kinda stuck on how to do it after searching it on the internet - reading passport.js docs its not making any sense to me. 我正在尝试在护照策略中的usernameField中添加电话,以便用户也可以使用那里的电话号码和电子邮件登录,但是在互联网上搜索后有点卡住了操作方法-阅读passport.js文档没有任何意义对我来说。 Q1: Should I change my schemamongoose model or what as I can't add a third field in passport local strategy. 问题1:我应该更改schemamongoose模型还是不能在护照本地策略中添加第三个字段?

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;
}

//auth middle-ware: //验证中间件:

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
};

//Index.js: //Index.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());

//Schema mongodb: //模式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);

The passport-local-mongoose library allows you to pass some options when adding the plugin, one of those options is usernameQueryFields which according to the docs: Passport-local-mongoose库允许您在添加插件时传递一些选项,其中一个选项是usernameQueryFields ,根据文档:

usernameQueryFields: specifies alternative fields of the model for identifying a user (eg email). usernameQueryFields:指定模型中用于标识用户的备用字段(例如电子邮件)。

So in order to use the phoneNumber field, you should be able to do something like: 因此,为了使用phoneNumber字段,您应该能够执行以下操作:

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM