You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用iOS Swift4验证JWT令牌签名?已通过JWTDecode解码令牌

Hey,我来帮你搞定JWT签名验证的事儿!既然你已经用JWTDecode解码了令牌,接下来验证签名其实没那么复杂,核心是拿到服务端对应的公钥,然后用JWTDecode提供的API就能完成验证。下面是具体的步骤和代码示例:

步骤1:准备对应公钥

你的JWT令牌使用的是RS256算法(从令牌头的alg: "RS256"可以看出来),所以需要获取签发该令牌的服务端提供的PEM格式公钥。公钥的格式通常是这样的:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
(中间是公钥内容)
-----END PUBLIC KEY-----

注意要确保公钥没有多余的换行或空格,格式必须准确。

步骤2:Swift4中实现签名验证

接下来用JWTDecode库完成验证,直接上代码:

首先导入库并准备你的令牌和公钥:

import JWTDecode

// 你的JWT令牌字符串
let tokenString = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJEZXYyLVNES1Byb2ZpbGVTZXJ2aWNlIiwiaWF0IjoxNTI0MDQxNzI4LCJuYmYiOjE1MjQwNDE3MjgsImV4cCI6MTUyNjYzMzcyOCwianRpIjoiMzA3MGEyYzJiMDNiNDIwMTljNjc1NjU5NGExZTMyZTEiLCJpZGVudGlmaWVyIjoiMzEyNGJjZTYtYTQ3ZS00OTBjLWFjZmItYThjNjAwODc5NDYxIiwiY3VzdG9tZXIiOiIzNDM5IiwiT2JzZXJ2ZWRUeiI6IkFtZXJpY2EvTmV3X1lvcmsiLCJkZXZpY2VzIjoiW1wiYnBjdWZmXypcIixcIndlaWdodHNjYWxlXypcIixcIip3ZW..."

// 替换成你实际拿到的PEM格式公钥
let publicKeyPEM = """
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
-----END PUBLIC KEY-----
"""

然后执行验证逻辑:

do {
    // 先解码令牌
    let jwt = try decode(jwt: tokenString)
    
    // 验证签名:使用RS256算法和PEM公钥
    let isSignatureValid = try jwt.verifySignature(using: .rs256(pemEncodedPublicKey: publicKeyPEM))
    
    if isSignatureValid {
        print("✅ 令牌签名验证通过!")
    } else {
        print("❌ 令牌签名验证失败!")
    }
    
    // 额外验证:除了签名,还可以验证令牌的过期时间、签发者等Claims
    try jwt.verifyExpiration() // 验证令牌是否过期
    try jwt.verifyIssuer(issuer: "Dev2-SDKProfileService") // 验证签发者是否匹配你令牌里的iss字段
} catch {
    print("验证出错:\(error.localizedDescription)")
}
关键注意事项
  • 算法匹配:一定要用RS256对应的验证方式,因为你的令牌用的是这个算法;如果是HS256算法的令牌才需要用对称密钥,别搞混了。
  • 公钥格式:必须是完整的PEM格式,包含头尾的标识行,否则会直接验证失败。
  • 全维度验证:不要只验证签名,记得同时验证过期时间、签发者这些Claims,确保令牌的整体有效性,避免使用已过期或伪造签发来源的令牌。

如果验证失败,常见原因有:公钥错误/格式不对、令牌被篡改过、令牌还未到生效时间(nbf字段)或已经过期。

内容的提问来源于stack exchange,提问作者user2122350

火山引擎 最新活动