2017-11-22 18 views
0
アイデンティティプールcognito AWSへパスワードを忘れた場合の要求を提出すると、要求はとの組み合わせで、クライアントの秘密で署名しなければならないのiOS

AWSは、パスワードを忘れた:iOSの

ため

ソリューションのためのクライアントのための秘密のハッシュを確認することができません。ユーザー名はパスワードの忘れ要求で送信されます。

クライアントシークレットとawtが要求する形式でswift内のユーザー名から「secretHash」を作成するにはどうすればよいですか?

答えて

1

この機能は文書化されておらず、一部のAWSライブラリのテストでのみ検出されます。このコードは、AWSCongitoIdentityUserPoolライブラリで機能がよりよくサポートされるまで、パスワードを忘れた要求を送信する例です。ユーザーのプールからクライアントシークレットとユーザー名を署名

スウィフト3.2

func forgotPassword(username: String) { 
    let pool = AWSCognitoIdentityUserPool.default() 

    let request = AWSCognitoIdentityProviderForgotPasswordRequest() 
    request?.username = username 
    request?.clientId = pool.userPoolConfiguration.clientId 
    request?.secretHash = pool.calculateSecretHash(username: username) 

    AWSCognitoIdentityProvider.default().forgotPassword(request!) { (response, error) in 
     if let error = error { 
      print(error) 
     } 
     else { 
      print("success") 
     } 
    } 
} 

extension AWSCognitoIdentityUserPool { 
    func calculateSecretHash(username: String) -> String? { 
     guard let clientSecret = userPoolConfiguration.clientSecret else { 
      return nil 
     } 
     guard let key = clientSecret.data(using: String.Encoding.ascii) else { 
      return nil 
     } 
     guard let data = (username + userPoolConfiguration.clientId).data(using: String.Encoding.utf8) else { 
      return nil 
     } 

     let hmac = sign256(data: data, key: key) 
     return hmac.base64EncodedString() 
    } 

    fileprivate func sign256(data: Data, key: Data) -> Data { 
     let algorithm: CCHmacAlgorithm = CCHmacAlgorithm(kCCHmacAlgSHA256) 
     let digestLength = Int(CC_SHA256_DIGEST_LENGTH) 
     let signature = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLength) 
     defer { signature.deallocate(capacity: digestLength) } 

     data.withUnsafeBytes { dataBytes in 
      key.withUnsafeBytes { keyBytes in 
       CCHmac(algorithm, keyBytes, key.count, dataBytes, data.count, signature) 
      } 
     } 

     return Data(bytes: signature, count: digestLength) 
    } 

} 
関連する問題