来自NSData的DeviceCheck令牌(目标C)

时间:2017-09-23 08:29:49

标签: objective-c

使用新的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);

如果我将时间戳修改为秒而不是毫秒,我会收到有关时间戳的错误,所以我假设我正确地将有效负载送到服务器。

提前感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

好的,所以选项#2是正确答案:

NSString *tokenString = [token base64EncodedStringWithOptions:0];

服务器响应可能会产生误导 - 请注意相同的响应:

Missing or incorrectly formatted device token payload

如果您尝试多次发布具有相同transaction_id的JSON有效内容,或者多次发送相同的device_token(如果已经返回200),则可以返回。