Node jS express 验证 facebook API

Node jS express Authenticate facebook API

你好,我是后端新手,想使用 express 创建一个带有节点 js 的身份验证 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

您可以使用此脚本对 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}`);
});