当前位置: 首页 > 面试题库 >

NSData将不接受有效的base64编码的字符串

戚俊人
2023-03-14
问题内容

我正在iOS(7)的科学方面实现JSON Web令牌认证。运行良好。我的应用程序接收令牌,并可以使用它们对我的服务器进行身份验证的调用。

现在,我希望我的客户端代码检查令牌上的过期日期,以便它可以知道何时重新进行身份验证。检查JWT身份验证令牌上的到期日期很简单。授权令牌是3个base64编码的JSON
Blob,由’。’分隔。-过期时间戳记在中间的Blob中,称为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;
}

问题很简单。由NSData -initWithBase64EncodedString解析时,中间的base64 Blob为nil-,这很糟糕。

我检查了base64 blob,它似乎是有效的。我的服务器目前正在返回虚拟数据,因此下面是一个示例blob:
eyJlbWFpbCI6ImZvb0BiYXIuYmF6IiwiYWNjb3VudElkIjoiMTIzNDUtNjc4OTAtYmFyLWJheiIsImV4cCI6MTM5MDkxNTAzNywiaWF0IjoxMzkwOTE0MTM3fQ

解码为:

{"email":"foo@bar.baz","accountId":"12345-67890-bar-baz","exp":1390915037,"iat":1390914137}

我在这里测试过:http :
//www.base64decode.org

我在应用程序中的其他地方都成功使用过NSData的base64方法-我认为我在这里没有做任何特别的事情。但是我全是耳朵!有任何想法吗?


问题答案:

您的Base64字符串无效。必须用=字符填充,以使其长度为4的倍数"eyJlbWFp....MTM3fQ=="

使用此填充,可以initWithBase64EncodedString正确解码Base64字符串



 类似资料:
  • 它失败了并给出了像贝娄这样的例外。 xml格式与不兼容吗?

  • 问题内容: 发送到Google Cloud Vision的base64编码图像出现问题。有趣的是,如果我通过URI发送图像,则可以正常工作,因此我怀疑编码方式有误。 这是交易: 我总是得到的答复是: 如果我尝试使用URI代替: 响应还可以… 我按照推荐的方式从Google进行编码 知道这里有什么问题吗? 问题答案: 我没有使用Google Cloud Vision的经验,但是在查看了他们的文档和示

  • 我正在为一位位于巴西的客户开发一个网站。他的网站的一部分显示了用户的反馈/评论。 以下是一个例子: 正确版本: “这是我的一分钟!” 当我向用户输出时,显示如下内容: 不正确的版本: “这是我的一分钟!” 我将这些评论保存到mySQL数据库(Hostgator),并将数据库排序规则设置为“utf8\U unicode\U ci”。 在超文本标记语言的顶部,我声明了以下内容: 我使用Laravel

  • 问题内容: 我正在使用Base64编码来编码Java中的用户ID字段。 我想知道上面的字符串abc是否包含字符“,:”吗? 当以abc返回Base64编码的字符串时,它是否会包含以下字符? 问题答案: 您不会在Base64编码的字符串中看到任何逗号,冒号或双引号。由于等号用于填充结尾内容,因此您会看到等号。

  • 我想采取一个当前的base64编码的图像,并使用一个简短的哈希说“84dskh”,以“加密”的图像到另一个完全有效的base64编码图像。 原始图像不必经过base64编码,最终我想要原始图像的加密图像,但它仍然是一个可以在img标记中显示的有效图像:。 最好使用JavaScript。

  • 我有一个Java类,我用GSON把它转换成字符串。张贴这个字符串是base64编码的(由于某种原因,我们不去那里:),当我解码回来,我失去了所有的json中的{和}字符。 例如:{“name”:“ABC”}解码并编码回名称ABC 我想要回我的旧数据,即我想要回{"name:"ABC"} 像上面这样简单的事情,内容丢失了 请帮忙