跳到文章正文
Grok 实用教程

Grok语音网页怎么避免泄露API密钥?临时token与WebSocket认证

使用服务端client_secrets为浏览器申请短期凭据,按官方子协议连接语音WebSocke…

把长期xAI API密钥写在网页JavaScript里,访问者可以查看它。官方语音接口提供ephemeral token,由自己的服务器申请,再让浏览器用短期凭据连接。本文只说明认证流程,不重复实时语音事件或音频格式教程,也不实际创建token。

Grok语音网页怎么避免泄露API密钥?临时token与WebSocket认证
Grok语音网页怎么避免泄露API密钥?临时token与WebSocket认证

第一步:划分三种身份

长期API密钥只保留在服务端;用户登录决定谁能向自己的后端申请凭据;临时token用于客户端连接xAI。临时凭据不代替应用用户认证,也不是可以公开分享的无害字符串。

先准备开发者API访问和受控后端,确认能限制调用者及签发次数。不要把官方最小示例原样部署为任何人都可无限申请的公开接口,否则即使长期密钥不在前端,也可能被滥用额度。

第二步:在服务器申请client secret

官方入口为POST /v1/realtime/client_secrets,示例expires_after.seconds设300;这个数是示例有效期,不代表所有业务都应固定采用。官方明确不支持session与expires_after.anchor字段,不要照搬其他接口形状。

import os
import requests
r = requests.post(
    "https://api.x.ai/v1/realtime/client_secrets",
    headers={"Authorization": "Bearer " + os.environ["XAI_API_KEY"]},
    json={"expires_after": {"seconds": 300}}, timeout=30,
)
r.raise_for_status()
secret_response = r.json()
# 在已认证的后端流程中处理,不打印或写入公开日志。

第三步:只向已授权客户端返回必要凭据

后端应核对登录、业务权限和速率,再按当前响应结构提取临时凭据。不要让浏览器自由提交一个超长有效期;签发策略由服务端控制。使用加密连接,并避免把token放入网址查询参数或长期本地存储。

网络失败时不要把长期密钥作为备用返回。记录签发成功与失败状态即可,不需要把完整token写入分析平台。前端报错信息也应过滤认证内容,截图和调试分享前再次检查。

第四步:浏览器按子协议认证

浏览器WebSocket不能像服务端库一样任意设置Authorization头。官方支持以xai-client-secret.加临时token作为子协议。下面变量必须来自已认证后端的真实短期凭据,不能填长期密钥。

const ws = new WebSocket(
  "wss://api.x.ai/v1/realtime",
  [`xai-client-secret.${ephemeralToken}`]
);

第五步:处理过期和重连

连接失败先区分临时凭据过期、网络错误和语音会话配置问题。重连应走受限的签发流程,不能无限向后端获取新token。凭据到期不代表应用用户退出登录,也不能未经官方说明推断现有长连接会在某秒自动终止。

语音权限、音频编码和会话事件属于后续独立验收。WebSocket握手成功只能说明连接认证通过,不代表麦克风、播放或模型回答已经正常。先分别验证,避免将所有故障归咎于token。

第六步:按证据检查泄露边界

检查前端包、网页源代码、网络日志和错误报告中没有长期密钥;确认未登录访问签发端点会被拒绝,超频请求受限,错误不会返回凭据。测试应在自己受控环境进行,不使用真实用户语音。

保存不含秘密的验收记录:签发条件、有效期策略、连接阶段、失败类型与重试上限。完成标准是长期凭据留在服务器、临时访问受控、日志可排查且不泄密,不能仅凭网页没有明文变量就宣布安全。

官方资料

资料核对日期:2026年11月14日。

本文地址:https://www.163264.com/21087