修改sign。

键盘里ai回复的bug
This commit is contained in:
2026-02-24 14:59:06 +08:00
parent 0ac47925fd
commit 5edf1751ff
6 changed files with 104 additions and 95 deletions

View File

@@ -41,38 +41,10 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
} }
- (void)getSignWithParare:(NSDictionary *)bodyParams{ - (void)getSignWithParare:(NSDictionary *)bodyParams{
NSDictionary<NSString *, NSString *> *signHeaders = [KBSignUtils signHeadersWithBodyParams:bodyParams];
NSString *appId = @"loveKeyboard";
NSString *secret = @"kZJM39HYvhxwbJkG1fmquQRVkQiLAh2H"; //
NSString *timestamp = [KBSignUtils currentTimestamp];
NSString *nonce = [KBSignUtils generateNonceWithLength:16];
// 1.
NSMutableDictionary<NSString *, NSString *> *signParams = [NSMutableDictionary dictionary];
signParams[@"appId"] = appId;
signParams[@"timestamp"] = timestamp;
signParams[@"nonce"] = nonce;
// body
[bodyParams enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
if ([obj isKindOfClass:[NSString class]]) {
signParams[key] = obj;
} else {
signParams[key] = [obj description];
}
}];
NSString *sign = [KBSignUtils signWithParams:signParams secret:secret];
//
NSMutableDictionary<NSString *, NSString *> *headers = NSMutableDictionary<NSString *, NSString *> *headers =
[self.defaultHeaders mutableCopy] ?: [NSMutableDictionary dictionary]; [self.defaultHeaders mutableCopy] ?: [NSMutableDictionary dictionary];
[headers addEntriesFromDictionary:signHeaders ?: @{}];
if (sign.length > 0) {
headers[@"X-Sign"] = sign;
}
headers[@"X-App-Id"] = appId;
headers[@"X-Timestamp"] = timestamp;
headers[@"X-Nonce"] = nonce;
// copy
self.defaultHeaders = headers; self.defaultHeaders = headers;
} }

View File

@@ -19,6 +19,7 @@
#import "KBHostAppLauncher.h" #import "KBHostAppLauncher.h"
#import "KBInputBufferManager.h" #import "KBInputBufferManager.h"
#import "KBResponderUtils.h" // UIInputViewController #import "KBResponderUtils.h" // UIInputViewController
#import "KBSignUtils.h"
#import "KBSkinManager.h" #import "KBSkinManager.h"
#import "KBStreamOverlayView.h" // #import "KBStreamOverlayView.h" //
#import "KBStreamTextView.h" // #import "KBStreamTextView.h" //
@@ -435,11 +436,32 @@
cachePolicy:NSURLRequestReloadIgnoringCacheData cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:60]; timeoutInterval:60];
request.HTTPMethod = @"POST"; request.HTTPMethod = @"POST";
[request setValue:@"text/event-stream" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
// 401Missing sign headers
NSDictionary<NSString *, NSString *> *signHeaders =
[KBSignUtils signHeadersWithBodyParams:payload];
[signHeaders enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj,
BOOL *stop) {
if (key.length == 0 || obj.length == 0) {
return;
}
[request setValue:obj forHTTPHeaderField:key];
}];
NSString *token = KBAuthManager.shared.current.accessToken ?: @""; NSString *token = KBAuthManager.shared.current.accessToken ?: @"";
if (token.length > 0) { if (token.length > 0) {
[request setValue:token forHTTPHeaderField:@"auth-token"]; [request setValue:token forHTTPHeaderField:@"auth-token"];
} }
// App Bearer
NSDictionary<NSString *, NSString *> *authHeader =
[[KBAuthManager shared] authorizationHeader];
[authHeader enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj,
BOOL *stop) {
if (key.length == 0 || obj.length == 0) {
return;
}
[request setValue:obj forHTTPHeaderField:key];
}];
request.HTTPBody = bodyData; request.HTTPBody = bodyData;
self.streamHasOutput = NO; self.streamHasOutput = NO;
@@ -463,7 +485,7 @@
__strong typeof(weakSelf) self = weakSelf; __strong typeof(weakSelf) self = weakSelf;
if (!self) if (!self)
return; return;
[self kb_handleEventSourceError:event.error]; // [self kb_handleEventSourceError:event.error];
} }
forEvent:WJXEventNameError forEvent:WJXEventNameError
queue:NSOperationQueue.mainQueue]; queue:NSOperationQueue.mainQueue];

