【问题标题】:sending cookie to browser发送cookie到浏览器
【发布时间】:2015-07-24 22:39:02
【问题描述】:

我已经使用 angular-passport 中的文件结构和编码实践在现有项目中实现了一个使用 angular、express 和 passport.js 的简单登录系统。

目前,我成功注册并登录了用户。但是,当我刷新页面时,用户会注销。我知道我需要在浏览器上存储一个 cookie 才能让它工作,而且我也知道如何在代码中实现它。我的问题是放在哪里。

在我的routes.js 我有以下内容:

var express = require('express'),
    auth = require('./auth');
var router = express.Router();


var tools = require('../controllers/tools');
router.get('/api/tools/category/:name', tools.category);
router.get('/api/tools/:id', tools.show);
router.get('/api/tools', tools.all);
router.post('/api/tools', tools.create);
// router.get('api/search/:term', tools.search);

var users = require('../controllers/users');
router.get('/api/users/:id', users.show);
router.get('/api/users', users.all);
router.post('/api/users', users.create);

// Session Routes
var session = require('../controllers/session');
router.get('/api/session', auth.ensureAuthenticated, session.session);
router.post('/api/session', session.login);
router.delete('/api/session', session.logout);

module.exports = router;

在 angular-passport repo 中,作者在文件末尾添加了另一条路线:

router.get('/*', function(req, res) {
    if(req.user) {
        res.cookie('user', JSON.stringify(req.user.user_info));
    }

    res.render('index.html');
});

但是,当我将它放入我的代码中时,这个函数永远不会被调用,因为它已经使用了之前声明的其他路由之一。有人可以帮忙吗?

【问题讨论】:

    标签: javascript node.js express passport.js


    【解决方案1】:

    更改路线的第一行:

    app.get('/*', function(req, res) {
    

    到这里:

    router.get('/*', function(req, res) {
    

    您的代码永远无法运行,因为 nodejs 不知道 app 是什么。你从来没有定义过它。

    更新:

    更改您的服务器代码以自动发送会话 cookie 并设置过期时间:

    // express/mongo session storage
    app.use(express.session({
      secret: 'MEAN',
      store: new mongoStore({
        url: config.db,
        collection: 'sessions'
      }),
      cookie: { maxAge : 3600000 } //1 Hour <-----------
    }));
    

    或者更改passport.authenticate函数直接发送带有过期时间的cookie。

    https://github.com/DaftMonk/angular-passport/blob/master/lib/controllers/session.js

    exports.login = function (req, res, next) {
      passport.authenticate('local', function(err, user, info) {
        var error = err || info;
        if (error) { return res.json(400, error); }
        req.logIn(user, function(err) {
          if (err) { return res.send(err); }
          res.cookie('user', JSON.stringify(req.user.user_info), { expires: new Date(Date.now() + 1000 * 60 * hrs)} ); // <--
          return res.send(200); // <--
        });
      })(req, res, next);
    }
    

    【讨论】:

    • 但这不会阻塞其余的路线吗?不是所有东西都简单地进入这个代码块吗? app.get 只是问题中的一个错字 - 抱歉。
    • 你不使用中间件是我的错误。如果您尝试router.get('*', function(req, res) { 并转到yourdomain.com/somenotroutedlink 是否有效?
    • 在哪里?在中间件之外?
    • 如果您转到yourdomain.com/somenotroutedlink,“index.html”正在呈现?
    • 就是这样,角度路由器正在处理路由这些请求,我在这里展示的是一个 API。 res.render('index.html'); 代码取自 angular-passport 存储库,但我认为我不需要它。我只是想用一个 cookie 来响应。
    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2019-03-28
    • 2019-04-17
    相关资源
    最近更新 更多