2016-03-30 18 views
0

Я использовал эту библиотеку для создания JWT фишки вот мой код:JWT «RS256» Алгоритм вопрос

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]' 

я сделал что-то не так?

Thank в заранее

+0

Какая линия точно? Где-то есть значение «nil». – Larme

+0

В этой строке: let jwt = encodeBuilder.secret («secret»). Алгоритм (алгоритм) .headers (header) .encode –

+0

HS256 работает нормально, но RS256 i получил ошибку выше –

ответ

1

HMAC подпись подписания/проверки включает в себя общий секрет, известный с обеих сторон, таким образом, использование .secret («секретно») метод там.

RSA - это система открытого/закрытого ключа, в которой подписант имеет закрытый ключ, а верификатор имеет только открытый ключ. Итак, чтобы создать подписанный JWT, вам нужен секретный ключ. Они чаще всего используются в формате PKCS12, защищенных парольной фразой. Похоже, именно так ожидает класс JWTAlgorithmRS256, поэтому API там больше похож на .secretData(p12FileData).privateKeyCertificatePassphrase("password") вместо .secret("secret").

Для проверки вы, вероятно, хотите .secretData(certFileData) (сертификат будет содержать открытый ключ).

+0

Да, это работает спасибо –

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 
} 
Смежные вопросы