View File

@@ -95,7 +95,7 @@ static void KBMaiPoint_DebugLogError(NSURLResponse *response, NSError *error) {
@"eventId": trimmedName, @"eventId": trimmedName,
@"value": val.copy @"value": val.copy
}; };
[self postPath:KB_MAI_POINT_PATH_GENERIC_DATA parameters:params completion:completion]; // [self postPath:KB_MAI_POINT_PATH_GENERIC_DATA parameters:params completion:completion];
} }
- (void)reportPageExposureWithEventName:(NSString *)eventName - (void)reportPageExposureWithEventName:(NSString *)eventName

View File

@@ -30,6 +30,10 @@ NS_ASSUME_NONNULL_BEGIN
/// 简单 nonce 生成(默认 16 位) /// 简单 nonce 生成(默认 16 位)
+ (NSString *)generateNonceWithLength:(NSUInteger)length; + (NSString *)generateNonceWithLength:(NSUInteger)length;
/// 生成本项目后端约定的签名请求头X-Sign/X-App-Id/X-Timestamp/X-Nonce
/// bodyParams参与签名的业务参数如 JSON body 字段)。内部会做类型容错与空值过滤。
+ (NSDictionary<NSString *, NSString *> *)signHeadersWithBodyParams:(nullable NSDictionary *)bodyParams;
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

View File

@@ -10,6 +10,32 @@
@implementation KBSignUtils @implementation KBSignUtils
static NSString *const KBSignAppId = @"loveKeyboard";
static NSString *const KBSignSecret = @"kZJM39HYvhxwbJkG1fmquQRVkQiLAh2H";
static NSString *KBSignStringFromObject(id obj) {
if (!obj || obj == (id)kCFNull) {
return nil;
}
if ([obj isKindOfClass:[NSString class]]) {
return (NSString *)obj;
}
if ([obj isKindOfClass:[NSNumber class]]) {
return [(NSNumber *)obj stringValue];
}
if ([obj isKindOfClass:[NSArray class]] || [obj isKindOfClass:[NSDictionary class]]) {
NSJSONWritingOptions options = 0;
if (@available(iOS 11.0, *)) {
options = NSJSONWritingSortedKeys;
}
NSData *data = [NSJSONSerialization dataWithJSONObject:obj options:options error:nil];
if (data.length > 0) {
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
}
return [obj description];
}
+ (NSString *)urlEncode:(NSString *)value { + (NSString *)urlEncode:(NSString *)value {
if (!value) return @""; if (!value) return @"";
// application/x-www-form-urlencoded // application/x-www-form-urlencoded
@@ -96,4 +122,50 @@
return [uuid substringToIndex:length]; return [uuid substringToIndex:length];
} }
+ (NSDictionary<NSString *, NSString *> *)signHeadersWithBodyParams:(NSDictionary *)bodyParams {
NSString *timestamp = [self currentTimestamp];
NSString *nonce = [self generateNonceWithLength:16];
NSMutableDictionary<NSString *, NSString *> *signParams = [NSMutableDictionary dictionary];
if (KBSignAppId.length > 0) {
signParams[@"appId"] = KBSignAppId;
}
if (timestamp.length > 0) {
signParams[@"timestamp"] = timestamp;
}
if (nonce.length > 0) {
signParams[@"nonce"] = nonce;
}
if ([bodyParams isKindOfClass:[NSDictionary class]] && bodyParams.count > 0) {
[bodyParams enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
if (![key isKindOfClass:[NSString class]]) {
return;
}
NSString *value = KBSignStringFromObject(obj);
if (value.length == 0) {
return;
}
signParams[(NSString *)key] = value;
}];
}
NSString *sign = [self signWithParams:signParams secret:KBSignSecret ?: @""];
NSMutableDictionary<NSString *, NSString *> *headers = [NSMutableDictionary dictionary];
if (sign.length > 0) {
headers[@"X-Sign"] = sign;
}
if (KBSignAppId.length > 0) {
headers[@"X-App-Id"] = KBSignAppId;
}
if (timestamp.length > 0) {
headers[@"X-Timestamp"] = timestamp;
}
if (nonce.length > 0) {
headers[@"X-Nonce"] = nonce;
}
return [headers copy];
}
@end @end

