Twilio错误20154:无效令牌声明(可编程视频场景)
我之前也踩过Twilio可编程视频这个20154错误的坑,结合你贴的代码,给你几个实用的排查方向:
确认房间标识完全匹配:你在
$videoGrant->setRoom($slot_id)里传的$slot_id,必须和服务器端创建房间时用的**唯一名称(uniqueName)**或者房间SID完全一致。如果创建房间时指定了uniqueName,这里就传这个名称;如果没指定,就用返回的房间SID。可以去Twilio控制台的「视频房间」列表里核对这个值,哪怕少个字母、大小写不对都会触发错误。检查Identity格式合法性:传入AccessToken的
$user_id(也就是Identity字段),Twilio要求只能包含字母、数字、下划线、连字符和点号,不能有空格、特殊符号或者非ASCII字符。如果Identity格式不符合要求,令牌的声明会直接无效。验证API Key的归属与权限:确保你使用的
TWILIO_API_KEY和TWILIO_API_SECRET属于当前操作的Twilio账号,并且这个API Key没有被限制视频服务权限(默认是开启的,但可以去控制台的「API Keys」页面确认权限设置)。解析JWT直接排查声明问题:生成令牌后,把
$token->toJWT()输出的字符串复制到JWT解析工具(可以用本地工具或安全的在线解析器,注意不要泄露你的API密钥),查看里面的video.grant.room字段是否正确,同时检查exp(过期时间)、iss(API Key)、sub(Account SID)这些核心声明是否和预期一致。很多时候,这里能直接定位到问题所在。
针对你的代码,也可以加个小调试步骤辅助排查:
$token = new AccessToken( $this->TWILIO_ACCOUNT_SID, $this->TWILIO_API_KEY, $this->TWILIO_API_SECRET, 3600, $user_id ); $videoGrant = new VideoGrant(); // 再次确认$slot_id是房间的正确标识 $videoGrant->setRoom($slot_id); $token->addGrant($videoGrant); // 打印JWT用于解析排查 $jwt = $token->toJWT(); echo $jwt;
如果还是有问题,可以再检查创建房间的代码,确保房间确实成功创建并且状态是可用的(比如不是已关闭的状态)。
内容的提问来源于stack exchange,提问作者ripul kumar

