Quickblox SDK调用GetBaseSession()报nonce is required错误如何解决?
错误根因
nonce is required是Quickblox服务端身份校验环节返回的错误,你遇到的突然报错是因为近期Quickblox后端升级了校验规则,不再兼容旧版Xamarin SDK内置的nonce自动生成逻辑,之前的兼容期结束后就会强制校验该参数。
可落地修复方案
- 方案一:通过反射注入nonce参数(改动最小,优先使用)
旧版Quickblox Xamarin SDK的请求参数默认存在私有字段里,你可以在调用GetBaseSession()之前手动生成符合要求的nonce,通过反射注入到请求参数中,参考代码:
// 生成6位随机正整数作为nonce,保证1小时内不重复即可 string nonce = new Random().Next(100000, 9999999).ToString(); // 反射获取QbProvider内部的请求参数字典 Type qbProviderType = typeof(Provider.QbProvider); System.Reflection.FieldInfo requestParamsField = qbProviderType.GetField("_requestParams", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (requestParamsField != null) { Dictionary<string, string> reqParams = requestParamsField.GetValue(Provider.QbProvider.Instance) as Dictionary<string, string>; reqParams["nonce"] = nonce; } // 调用原有获取会话逻辑 var baseSesionResult = await Provider.QbProvider.GetBaseSession();
- 方案二:自主实现BaseSession获取逻辑
如果反射操作被限制,可以绕过SDK自带的会话获取方法,自行构造HTTP请求调用Quickblox的会话创建接口,拿到合法会话后手动注入到SDK的全局上下文即可:- 构造请求参数:必须包含
application_id、auth_key、timestamp(UTC时间戳,误差不超过10分钟)、nonce、signature - 按照规则生成signature后发起POST请求
- 把返回的session信息赋值给SDK的
QbProvider.CurrentSession静态属性,后续所有SDK功能都可以正常使用
- 构造请求参数:必须包含
注意事项
- nonce要求为1-32位的正整数,同一个应用ID下1小时内不能重复
- 生成时间戳必须使用UTC时间,否则会连带触发timestamp校验失败
内容的提问来源于stack exchange,提问作者Divyesh
相关产品推荐
相关产品推荐

