我正在iOS(7)的科学方面实现JSON Web令牌认证。运行良好。我的应用程序接收令牌,并可以使用它们对我的服务器进行身份验证的调用。
现在,我希望我的客户端代码检查令牌上的过期日期,以便它可以知道何时重新进行身份验证。检查JWT身份验证令牌上的到期日期很简单。授权令牌是3个base64编码的JSON Blob,由’。’分隔。-过期时间戳记在中间的Blob中,称为ext。距Unix时代已秒。
ext
所以我的代码看起来像这样:
- (NSDate*) expirationDate { if ( !_tokenAppearsValid ) return nil; if ( !_parsedExpirationDate ) { // // Token is three base64 encoded payloads separated by '.' // The payload we want is the middle one, which is a JSON dict, with // 'exp' being the unix seconds timestamp of the expiration date // Returning nil is appropriate if no 'exp' is findable // NSArray *components = [self.token componentsSeparatedByString:@"."]; NSString *payload = components[1]; NSData* payloadJsonData = [[NSData alloc] initWithBase64EncodedString:payload options:NSDataBase64DecodingIgnoreUnknownCharacters]; NSError* jsonError = nil; NSDictionary* payloadJson = [NSJSONSerialization JSONObjectWithData:payloadJsonData options:0 error:&jsonError]; if ( payloadJson ) { if ( payloadJson[@"exp"] ) { NSTimeInterval timestampSeconds = [payloadJson[@"exp"] doubleValue]; _expirationDate = [NSDate dateWithTimeIntervalSince1970:timestampSeconds]; } } _parsedExpirationDate = YES; } return _expirationDate; }
问题很简单。由NSData -initWithBase64EncodedString解析时,中间的base64 Blob为nil-,这很糟糕。
nil
我检查了base64 blob,它似乎是有效的。我的服务器目前正在返回虚拟数据,因此下面是一个示例blob: eyJlbWFpbCI6ImZvb0BiYXIuYmF6IiwiYWNjb3VudElkIjoiMTIzNDUtNjc4OTAtYmFyLWJheiIsImV4cCI6MTM5MDkxNTAzNywiaWF0IjoxMzkwOTE0MTM3fQ
eyJlbWFpbCI6ImZvb0BiYXIuYmF6IiwiYWNjb3VudElkIjoiMTIzNDUtNjc4OTAtYmFyLWJheiIsImV4cCI6MTM5MDkxNTAzNywiaWF0IjoxMzkwOTE0MTM3fQ
解码为:
{"email":"foo@bar.baz","accountId":"12345-67890-bar-baz","exp":1390915037,"iat":1390914137}
我在这里测试过:http : //www.base64decode.org
我在应用程序中的其他地方都成功使用过NSData的base64方法-我认为我在这里没有做任何特别的事情。但是我全是耳朵!有任何想法吗?
您的Base64字符串无效。必须用=字符填充,以使其长度为4的倍数"eyJlbWFp....MTM3fQ=="。
=
"eyJlbWFp....MTM3fQ=="
使用此填充,可以initWithBase64EncodedString正确解码Base64字符串。
initWithBase64EncodedString