Passport Google Strategy如何与数据库通信?

问题描述

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

app.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,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,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,next) => {
  console.log(req.user);
  next();
});
app.get("/",res) {
  res.status(200).send({ user: req.user });
});

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

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


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


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

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

function ensureAuthenticated(req,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!"));



解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)