问题描述
我遵循了一个使用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 (将#修改为@)