Nodejs 用户登录,下次登录自动登录 cookies方案,socket.io 如何写?需要什么包 小白求教

Nodejs 用户登录,下次登录自动登录 cookies方案,socket.io 如何写?需要什么包 小白求教

4 回复

当然可以。针对你的问题,我们可以设计一个简单的用户登录系统,该系统使用Cookie来实现自动登录功能,并通过Socket.IO进行实时通信。以下是详细的步骤和代码示例。

所需的包

首先,你需要安装以下包:

  • express:用于创建服务器。
  • cookie-parser:用于解析HTTP请求中的Cookie。
  • bcryptjs:用于密码加密。
  • jsonwebtoken:用于生成和验证JWT(JSON Web Token)。
  • socket.io:用于实现实时通信。

你可以使用npm来安装这些包:

npm install express cookie-parser bcryptjs jsonwebtoken socket.io

示例代码

1. 设置Express服务器

首先,我们需要设置一个基本的Express服务器:

const express = require('express');
const cookieParser = require('cookie-parser');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');

const app = express();
app.use(express.json());
app.use(cookieParser());

// 假设这是你的用户数据库
const users = [
    { id: 1, username: 'test', password: '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi' } // 使用bcryptjs生成的哈希密码
];

// 登录API
app.post('/login', (req, res) => {
    const { username, password } = req.body;
    const user = users.find(u => u.username === username);

    if (user && bcrypt.compareSync(password, user.password)) {
        const token = jwt.sign({ id: user.id }, 'your_secret_key', { expiresIn: '1h' });
        res.cookie('auth_token', token, { httpOnly: true, maxAge: 3600000 }); // Cookie有效期为1小时
        res.send({ message: 'Logged in successfully' });
    } else {
        res.status(400).send({ message: 'Invalid credentials' });
    }
});

// 启动服务器
app.listen(3000, () => console.log('Server started on port 3000'));

2. 使用Socket.IO

接下来,我们添加Socket.IO支持以实现实时通信:

const http = require('http').createServer(app);
const io = require('socket.io')(http, {
    cors: {
        origin: "*",
        methods: ["GET", "POST"]
    }
});

io.on('connection', (socket) => {
    console.log('a user connected');
    
    socket.on('disconnect', () => {
        console.log('user disconnected');
    });

    socket.on('chat message', (msg) => {
        io.emit('chat message', msg); // 广播消息给所有连接的客户端
    });
});

http.listen(3000, () => {
    console.log('listening on *:3000');
});

总结

以上代码展示了一个简单的用户登录系统,使用了Cookie来存储JWT,并通过Socket.IO实现了基本的聊天功能。你可以根据具体需求进一步扩展和完善这个系统。希望这对你有所帮助!


这个和 socket.io 没关系吧。

POST 是 HTTP protocol。websocket里没有POST。 http://tools.ietf.org/html/rfc6455

为了实现用户登录后下次登录时自动登录的功能,并使用 socket.io 进行实时通信,你可以采用 cookiesexpress-session 来管理会话。以下是如何配置这些组件并实现上述功能的步骤。

需要安装的包

  1. express: Web 应用框架。
  2. cookie-parser: 解析 HTTP 请求中的 cookies。
  3. express-session: 用于管理会话。
  4. socket.io: 实现实时通信。
npm install express cookie-parser express-session socket.io

示例代码

Express Server Setup

const express = require('express');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const app = express();
const http = require('http').createServer(app);
const io = require('socket.io')(http);

app.use(cookieParser());
app.use(session({
    secret: 'your_secret_key', // 用于加密 cookie 的密钥
    resave: false,
    saveUninitialized: true,
    cookie: { secure: false } // 设置为 true 如果你正在使用 HTTPS
}));

// 登录路由
app.post('/login', (req, res) => {
    const { username, password } = req.body;
    // 这里应该有一个验证逻辑来检查用户名和密码是否正确
    if (username === 'test' && password === 'password') {
        req.session.username = username; // 存储会话信息
        res.cookie('remember_me', 'true', { maxAge: 900000, httpOnly: true });
        res.send('Logged in successfully!');
    } else {
        res.status(401).send('Invalid credentials');
    }
});

// 检查登录状态的中间件
function isLoggedIn(req, res, next) {
    if (req.session.username) {
        next();
    } else {
        res.redirect('/login');
    }
}

io.use((socket, next) => {
    const cookie = socket.request.headers.cookie;
    cookieParser()(socket.request, {}, () => {});
    const sess = socket.request.session;
    if (sess && sess.username) {
        next();
    } else {
        next(new Error('Authentication error'));
    }
});

// 实现 socket.io 通信逻辑
io.on('connection', (socket) => {
    console.log('a user connected');
    socket.emit('welcome', `Welcome ${socket.request.session.username}`);
    socket.on('disconnect', () => {
        console.log('user disconnected');
    });
});

http.listen(3000, () => {
    console.log('listening on *:3000');
});

客户端示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Socket.IO Chat</title>
</head>
<body>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        var socket = io();
        socket.on('welcome', function(msg) {
            alert(msg);
        });
    </script>
</body>
</html>

以上代码展示了如何设置一个基本的 Express 应用来处理用户登录请求,并通过 express-session 管理会话。同时,使用 socket.io 实现了客户端与服务器之间的实时通信,确保只有已登录的用户可以连接到 socket.io 服务器。

回到顶部