【问题标题】:Node jS express Authenticate facebook APINode jS express 验证 facebook API
【发布时间】:2021-09-22 19:22:15
【问题描述】:

你好,我是后端的新手,想使用 express 和 node js 制作一个 Authenticate facebook api,我使用护照,但它不起作用,并给我一个 html 代码页面作为使用 facebook 帐户登录的响应,这可以处理使用 api 可能与移动应用程序一起使用的网页
我使用的护照文件

const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcryptjs');
const passport = require('passport')
const FacebookStrategy = require('passport-facebook').Strategy;
// Load User model
const User = require('../Schema/user');
// ---------------- Local Auth -------------- //
passport.use(
  new LocalStrategy({ usernameField: 'email' },
    (email, password, done) => {
      //  Search For Match user
      User.findOne({ email: email }).then(user => {
        if (!user) {
          console.log("That email is not registered")
          return done(null, false, { message: 'That email is not registered' });
        }
        // Compare the Two Password password
        bcrypt.compare(password, user.password, (err, isMatch) => {
          // if (err) throw err;
          if (err) {
            console.log(err)
            return done(err);
          }
          if (isMatch) {
            console.log("matching email");
            return done(null, user);
          } else {
            console.log("Password incorrect");
            return done(null, false, { message: 'Password incorrect' });

          }
        });
      });
    })
);
//------------------ Facebook Auth ---------------//
 passport.use(new FacebookStrategy({
  clientID: process.env.FACEBOOK_APP_ID,
  clientSecret: process.env.FACEBOOK_APP_SECRET,
  ccallbackURL: "/auth/facebook/callback",
  profileFields: ['id', 'emails', 'name'],
},
  async (accessToken, refreshToken, profile, done) => {
      try {
          const userData = {
              firstName: profile._json.first_name.toLowerCase(),
              lastName: profile._json.last_name.toLowerCase(),
              email: profile._json.email,
              isConfirmed: true,
          };
         // const user = await userService.registerWithThirdParty(userData);
          done(null, user);
      } catch (error) {
          console.error(error.message);
          done(null, false);
      }
  }
)); 



passport.serializeUser(function (user, done) {
  done(null, user.id);
});

passport.deserializeUser(function (id, done) {
  User.findById(id, function (err, user) {
    done(err, user);
  });
});

module.exports = passport;

我的 index.js 文件

router.get("/auth/facebook", passport.authenticate("facebook"));

router.get("/auth/facebook/callback",
function (req, res, next) {
    passport.authenticate('facebook', function (err, user, info) {
        if (err) { return next(err); }
        if (!user) { return res.json({ message: info.message }) }
        req.logIn(user, function (err) {
            if (err) { return next(err); }
            return res.json({ msg: "succes Login", user: user });
        });
    })(req, res, next);
}
);

当我使用本地注册或登录时,它可以工作,但是当我使用 facebook 登录时,它不起作用并给我一个完整的 html 来登录,我无法在我的 api 中处理它。
提示:我使用 passport-facebook

【问题讨论】:

    标签: javascript node.js facebook express passport.js


    【解决方案1】:

    您可以使用此脚本对 facebook + passport js 进行身份验证:

    user.controller.js

    import passport from "passport";
    import dotenv from "dotenv";
    import strategy from "passport-facebook";
    
    import userModel from "../user/user.model";
    
    const FacebookStrategy = strategy.Strategy;
    
    dotenv.config();
    passport.serializeUser(function(user, done) {
      done(null, user);
    });
    
    passport.deserializeUser(function(obj, done) {
      done(null, obj);
    });
    
    passport.use(
      new FacebookStrategy(
        {
          clientID: process.env.FACEBOOK_CLIENT_ID,
          clientSecret: process.env.FACEBOOK_CLIENT_SECRET,
          callbackURL: process.env.FACEBOOK_CALLBACK_URL,
          profileFields: ["email", "name"]
        },
        function(accessToken, refreshToken, profile, done) {
          const { email, first_name, last_name } = profile._json;
          const userData = {
            email,
            firstName: first_name,
            lastName: last_name
          };
          new userModel(userData).save();
          done(null, profile);
        }
      )
    );
    

    user.router.js

    import express from "express";
    import passport from "passport";
    import userController from "./user.controller";
    
    
    const userRouter = express.Router();
    
    userRouter.get("/auth/facebook", passport.authenticate("facebook"));
    
    userRouter.get(
      "/auth/facebook/callback",
      passport.authenticate("facebook", {
        successRedirect: "/",  // to add check you can use this value successRedirect also the next value failureRedirect
        failureRedirect: "/fail"
      })
    );
    
    userRouter.get("/fail", (req, res) => {
      res.send("Failed attempt");
    });
    
    userRouter.get("/", (req, res) => {
      res.send("Success");
    });
    export default userRouter;
    

    index.js

    import express from "express";
    import { json } from "body-parser";
    import passport from "passport";
    
    import { connect } from "./utils/db";
    import userRouter from "./user/user.routes";
    
    const app = express();
    const port = 3000;
    
    app.use(passport.initialize());
    
    app.use(json());
    app.use("/", userRouter);
    
    app.listen(port, async () => {
      await connect();
      console.log(`Server listening on ${port}`);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 2017-06-10
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      相关资源
      最近更新 更多