如何处理,检查用户是否使用Passport Slack Strategy和Passport-local登录

时间:2018-01-26 15:51:57

标签: node.js passport.js passport-local

您好我需要一些帮助来设置一个函数来检查用户是否使用松弛策略登录Passport.js。

我有一个工作正常的本地策略,但我也想实现一个松弛的登录。

我已将我的应用添加到slack并设置重定向网址。一切正常,但无论用户是否登录,他们仍然可以从URL访问主页面。

示例我的登录页面为123.456.7.891:3000/login,当用户通过本地登录或登录时,它会重定向到123.456.891:3000 / index。好吧,如果你知道索引的URL,你可以导航到它。

对于本地策略,我使用此功能来防止这种情况。它会检查用户是否已登录。

  function isLoggedIn(req, res, next){
  if(req.isAuthenticated()){
      return next();
  }
  req.flash("error", "Must be signed in first to access this page.");
  res.redirect("/login");
}

而不是简单地将isLoggedIn函数添加到这样的路径中。

app.get("/QAApplicationHub", isLoggedIn, (req, res) => {
Application.find({}, (err, allApplications) => {
  if(err){
      console.log(err);
    }  else {
      res.render("index", { application: allApplications });
      // username: req.user.name
    }
   });
 });

当用户使用slack登录时,我遇到的问题是当他们被重定向到重定向URL时,它只会将他们带回登录页面,指出用户必须登录才能访问该页面。出现该消息是因为我设置了闪存以向用户显示错误。似乎使用我当前的代码,isLoggedIn只检查本地登录而不是松弛。

那么如何为本地策略和松弛策略实现isLoggedIn函数呢?或者我需要实施哪种方法才能使两者都有效。

这是我的Passport-slack代码。

  // Configure the Slack Strategy
  passport.use(new SlackStrategy({
    clientID: process.env.SLACK_CLIENT_ID = '123456',
    clientSecret: process.env.SLACK_CLIENT_SECRET ='123abc',
    }, (accessToken, scopes, team, extra, profiles, done) => {
    done(null, profiles.user);
  }));

 //=============================
//LOCAL LOGIN MIDDLEWARE
//=============================
app.post("/login", passport.authenticate("local", {
  successRedirect: "/QAApplicationHub",
  failureRedirect: "/login",
  failureFlash: true
}));

app.get("/logout", (req, res) => {
  req.logout();
  req.flash("success", "Successfuly signed out!")
  res.redirect("/login");
});

// =============================
// PASSPORT-SLACK MIDDLEWARE
// =============================
// path to start the OAuth flow
app.post('/auth/slack', passport.authorize('slack', {
  successRedirect: "/QAApplicationHub",
  failureRedirect: "/login",
  failureFlash: true
}));

// OAuth callback url
 app.get('/auth/slack/callback',
   passport.authorize('slack',
     (req, res) => {
     res.redirect('/QAApplicationHub')
   }));

2 个答案:

答案 0 :(得分:0)

我相信用户存储在Main属性中。试试这个:

req.user

答案 1 :(得分:0)

事实证明我错过了退出一些代码来完成这项工作。首先,我需要为slack添加用户模式。第二个需要添加一个函数来创建用户并将其保存到我的数据库和一个函数来检查用户是否已经使用slack登录并只是比较ID而不是将用户的新实例创建到数据库。还需要更新序列化用户和反序列化用户。

这是我的架构

let mongoose = require("mongoose"),
    passportLocalMongoose = require("passport-local-mongoose");

let UserSchema = new mongoose.Schema({
  local: {
    name: String,
    username: String,
    password: String
  },
  slack: {
    username: String,
    slackid: Number,
    name: String
  }
});

UserSchema.plugin(passportLocalMongoose);

module.exports = mongoose.model("User", UserSchema);

而不是护照策略的设置。

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

passport.deserializeUser((id, done) => {
  User.findById(id).then((user) => {
    done(null, user.id);
  });
});

passport.use(new LocalStrategy(User.authenticate()));

// Configure the Slack Strategy
passport.use(
  new SlackStrategy({
    callbackURL: "/auth/slack/redirect",
    clientID: keys.slack.clientID,
    clientSecret: keys.slack.clientSecret
}, (accessToken, refreshToken, profile, done) => {
    console.log(profile);
    // Check if user already exist in DB
    User.findOne({username: profile.displayName}).then((currentUser) => {
      if(currentUser){
        // already have the user
        console.log('User is', currentUser);
        done(null, currentUser);
      } else {
        // If not, create new user in DB
        new User({
          username: profile.displayName,
          slackid: profile.id
        }).save().then((newUser) => {
          console.log("new user created: " + newUser);
          done(null, newUser);
        });
      }
    });
  })); 

还需要更新身份验证的路由并回拨。

app.post('/auth/slack',
    passport.authenticate('Slack', {
      scope:['identity.basic'],
  }));

// OAuth callback url
app.get('/auth/slack/redirect', passport.authenticate('Slack'), (req, res) => {
      res.redirect("/QAApplicationHub");
    });

希望这有助于其他需要passport.js帮助的人。有关详细信息,我建议在YT上查找The Net Ninja。他帮助我解决了我的代码差距,并帮助了解实际情况。