使用Passport了解sailsJs中的会话

时间:2017-01-08 18:26:03

标签: sails.js passport.js

当我想从用户模型中获取信息时,我遇到了很多问题。我读了一些解决方案,但我不明白。

这是我的代码: * AuthController

var passport = require('passport');

module.exports = {

      _config: {
        actions: false,
        shortcuts: false,
        rest: false
    },

    login: function(req, res) {
        passport.authenticate('local', function(err, user, info) {
            if ((err) || (!user)) {
                return res.send({
                    message: info.message,
                    user: user
                });
            }
            req.logIn(user, function(err) {
                if (err) res.send(err);
                return res.send({
                    message: info.message,
                    user: user
                });
            });

        })(req, res);
    },

    logout: function(req, res) {
        req.logout();
        res.redirect('/');
    },

    signup: function (req, res) {
        var data = req.allParams();
        User.create({email:data.email,password:data.password,name:data.name}).exec(function(error,user){
            if(error) return res.negotiate(err);
            if(!user)return res.negotiate(err);
            return res.ok();
        });
    }   
};

*view
<h1>List of my dates</h1>
<h1><%= email %></h1>
<h1><%= req.user.name %></h1>

*model
attributes: {
   email: {
        type: 'email',
        required: true,
        unique: true
    },

    password: {
        type: 'string',
        minLength: 6,
        required: true
    },
    toJSON: function() {
        var obj = this.toObject();
        delete obj.password;
        return obj;
    }
},
    beforeCreate: function(user, cb) {
        bcrypt.genSalt(10, function(err, salt) {
            bcrypt.hash(user.password, salt, function(err, hash) {
                if (err) {
                    console.log(err);
                    cb(err);
                } else {
                    user.password = hash;
                    cb();
                }
            });
        });
    }
};

仅在我使用res.render('view',{email:req.user.email})时才有效,但是,我想在许多视图中使用用户数据。我不能用当前用户参数编写方法,因为不行。

感谢。

1 个答案:

答案 0 :(得分:0)

我不清楚你的实际问题是什么或问题究竟是什么,但我会尽力帮助。

看这里:

login: function(req, res) {
  passport.authenticate('local', function(err, user, info) {
    if ((err) || (!user)) {
      return res.send({
        message: info.message,
        user: user
      });
    }
    ...
  })(req, res);
},

您正在向ejs添加数据(本地人),值为messageuser,因此在ejs中您必须像这样引用它,因此您将使用user.name和不是req.user.name?我不确定你为什么要绑定(req, res)

令人困惑的是因为你的ejs使用的是电子邮件价值,但我不认为它是一个本地的,所以也许这就是你的问题,必须定义它?

考虑以下简单示例:

// User Controller

// GET request /signin
// The signin form
signin(req, res) {
  // Load the view from app/views/*
  return res.view('signin', {
    title: 'Sign In'
  });
},

// POST request to /signin
// This was posted from the signin form
// Use io.socket.post(...) to do this from the signin form
// Can use window.location.replace('/account') on successful request
authenticate(req, res) {
  // The data posted, email and password attempt
  var data = req.allParams();
  // Does it match?
  User.findOne({
    email: data.email,
    // This is stupid, don't ever use plain text passwords
    password: data.password
  })
  .exec(function(err, user) {
    // Server related error?
    if (err) res.serverError(err.message);
    // No user was found
    if (!user) res.badRequest('Username or password not found');
    // Sign the user in
    req.session.userId = user.id;
    // User was found
    res.ok();
  });
},

// GET request to /account
// Displays the users information
// Can use policies to ensure that only an authenticated user may access their own account information
account(req, res) {
  // If the user is not signed in
  // This is an alternative to using the sails policy isLoggedIn
  if (!req.session.userId) res.redirect('/signin');
  // Get the users details
  User.findOne({
    id: req.session.userId
  })
  .exec(function(err, user) {
    // Server related error?
    if (err) res.serverError(err.message);
    // No user was found
    if (!user) res.redirect('/signin');
    // Load the ejs file that displays the users information
    return res.view('account/index', {
      title: 'Account Information',
      user: user
    });
  });
},

// Account View

<p>Email: {{user.email}}</p>
<p>Password: {{user.password}}</p>

如果您要处理密码加密,请检查一下:http://node-machine.org/machinepack-passwords

如果您想要处理力量测试(当用户设置密码时):https://www.npmjs.com/package/owasp-password-strength-test

如果您只进行本地身份验证,这护照似乎有点过分了吗?