You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node/Socket应用中验证Laravel Passport API Token?

刚好我之前做过类似的场景,Laravel Passport Token在Node.js Socket.io环境下实现认证完全可行,我给你详细拆解下:

Laravel Passport Token 解析与Node.js验证指南

一、Token的构成与包含字段

Laravel Passport默认生成的是JWT格式的Token(不管是密码授权、授权码授权还是个人访问令牌),它分成三个部分:

  • Header:用Base64编码的JSON,里面主要存加密算法(默认是RS256非对称加密)和Token类型(JWT)
  • Payload:这是核心的用户数据部分,同样是Base64编码的JSON,默认包含这些字段:
    • sub:用户的ID(对应你Laravel User模型里的id字段)
    • name:用户名称(如果你的User模型有这个字段的话)
    • email:用户的邮箱地址
    • exp:Token的过期时间戳
    • iat:Token的签发时间戳
    • jti:Token的唯一标识符,用来防止重复使用
      另外,如果你在User模型里重写了getJWTCustomClaims方法,或者在生成Token时添加了自定义声明,这些额外字段也会出现在Payload里。

二、Node端验证需要的密钥

Passport默认用的是RS256非对称加密,这意味着验证Token只需要Laravel端的公钥就够了:

  1. 在Laravel项目的storage/oauth-public.key文件里就是这个公钥,你可以把它复制到Node项目的某个目录(比如config/keys)
  2. 划重点:绝对不要把Laravel的私钥(oauth-private.key)给到Node服务,私钥只在Laravel端用来签发Token,Node端只需要公钥验证签名和有效性就行,这样更安全。

如果你之前把Passport改成了对称加密(比如HS256),那就要用Laravel .env里的APP_KEY来验证,但真心不推荐这种方式,非对称加密的安全性高太多。

三、Node.js Socket.io里的验证实现步骤

  1. 先装依赖:用jsonwebtoken库来解析和验证JWT,执行安装命令:
    npm install jsonwebtoken
    
  2. 加载公钥:在Node服务里读取你复制过来的公钥:
    const fs = require('fs');
    const jwt = require('jsonwebtoken');
    // 路径根据你放公钥的位置调整
    const publicKey = fs.readFileSync('./config/keys/oauth-public.key', 'utf8');
    
  3. 添加Socket.io中间件:在客户端建立Socket连接之前,先验证Token:
    io.use((socket, next) => {
      // 从客户端的请求里拿Token,一般是通过query参数或者请求头传过来
      // 比如客户端可能会在连接时带?token=xxx,或者在headers里放Authorization: Bearer xxx
      const token = socket.handshake.query.token || socket.handshake.headers['authorization']?.split(' ')[1];
      
      if (!token) {
        return next(new Error('认证失败:未提供Token'));
      }
      
      // 验证Token的签名和有效性
      jwt.verify(token, publicKey, { algorithms: ['RS256'] }, (err, decoded) => {
        if (err) {
          return next(new Error('认证失败:无效的Token'));
        }
        // 把解码后的用户信息挂到socket对象上,后面的事件里就能直接用了
        socket.user = decoded;
        next();
      });
    });
    
  4. 使用验证后的用户信息:在后续的Socket事件处理里,就可以直接访问socket.user获取用户的ID、邮箱等信息:
    io.on('connection', (socket) => {
      console.log(`用户 ${socket.user.sub} 已连接`);
      
      socket.on('send-message', (data) => {
        // 这里还可以用socket.user做权限判断,比如只允许特定用户发送消息
        io.emit('receive-message', { username: socket.user.name, content: data.message });
      });
    });
    

四、一些要注意的细节

  • 确保Laravel服务器和Node服务器的时间同步,因为JWT的过期验证是靠时间戳的,如果两台服务器时间差太大,可能会出现Token提前失效或者过期了还能验证通过的情况
  • 如果你用的是Passport的个人访问令牌,验证方式和上面完全一样,它本质也是JWT
  • 要是Laravel端重新生成了Passport密钥(比如执行php artisan passport:install),记得同步更新Node端的公钥,不然会验证失败

内容的提问来源于stack exchange,提问作者Canor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:56:40