View File

@@ -33,29 +33,6 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network";
@implementation KBNetworkManager @implementation KBNetworkManager
static NSString *KBSignStringFromObject(id obj) {
if (!obj || obj == (id)kCFNull) {
return nil;
}
if ([obj isKindOfClass:[NSString class]]) {
return (NSString *)obj;
}
if ([obj isKindOfClass:[NSNumber class]]) {
return [(NSNumber *)obj stringValue];
}
if ([obj isKindOfClass:[NSArray class]] || [obj isKindOfClass:[NSDictionary class]]) {
NSJSONWritingOptions options = 0;
if (@available(iOS 11.0, *)) {
options = NSJSONWritingSortedKeys;
}
NSData *data = [NSJSONSerialization dataWithJSONObject:obj options:options error:nil];
if (data.length > 0) {
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
}
return [obj description];
}
+ (instancetype)shared { + (instancetype)shared {
static KBNetworkManager *m; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ m = [KBNetworkManager new]; }); static KBNetworkManager *m; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ m = [KBNetworkManager new]; });
return m; return m;
@@ -84,48 +61,10 @@ static NSString *KBSignStringFromObject(id obj) {
} }
- (void)getSignWithParare:(NSDictionary *)bodyParams{ - (void)getSignWithParare:(NSDictionary *)bodyParams{
NSDictionary<NSString *, NSString *> *signHeaders = [KBSignUtils signHeadersWithBodyParams:bodyParams];
NSString *appId = @"loveKeyboard";
NSString *secret = @"kZJM39HYvhxwbJkG1fmquQRVkQiLAh2H"; //
NSString *timestamp = [KBSignUtils currentTimestamp];
NSString *nonce = [KBSignUtils generateNonceWithLength:16];
// 1.
NSMutableDictionary<NSString *, NSString *> *signParams = [NSMutableDictionary dictionary];
signParams[@"appId"] = appId;
signParams[@"timestamp"] = timestamp;
signParams[@"nonce"] = nonce;
// body
[bodyParams enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSString *value = KBSignStringFromObject(obj);
if (value.length == 0) {
return;
}
signParams[key] = value;
}];
NSString *signSource = [KBSignUtils signSourceStringWithParams:signParams secret:secret];
NSString *sign = [KBSignUtils signWithParams:signParams secret:secret];
#if DEBUG
if (signSource.length > 0) {
NSString *secretPart = [NSString stringWithFormat:@"secret=%@", [KBSignUtils urlEncode:secret ?: @""]];
NSString *masked = [signSource stringByReplacingOccurrencesOfString:secretPart withString:@"secret=***"];
KBLOG(@"[KBNetwork] sign source: %@", masked);
KBLOG(@"[KBNetwork] sign value: %@", sign ?: @"");
}
#endif
//
NSMutableDictionary<NSString *, NSString *> *headers = NSMutableDictionary<NSString *, NSString *> *headers =
[self.defaultHeaders mutableCopy] ?: [NSMutableDictionary dictionary]; [self.defaultHeaders mutableCopy] ?: [NSMutableDictionary dictionary];
[headers addEntriesFromDictionary:signHeaders ?: @{}];
if (sign.length > 0) {
headers[@"X-Sign"] = sign;
}
headers[@"X-App-Id"] = appId;
headers[@"X-Timestamp"] = timestamp;
headers[@"X-Nonce"] = nonce;
// copy
self.defaultHeaders = headers; self.defaultHeaders = headers;
} }