NSData nie akceptuje prawidłowego ciągu zakodowanego w standardzie base64

Wdrażam uwierzytelnianie tokenu internetowego JSON po stronie klienta iOS (7). Ładnie działa. Moja aplikacja odbiera tokeny i może za ich pomocą wykonywać uwierzytelnione połączenia z moim serwerem.

Teraz chcę, aby mój kod po stronie klienta sprawdził datę ważności tokena, aby mógł wiedzieć, kiedy ponownie uwierzytelnić. Sprawdzanie daty ważności na tokenie uwierzytelniającym JWT jest proste. Token autoryzacji to 3 obiekty BLS JSON zakodowane w standardzie base64, oddzielone znakiem „.” - Znacznik czasu wygaśnięcia znajduje się w środkowym obiekcie blob, w polu o nazwieext. Minęły sekundy od epoki Uniksa.

Mój kod wygląda więc tak:

- (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;
}

Problem jest prosty. Środkowy obiekt blob base64, analizowany przez NSData -initWithBase64EncodedString, ma wartośćnil - i to źle.

Sprawdziłem obiekt blob base64 i wydaje się, że jest poprawny. Mój serwer zwraca obecnie fikcyjne dane, więc oto przykładowy obiekt blob:eyJlbWFpbCI6ImZvb0BiYXIuYmF6IiwiYWNjb3VudElkIjoiMTIzNDUtNjc4OTAtYmFyLWJheiIsImV4cCI6MTM5MDkxNTAzNywiaWF0IjoxMzkwOTE0MTM3fQ

Dekoduje:

{"email":"[email protected]","accountId":"12345-67890-bar-baz","exp":1390915037,"iat":1390914137}

Testowałem to tutaj:http://www.base64decode.org

Z powodzeniem zastosowałem metody base64 NSData gdzie indziej w mojej aplikacji - nie sądzę, że robię tu coś szczególnie zepsutego. Ale jestem cały w uszach! Jakieś pomysły?

questionAnswers(5)

yourAnswerToTheQuestion