如何使用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




