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

在Swift中解码JSON Web令牌

郜德容
2023-03-14
问题内容

试图在Swift中解码JWT有效负载并遇到困难

static func decodePayload(tokenstr: String) {

    //splitting JWT to extract payload
    let arr = split(tokenstr) {$0 == "."}

    //base64 encoded string i want to decode
    let base64String = arr[1] as String
    println(base64String) //eyJleHAiOjE0MjY4MjIxNjMsImlkIjoiNTUwYjA3NzM4ODk1NjAwZTk5MDAwMDAxIn0

    //attempting to convert base64 string to nsdata 
    let nsdata: NSData = NSData(base64EncodedString: base64String, options: NSDataBase64DecodingOptions(rawValue: 0))

    //decoding fails because nsdata unwraps as nil
    let base64Decoded: NSString = NSString(data: nsdata!, encoding: NSUTF8StringEncoding)!


}

问题答案:
eyJleHAiOjE0MjY4MjIxNjMsImlkIjoiNTUwYjA3NzM4ODk1NjAwZTk5MDAwMDAxIn0

不是有效的Base64编码字符串,因为它的长度不是4的倍数。某些Base64解码器可以容忍此错误,但NSData方法不能。

因此,这实际上是在服务器端创建Base64编码的字符串时出现的错误。如有必要,您可以通过添加所需的=字符填充来在应用程序中对其进行修复(已为Swift
2更新了代码):

var base64String = arr[1] as String
if base64String.characters.count % 4 != 0 {
    let padlen = 4 - base64String.characters.count % 4
    base64String += String(count: padlen, repeatedValue: Character("="))
}

现在解码可以按预期进行:

if let data = NSData(base64EncodedString: base64String, options: []),
    let str = String(data: data, encoding: NSUTF8StringEncoding) {
    print(str) // {"exp":1426822163,"id":"550b07738895600e99000001"}
}

斯威夫特4:

var base64String = "eyJleHAiOjE0MjY4MjIxNjMsImlkIjoiNTUwYjA3NzM4ODk1NjAwZTk5MDAwMDAxIn0"

if base64String.count % 4 != 0 {
    let padlen = 4 - base64String.count % 4
    base64String.append(contentsOf: repeatElement("=", count: padlen))
}

if let data = Data(base64Encoded: base64String) ,
    let str = String(data: data, encoding: .utf8) {
    print(str) // {"exp":1426822163,"id":"550b07738895600e99000001"}
}


 类似资料:
  • 问题内容: 我目前正在使用Golang应用程序。我从客户端收到JWT令牌,在Go中,我需要对该令牌进行解码并获取以下信息:用户,名称等。我正在检查可用于处理JWT的库令牌,我来到https://github.com/dgrijalva/jwt- go ,但我看不到如何简单地制作所需的东西。 我有令牌,我需要将信息解码为地图或至少为json。在哪里可以找到如何做的指南?谢谢! 问题答案: 函数接受第

  • 问题内容: 我有一个包含一些图像的mysql数据库。我从php文件接收数据: 现在有了一个Json文件,我得到的是这样的: 我有一个迅速的项目,想将图像解码成UIImage,到目前为止,我还不知道如何解码图像。我有以下几点。 如何解码图像以便显示? 问题答案: 您必须将字典值从AnyObject强制转换为String。您还必须使用.IgnoreUnknownCharacters选项对字符串数据进行

  • 问题内容: 我正在从网站提取JSON文件,收到的字符串之一是: 如何将类似的内容转换为正确的字符? 我创建了一个Xcode Playground来演示它: 问题答案: 这个答案最近针对Swift 5.2和iOS 13.4 SDK进行了修订。 没有做到这一点的直接方法,但是您可以使用魔术使此过程尽可能轻松(请注意,此方法也将剥离所有HTML标记)。 记住 仅从主线程 初始化。它使用WebKit解析下

  • 我想解码我使用Postman收到的jwt令牌,并在RESTAPI中实现它。我该怎么做?我看到有人发布代码来解码jwt令牌(参考:如何在不使用库的情况下在javascript中解码jwt令牌?)但我不明白在《邮差》里怎么做?解码jwt需要什么url?需要什么标题、授权?

  • 我添加了Firebase,允许客户端直接从web应用程序客户端(浏览器)进行身份验证。我正在使用firebase web JS包,它工作得非常好。我可以在浏览器中看到,我收到一个用户对象,其中包含有关该用户的信息,包括。 然后,我需要在我的服务器后端(即python django)上对该用户进行身份验证。在Firebase文档中,我找到了一个我正试图做的操作指南,即验证id令牌。 因为他们没有支持

  • 我一直在使用Charles调试移动应用程序和API之间的通信。 我们现在将客户端(app)和服务器都更改为使用JSON Web令牌(JWT)。 有没有办法配置Charles,以便在浏览请求时对JWT进行解码? 基本上,请求(从移动应用程序到服务器)将由一个包含JWT的标头(授权)组成,当我在Charles中单击该请求时,我想看到: -原始令牌 -解码标头 -解码负载 查看Charles的文档,我发