ConnectyCube用户会话令牌创建异常:"Unexpected Signature"错误排查
问题原因分析
核心问题在于生成用户会话签名时,签名字符串未包含用户登录的核心参数(email/password),且未按要求对参数进行排序。
ConnectyCube的签名验证规则要求:所有参与请求的核心参数都必须加入签名字符串,并且参数需要按参数名的字母顺序排序后再进行HMAC-SHA1加密。创建App Session时仅需基础的App参数,但创建User Session时,用户的登录凭证(email/password)也是签名必须覆盖的参数。
解决方案
修改签名生成函数,使其支持传入用户参数,并按规则排序所有参数:
const getSignature = (user = null) => { const nonce = Math.floor(Math.random() * 1000000); const timestamp = Math.floor(Date.now() / 1000); // 初始化基础参数 let params = { application_id: config.applicationId, auth_key: config.authKey, nonce: nonce, timestamp: timestamp }; // 如果是用户登录场景,添加用户参数 if (user) { Object.assign(params, user); } // 按参数名字母顺序排序(关键步骤) const sortedParamKeys = Object.keys(params).sort(); const stringForSignature = sortedParamKeys.map(key => `${key}=${params[key]}`).join('&'); const signature = crypto.createHmac('sha1', config.authSecret).update(stringForSignature).digest('hex'); return { signature, timestamp, nonce }; }
然后调整用户会话创建函数,传入用户凭证到签名生成逻辑:
const createSessionWithLogin = async (emailAddress, password) => { // 传入email和password用于生成正确签名 const signature = getSignature({ email: emailAddress, password: password }); return await axios.post( 'https://api.connectycube.com/session', { application_id: config.applicationId, auth_key: config.authKey, nonce: signature.nonce, timestamp: signature.timestamp, signature: signature.signature, user: { email: emailAddress, password: password } }, { headers: { 'Content-Type': 'application/json' } } ); }
额外排查建议
- 参数一致性检查:确保签名中使用的email/password与请求体
user对象中的值完全一致,无大小写、空格或编码差异。 - 时间戳有效性:确认timestamp是秒级Unix时间戳,且与ConnectyCube服务器时间差不超过5分钟(可通过调用服务器时间接口校准)。
- 参数排序验证:手动打印生成的
stringForSignature,确认参数是按字母顺序排列的(例如application_id=xxx&auth_key=xxx&email=xxx&nonce=xxx&password=xxx×tamp=xxx)。 - 签名算法匹配:确认使用的是HMAC-SHA1算法,且authSecret与ConnectyCube控制台中的值完全一致。
内容的提问来源于stack exchange,提问作者actuallynoneed
相关产品推荐
相关产品推荐

