开发Nodejs程序,遇到用户识别难题

开发Nodejs程序,遇到用户识别难题

我有一个论坛社区php网站,打算在里面加入一个web game,游戏逻辑和实时传输是由nodeJs来运行。

但是我遇到了一个大问题,我要怎么做才能让nodeJs知道现在点进来玩游戏的人是论坛哪个ID的用户?nodeJS貌似不能去读取php网站生成的登录cookies。如果我让游戏客户端页面传输用户ID给nodeJS的话,我怕有人会不会自己弄一个页面就可以随便传输ID给nodeJS来登录游戏了。

5 回复

开发Node.js程序时遇到用户识别难题

背景介绍

你有一个PHP论坛社区网站,并计划在其内部添加一个Web游戏。游戏的逻辑和实时数据传输将通过Node.js实现。然而,你面临了一个关键挑战:如何确保Node.js能够识别当前访问游戏页面的是哪个论坛用户,同时防止用户伪造身份。

解决方案

为了解决这个问题,可以采用一种基于JWT(JSON Web Tokens)的认证机制。JWT是一种开放标准(RFC 7519),用于在网络应用环境间安全地将信息作为JSON对象传输。通过这种方式,你可以确保用户的身份信息被加密并安全地传递给Node.js服务端。

步骤1: 在PHP中生成JWT Token

首先,在PHP中生成一个JWT Token,并将其存储在用户的Session或Cookies中。这里使用firebase/php-jwt库来创建Token。

composer require firebase/php-jwt
use \Firebase\JWT\JWT;

$token = array(
    "iat" => time(), // Issued at: 当前的时间
    "exp" => time() + (3600 * 24), // 过期时间:1天后
    "sub" => $userId, // 用户ID
);

$key = "your_secret_key"; // 秘钥
$jwt = JWT::encode($token, $key); // 生成JWT Token

// 将Token存储在Cookie中
setcookie("jwt", $jwt, time() + (3600 * 24), "/");
步骤2: 在Node.js中验证JWT Token

接下来,在Node.js中接收并验证这个Token。这里使用jsonwebtoken库来处理JWT。

npm install jsonwebtoken
const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();

app.use(express.json());

app.post('/game', (req, res) => {
    const token = req.headers['authorization'];
    
    if (!token) return res.status(401).send({ message: 'No token provided.' });

    jwt.verify(token, "your_secret_key", (err, decoded) => {
        if (err) return res.status(500).send({ message: 'Failed to authenticate token.' });
        
        console.log(decoded.sub); // 输出用户ID
        res.send({ message: 'Authentication successful.', userId: decoded.sub });
    });
});

app.listen(3000, () => console.log('Server running on port 3000'));

总结

通过使用JWT,你可以在PHP中生成一个包含用户ID的Token,并将其安全地传递给Node.js。Node.js接收到Token后,可以通过解码并验证Token来确认用户身份。这样不仅保证了安全性,还避免了用户伪造身份的问题。


npm install cookie https://npmjs.org/package/cookie 如果node部署的域名一样,直接用cookies验证吧.

放置nodeJS的主机可能和论坛的主机不同,那怎么办

看看openId 或 oauth ,也许能得到解决思路和帮助

为了实现从PHP网站到Node.js服务器的用户身份验证,可以采用以下几种方法:

  1. 使用共享会话存储:让Node.js与PHP共享同一个会话存储机制,这样可以在Node.js中读取PHP设置的会话数据。

  2. OAuth认证:创建一个中间层,比如OAuth服务,提供一个API端点,通过该端点验证用户身份,并返回一个访问令牌。游戏客户端页面可以调用这个API获取令牌,然后将令牌传递给Node.js服务器。

  3. JWT (JSON Web Token): 用户在PHP网站上登录后,可以生成一个JWT,其中包含用户的ID等信息。游戏客户端页面加载时,可以从PHP站点获取这个JWT,并将其传递给Node.js服务器。Node.js服务器解码JWT并验证其有效性。

下面是使用JWT的方法的代码示例:

PHP侧(生成JWT)

// 使用一个库如 firebase/php-jwt 来生成 JWT
require 'vendor/autoload.php';
use Firebase\JWT\JWT;

$token = array(
    "userId" => $forum_user_id,
    "exp" => time() + (60 * 60) // 有效期一小时
);

$jwt = JWT::encode($token, 'your_secret_key', 'HS256');
echo $jwt;

Node.js侧(验证JWT)

const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();

app.use(express.json());

app.post('/game', (req, res) => {
    const token = req.body.token;

    if (!token) return res.status(401).send({ message: 'No token provided.' });

    jwt.verify(token, 'your_secret_key', (err, decoded) => {
        if (err) {
            return res.status(500).send({ message: 'Failed to authenticate token.' });
        } else {
            console.log("Decoded:", decoded);
            res.send({ message: 'Token is valid.', userId: decoded.userId });
        }
    });
});

app.listen(3000, () => {
    console.log('Server running on port 3000');
});

游戏客户端页面

<!-- 这里假设你已经有一个PHP API用于获取JWT -->
<script>
fetch('https://your-php-site.com/get-token')
    .then(response => response.json())
    .then(data => {
        fetch('http://localhost:3000/game', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({ token: data })
        }).then(response => response.json())
          .then(gameData => console.log(gameData));
    });
</script>

以上代码示例展示了如何在PHP和Node.js之间安全地传递用户身份信息。关键在于确保JWT的安全性,并且不要将私钥泄露给前端。

回到顶部