首页 > 解决方案 > Passport Google Strategy 如何与数据库通信?

问题描述

我遵循了一个使用 Google Strategy 来检查用户之前是否已添加到数据库的教程。该过程在 passport.use( new GoogleStrategy (....) 函数中完成。它正确存储了用户,但我仍然对它如何在该函数中与 dynamo DB 进行通信感到困惑。

应用程序.js

var createError = require("http-errors");
var express = require("express");
var path = require("path");
var cookieParser = require("cookie-parser");
var logger = require("morgan");
var passport = require("passport");
var bodyParser = require("body-parser");
var passport = require("passport");
var session = require("express-session");
var DynamoDBStore = require("connect-dynamodb")(session);
var GoogleStrategy = require("passport-google-oauth2").Strategy;
var AWS = require("aws-sdk");
var cors = require("cors");
require("dotenv").config({ path: __dirname + "/.env" });
var GOOGLE_CLIENT_ID = process.env.GOOGLE_CLIENT_ID;
var GOOGLE_CLIENT_SECRET = process.env.GOOGLE_CLIENT_SECRET;

passport.use(
  new GoogleStrategy(
    {
      clientID: GOOGLE_CLIENT_ID,
      clientSecret: GOOGLE_CLIENT_SECRET,
      callbackURL: "http://localhost:3000/auth/google/callback",
      passReqToCallback: true,
    },
    function (request, accessToken, refreshToken, profile, done) {
      // asynchronous verification, for effect...
      process.nextTick(function () {
        User.findOne({ "google.id": profile.id }, function (err, user) {
          if (err) return done(err);

          if (user) {
            // if a user is found, log them in
            return done(null, user);
          } else {
            // if the user isnt in our database, create a new user
            var newUser = new User();

            // set all of the relevant information
            newUser.google.id = profile.id;
            newUser.google.token = token;
            newUser.google.name = profile.displayName;
            newUser.google.email = profile.emails[0].value; // pull the first email

            // save the user
            newUser.save(function (err) {
              if (err) throw err;
              return done(null, newUser);
            });
          }
        });
      });
    }
  )
);
passport.serializeUser(function (user, done) {
  done(null, user);
});

passport.deserializeUser(function (obj, done) {
  done(null, obj);
});

var app = express();
AWS.config.update({
  accessKeyId: process.env.ACCESS_KEY,
  secretAccessKey: process.env.ACCESS_KEY_SECRET,
  region: "us-west-1",
});

var dynamodb = new AWS.DynamoDB();
var server = require("http").createServer(app);

var users = require("./routes/users");
var drinksRouter = require("./routes/drinks");
var ingredientsRouter = require("./routes/ingredients");
var liquorRouter = require("./routes/liquors");
var justIngredients = require("./routes/justIngredients");

app.use(function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "http://localhost:3001");
  res.header("Access-Control-Allow-Credentials", true);
  res.header(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept"
  );
  next();
});

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cookieParser());
app.use(logger("dev"));

/*
app.get("/", function (req, res) {
  res.send({ title: "Drinks API Entry Point" });
});
*/

var options = {
  table: "app-sessions",
  AWSConfigJSON: {
    accessKeyId: process.env.ACCESS_KEY,
    secretAccessKey: process.env.ACCESS_KEY_SECRET,
    region: "us-west-1",
  },
  client: dynamodb,
};
//initialzie session
app.use(
  session({
    store: new DynamoDBStore(options),
    secret: "new user",
    resave: true,
    saveUninitialized: true,
  })
);
app.use(passport.initialize());
app.use(passport.session());
//   serialized and deserialized.
app.use((req, res, next) => {
  console.log(req.user);
  next();
});
app.get("/", function (req, res) {
  res.status(200).send({ user: req.user });
});

app.get("/account", ensureAuthenticated, function (req, res) {
  res.status(200).send({ user: req.user });
});

app.get("/login", function (req, res) {
  res.status(200).send({ user: req.user });
});
app.get("/users", function (req, res) {
  res.send({ user: req.user });
});


app.get(
  "/auth/google",
  passport.authenticate("google", {
    scope: ["profile", "email", "openid"],
  })
);


app.get(
  "/auth/google/callback",
  passport.authenticate("google", {
    failureRedirect: "/login",
  }),
  function (req, res) {
    res.redirect(`http://localhost:3001/`);
  }
);

app.get("/logout", function (req, res) {
  req.logout();
  res.redirect("http://localhost:3001/");
});

function ensureAuthenticated(req, res, next) {
  if (req.isAuthenticated()) {
    return next();
  }
  res.redirect("/login");
}

//app.use("/users", users);
app.use("/drinks", drinksRouter);
app.use("/ingredients", ingredientsRouter);
app.use("/liquors", liquorRouter);
app.use("/justIngredients", justIngredients);

server.listen(3000, () => console.log("Drinks API listening on port 3000!"));



标签: node.jsexpresspassport.js

解决方案


推荐阅读