Я использую аутентификацию JSON Web Token на стороне iOS (7). Он работает красиво. Мое приложение вводит токены и может выполнять аутентифицированные вызовы на моем сервере с ними.
Теперь я хочу, чтобы мой код на стороне клиента проверял дату истечения срока действия на токене, чтобы он мог знать, когда нужно повторно аутентифицировать. Проверка даты истечения срока действия на токере JWT auth проста. Ток авторизации - это 3 кодированные JSON-кодированные base64, разделенные символом '.' - Временная метка истечения находится в среднем блобе в поле под названием ext
. Это секунды с момента unix.
Итак, мой код выглядит так:
- (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;
}
Проблема проста. Среднее значение base64 blob при анализе NSData -initWithBase64EncodedString nil
- и это плохо.
Я проверил blob base64, и он кажется действительным. Мой сервер возвращает фиктивные данные на данный момент, так что вот пример blob: eyJlbWFpbCI6ImZvb0BiYXIuYmF6IiwiYWNjb3VudElkIjoiMTIzNDUtNjc4OTAtYmFyLWJheiIsImV4cCI6MTM5MDkxNTAzNywiaWF0IjoxMzkwOTE0MTM3fQ
Он декодирует:
{"email":"[email protected]","accountId":"12345-67890-bar-baz","exp":1390915037,"iat":1390914137}
Я протестировал его здесь: http://www.base64decode.org
Я использовал NSData base64 методы elswhere в моем приложении с успехом - я не думаю, что я делаю что-то особенно сломанное здесь. Но я все уши! Любые идеи?