0

iOS向けソリューション

パスワードを忘れた場合のリクエストを aws cognito ID プールに送信する場合、パスワードを忘れた場合のリクエストで送信されたユーザー名と組み合わせて、クライアントのシークレットでリクエストに署名する必要があります。

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

4

1 に答える 1

3

この機能は文書化されておらず、一部の 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)
    }

}
于 2017-11-22T02:49:00.283 に答える