socket.io的用户认证

一直专心于写代码,遇到问题便看别人的博客来解决问题,突然感觉自己也应该写点东西帮助别人来解决问题。废话不多说了,直接切入正题~

最近在写一个聊天室来学习node和socket相关知识。遇到的问题描述:ajax请求可以通过express-session来parse出目前用户,但socket请求我也想验证是否是登录用户,这个怎么做呢?

这个问题我在网上查了很多资料,大多都写的非常复杂,后来经自己实践,其实只需要给io加一个跟express用的中间件一样就可以了,能parse出来完全一样的user。一行代码胜过千言万语。附上两个middleware的代码(路径自行调整):

本例使用mongodb存储session, 使用到了connect-mongodb-session插件。

1. ajax用的中间件

var session = require('express-session');
var MongoDBStore = require('connect-mongodb-session')(session);
var dbSettings = require('../db/settings');

module.exports = session({
    secret: dbSettings.COOKIE_SECRET,
    cookie: {
        maxAge: 1000 * 60 * 60 * 24 * 7 // 1 week
    },
    store: new MongoDBStore({
        uri: `mongodb://${dbSettings.HOST}:${dbSettings.PORT}/${dbSettings.DB}`,
        collection: 'mySessions'
    }),
    // Boilerplate options, see:
    // * https://www.npmjs.com/package/express-session#resave
    // * https://www.npmjs.com/package/express-session#saveuninitialized
    resave: true,
    saveUninitialized: true
});

引用该中间件方式(细节请自行补充):

var app = express();
var sessionMiddleware = require('./middleware/sessionMiddleware');
app.use(sessionMiddleware);

2. io用的中间件

var sessionMiddleware = require('./sessionMiddleware');

module.exports = function(socket, next) {
    sessionMiddleware(socket.handshake, {}, next);
};

引用该中间件方式:

var socketIO = require('socket.io');
var ioSessionMiddleware = require('../middleware/ioSessionMiddleware');

var ioServer = socketIO(server);
ioServer.use(ioSessionMiddleware);

ioServer.on('connection', function(socket) {
     let session = socket.handshake.session;
}
原文地址:https://www.cnblogs.com/asie-huang/p/6611209.html