我在这里使用这个库生成JWT令牌是我的代码:
func generateJWT() -> String{
let claim = JWTClaimsSet()
claim.issuer = "xxxxxx"
claim.audience = "https://www.googleapis.com/oauth2/v4/token"
claim.issuedAt = NSDate()
claim.expirationDate = NSDate()
let header = ["alg":"RS256","typ":"JWT"]
let algorithm = JWTAlgorithmFactory.algorithmByName("RS256")
let encodeBuilder = JWT.encodeClaimsSet(claim)
let jwt = encodeBuilder.secret("secret").algorithm(algorithm).headers(header).encode
return jwt
}
但是我收到了这个错误:
2016-03-30 16:51:23.274 JWTObjc[3217:74974] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[2]'
我做错了什么?
提前感谢
答案 0 :(得分:1)
HMAC签名签名/验证涉及双方都知道的共享秘密,因此在那里使用.secret(" secret")方法。
RSA是公钥/私钥系统,签名者具有私钥,验证者只有公钥。因此,要创建签名的JWT,您需要使用私钥。这些最常用于PKCS12格式,受密码短语保护。看起来这就是JWTAlgorithmRS256类所期望的,因此API看起来更像.secretData(p12FileData).privateKeyCertificatePassphrase("password")
而不是.secret("secret")
。
要进行验证,您可能需要.secretData(certFileData)
(证书将包含公钥)。
答案 1 :(得分:0)
我使用PKCS1和RS256
func encryptPayload(payload:[AnyHashable:Any])->String?
{
var resultStr: String?
var publicKeyCrypto: JWTCryptoKeyProtocol? = nil
do {
publicKeyCrypto = try JWTCryptoKeyPublic(pemEncoded: AppConstant.Scurity.publicKey, parameters: nil)
}
catch {
NSLog("error: \(error)")
}
guard let theCrypto = publicKeyCrypto else {
return nil
}
do {
let privateKeyCrypto = try JWTCryptoKeyPrivate(pemEncoded: AppConstant.Scurity.privateKey, parameters: nil)
guard let holder = JWTAlgorithmRSFamilyDataHolder().signKey(privateKeyCrypto)?.secretData(AppConstant.Scurity.privateKey.data(using: .utf8))?.algorithmName(JWTAlgorithmNameRS256) else {return nil}
let headers : [AnyHashable:Any] = ["alg": "RS256","typ": "JWT"]
guard let encoding = JWTEncodingBuilder.encodePayload(payload).headers(headers)?.addHolder(holder) else {return nil}
let result = encoding.result
print(result?.successResult?.encoded ?? "Encoding failed")
print(result?.errorResult?.error ?? "No encoding error")
let verifyDataHolder = JWTAlgorithmRSFamilyDataHolder().signKey(theCrypto)?.secretData(AppConstant.Scurity.publicKey.data(using: .utf8)!)?.algorithmName(JWTAlgorithmNameRS256)
let verifyResult = JWTDecodingBuilder.decodeMessage(result?.successResult?.encoded).addHolder(verifyDataHolder)?.result
if verifyResult?.successResult != nil, let result = verifyResult?.successResult.encoded {
print("Verification successful, result: \(result)")
} else {
print("Verification error: \(verifyResult!.errorResult.error)")
}
resultStr = result?.successResult.encoded
} catch {
print(error)
}
return resultStr
}