使用新的DeviceCheck API - 我使用以下方法生成令牌:
[DCDevice.currentDevice generateTokenWithCompletionHandler:^(NSData * _Nullable token, NSError * _Nullable error)
我已成功通过签名的JWT进行身份验证:
https://api.development.devicecheck.apple.com/v1/validate_device_token
但回应是:
Missing or incorrectly formatted device token payload
这是有效载荷的样本:
{"device_token":"0200000072912.......<rest of tokenString>","transaction_id":"ac61b285-4420-4b7e-a750-fef2b9f3419c","timestamp":1506150851000}
所以,我的问题是 - 如何从NSData获取令牌 - 这些方法都不起作用:
NSString *tokenString = [[token description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
tokenString = [tokenString stringByReplacingOccurrencesOfString:@" " withString:@""];
NSString *tokenString = [token base64EncodedStringWithOptions:0];
const unsigned *tokenBytes = [token bytes];
NSString *tokenString = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
NSMutableString *hexToken;
const unsigned char *iterator = (const unsigned char *) [token bytes];
hexToken = [[NSMutableString alloc] init];
for (NSInteger i = 0; i < token.length; i++)
{
[hexToken appendString:[NSString stringWithFormat:@"%02lx", (unsigned long) iterator[i]]];
}
NSString *tokenString = [NSString stringWithString:hexToken];
Apple开发者论坛没有帮助 - 我发现的唯一其他问题表明令牌在一分钟内到期 - 我会在几秒钟内发布到服务器。
我正在使用Java HttpPost - 并使用以下方法添加有效负载:
StringEntity params = new StringEntity(jsonPayload);
httpPost.setEntity(params);
如果我将时间戳修改为秒而不是毫秒,我会收到有关时间戳的错误,所以我假设我正确地将有效负载送到服务器。
提前感谢你的帮助。
答案 0 :(得分:1)
好的,所以选项#2是正确答案:
NSString *tokenString = [token base64EncodedStringWithOptions:0];
服务器响应可能会产生误导 - 请注意相同的响应:
Missing or incorrectly formatted device token payload
如果您尝试多次发布具有相同transaction_id的JSON有效内容,或者多次发送相同的device_token(如果已经返回200),则可以返回。