我无法删除使用苹果登录的用户

2023-12-04

我们正在实施新的指导方针Apple 强制要求删除用户。我正在使用 firebase 进行身份验证。我正在创建一个用户帐户。这里没问题。但我无法删除使用苹果登录的用户。我收到错误。我正在使用这个api来删除,令牌撤销API。 我是快速的新手。我找不到问题

这是我的登录代码。它工作正常:

class SignUpNewUser: NSObject {
    /// apple
    var currentNonce: String? // fileprivate
}

extension SignUpNewUser : ASAuthorizationControllerPresentationContextProviding{
    
    func Apple() {
        let nonce = randomNonceString()
        currentNonce = nonce
        let appleIDProvider = ASAuthorizationAppleIDProvider()
        let request = appleIDProvider.createRequest()
        request.requestedScopes = [.fullName, .email]
        request.nonce = sha256(nonce)
        
        let authorizationController = ASAuthorizationController(authorizationRequests: [request])
        authorizationController.delegate = self
        authorizationController.presentationContextProvider = self
        authorizationController.performRequests()
    }
    
    private func sha256(_ input: String) -> String {
        let inputData = Data(input.utf8)
        let hashedData = SHA256.hash(data: inputData)
        let hashString = hashedData.compactMap {
            return String(format: "%02x", $0)
        }.joined()
        
        return hashString
    }
    
    private func randomNonceString(length: Int = 32) -> String {
        precondition(length > 0)
        let charset: Array<Character> =
            Array("0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._")
        var result = ""
        var remainingLength = length
        
        while remainingLength > 0 {
            let randoms: [UInt8] = (0 ..< 16).map { _ in
                var random: UInt8 = 0
                let errorCode = SecRandomCopyBytes(kSecRandomDefault, 1, &random)
                if errorCode != errSecSuccess {
                    fatalError("Unable to generate nonce. SecRandomCopyBytes failed with OSStatus \(errorCode)")
                }
                return random
            }
            randoms.forEach { random in
                if length == 0 {
                    return
                }
                
                if random < charset.count {
                    result.append(charset[Int(random)])
                    remainingLength -= 1
                }
            }
        }
        return result
    }
}



extension SignUpNewUser: ASAuthorizationControllerDelegate {
    
    
    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        
        guard let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential else {
            dataSource?.endSignUpWithError(error: eLogin.authorizationNotFound.error(), method: .apple)
            return
        }
        
        guard let nonce = currentNonce else {
            fatalError("Invalid state: A login callback was received, but no login request was sent.")
        }
        
        // JWT
        guard let appleIDToken = appleIDCredential.identityToken else {
            dataSource?.endSignUpWithError(error: eLogin.identityToken.error(), method: .apple)
            return
        }
        
        guard let idTokenString = String(data: appleIDToken, encoding: .utf8) else {
            mylog(eLogin.serializeToken.error(), appleIDToken.debugDescription)
            dataSource?.endSignUpWithError(error: eLogin.serializeToken.error(), method: .apple)
            return
        }
        
        let credential = OAuthProvider.credential(withProviderID: "apple.com", idToken: idTokenString, rawNonce: nonce)
        
        @AppStorage("JWt_client_secret") var client_secret: String = ""
        @AppStorage("apltoken") var apple_token: String = ""
        client_secret = nonce
        apple_token = idTokenString

        signInFirebaseAccount(credential, appleIDCredential:appleIDCredential)
    }
    
    
    
    /// signup tamam firebase bağla hesabı
    private func signInFirebaseAccount(_ credential: AuthCredential, appleIDCredential: ASAuthorizationAppleIDCredential) {
        Auth.auth().signIn(with: credential) { (authResult, error) in
            
            if let error = error {
                self.dataSource?.endSignUpWithError(error: error , method: .apple)
            }else{
                guard let user = authResult?.user else {
                    self.dataSource?.endSignUpWithError(error: eLogin.kayitHatasi.error(), method: .apple)
                    return
                }

                // JWT
                guard let appleIDToken = appleIDCredential.identityToken else {
                    print("hata 5")
                    return
                }
                
                guard let idTokenString = String(data: appleIDToken, encoding: .utf8) else {
                    print("hata 6")
                    return
                }
                guard let nonce = self.currentNonce else {
                    fatalError("Invalid state: A login callback was received, but no login request was sent.")
                }

                @AppStorage("JWt_client_secret") var client_secret: String = ""
                @AppStorage("apltoken") var apple_token: String = ""
                client_secret = nonce
                apple_token = idTokenString

                
                self.createNewUser(user: user, method: .apple)
                
            }
        }
    }

}

我正在使用此代码来删除帐户。这是行不通的。我正在添加运行代码后获得的控制台图像。

extension SignUpNewUser{
    func deleteAppleAccount() {
        @AppStorage("JWt_client_secret") var client_secret: String = ""
        @AppStorage("apltoken") var apple_token: String = ""


        let urlString = "https://appleid.apple.com/auth/revoke"
        let url = NSURL(string: urlString)!

        let paramString: [String : Any] = [
            "client_id": "com.MyCompany.Name",
            "client_secret": client_secret,
            "token": apple_token
        ]

        
        let request = NSMutableURLRequest(url: url as URL)
        request.httpMethod = "POST"
        request.httpBody = try? JSONSerialization.data(withJSONObject:paramString, options: [.prettyPrinted])
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
//                request.setValue("application/json", forHTTPHeaderField: "Accept")

        
        let task =  URLSession.shared.dataTask(with: request as URLRequest)  { (data, response, error) in
                guard
                    let response = response as? HTTPURLResponse,
                    error == nil
                else {                                                               // check for fundamental networking error
                    print("error", error ?? URLError(.badServerResponse))
                    return
                }
                
                guard (200 ... 299) ~= response.statusCode else {                    // check for http errors
                    print("statusCode should be 2xx, but is \(response.statusCode)")
                    print("response = \(response)")
                    return
                }

                
            if let error = error {
                print(error)
            }else{
                print("deleted accont")
            }
        }
        task.resume()
    }

}

控制台输出:

statusCode should be 2xx, but is 400
response = <NSHTTPURLResponse: 0x2815e5e00> { URL: https://appleid.apple.com/auth/revoke } { Status Code: 400, Headers {
    "Cache-Control" =     (
        "no-store"
    );
    Connection =     (
        "keep-alive"
    );
    "Content-Length" =     (
        26
    );
    "Content-Type" =     (
        "application/json;charset=ISO-8859-1"
    );
    Date =     (
        "Sat, 28 May 2022 12:07:51 GMT"
    );
    Pragma =     (
        "no-cache"
    );
    Server =     (
        Apple
    );
} }

我哪里出错了?我找不到任何关于它的教程。当月 30 日之后,帐户删除选项将强制执行。我现在需要解决这个问题:(


如果您不刷新令牌用户,您应该尝试这个......

let paramString: [String : Any] = [
            "client_id": "com.MyCompany.Name",
            "client_secret": client_secret,
            "token": apple_token,
            "token_type_hint": "access_token"
        ]

如果你这样做

let paramString: [String : Any] = [
            "client_id": "com.MyCompany.Name",
            "client_secret": client_secret,
            "token": apple_token,
            "token_type_hint": apple_typeToken

        ]

其中 apple_typeToken 可以是“access_token”或“refresh_token”

你应该编辑你的 request.httpMethod 就像

Swift 中使用 POST 方法进行 HTTP 请求

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我无法删除使用苹果登录的用户 的相关文章

随机推荐

  • 由于 reticulate_python 导致闪亮应用程序部署出现问题

    我有一个应用程序想要部署在shinyapps io 上 我认为值得注意的是 应用程序中的数据是从 athena 的数据库中提取的 我用了这个包Rathena连接到数据库以及所有用于从我的计算机本地运行良好的内容 但是 我尝试将其部署到shi
  • 如何正确隐藏这些广告横幅?

    Sprite Kit 游戏 我希望在游戏过程中隐藏我的广告横幅 我已经将我的项目设置为包含 iAd 和 AdMob 广告横幅 在添加 AdMob SDK 和 AdMob 广告代码之前 当我想要隐藏 iAd 横幅时 隐藏它没有任何问题 现在由
  • 具有导出选项(如数据表)的等效单个 Html 文件

    我使用 DataTables 使用静态数据创建了一个 HTML 表 带有导出选项 搜索 分页 plnkr co edit n3cbx8GrGoJtOpgbxE32 p preview 类似的示例或工作 html 可在 angular ui
  • 登录对话框 PyQt

    当客户询问我是否可以在应用程序启动时实现某种登录表单时 我几乎完成了我的应用程序 到目前为止 我已经设计了用户界面 并修改了实际的执行 用户名和密码目前无关紧要 class Login QtGui QDialog def init self
  • 我无法使用 ctypes 访问 C++ 类属性

    我正在使用 ctypes 为 C 库开发一种 Python API 到目前为止 一切都很顺利 但是 我将操作系统从 Ubuntu 20 4 LTS 升级到 22 04 现在使用 Python3 10 6 和 g 11 3 0 但即使使用 g
  • 将基于Box的树结构适配为Rc+RefCell时如何处理“临时值丢失”错误?

    我创建了一个树 其类型定义类似于 derive Debug Clone pub crate struct TreeBox
  • 配置 gvim 设置颜色和字体

    我想尝试一下 vim 但是配置文件有点问题 我这里已经安装了gvimC Program Files x86 Vim vim73并添加了一个名为C Program Files x86 Vim vim73 vimrc 但是当我尝试不同的配置时
  • 通过 FTP 将文件发送到服务器,但结果到达时字节大小为零

    我正在尝试使用 FTPClient 将文件上传到数据库服务器 显示文件传输成功 但文件为空 大小为0字节 下面是我用来构建的源代码 有人能解决这个问题吗 package Examples import org apache commons
  • 如何在 JOIN 的 WHERE 子句中使用列名作为 LIKE 语句的一部分

    LEFT OUTER JOIN INVENTTRANS ON TEMP VOUCHERPHYSICAL INVENTTRANS VOUCHERPHYSICAL WHERE INVENTTRANS ITEMID Temp INVENTDIMI
  • Logstash 文件输入:sincedb_path

    重新启动 Logstash 后 有时会观察到 Logstash 会重复日志事件 想知道什么是正确的申请方式start position sincedb path sincedb write interval配置选项 当同一位置有多个文件时会
  • 立即将图像加载到内存中

    我需要将 WPF 中的 Tiff 图像中的所有帧打开到内存中 然后删除源 之后我最终需要渲染该图像 根据窗口大小调整大小 我的解决方案非常慢 我无法在第一次请求之前删除文件源 有什么最佳实践吗 Use CacheOption BitmapC
  • Python/格式 - 列表和宽度

    到目前为止 我的列表的格式是这样的 print gt 15 gt 15 gt 15 gt 15 format i liste l 我对 python 很陌生 我不知道如何通过动态设置动态宽度 我的意思是 len total int len
  • 如何按起始字符范围进行选择?

    这是我的 mySQL 查询 SELECT FROM eodList WHERE datechanged gt curdate GROUP BY symbolName ORDER BY dateChanged DESC 我如何获取所有行 例如
  • MySQL JOIN 和 COUNT 在单个查询中

    我正在尝试将两个表连接在一起并获取外键的计数 抱歉 我真的不知道如何解释自己 所以让我演示一下 我有 1 个表 订单 用于订单 包含以下字段 id f name l name credit card ETC 然后 我有一个订单中的项目的 o
  • 确定一个符号是否是第 i 个组合 nCr 的一部分

    更新 组合学和取消排名最终是我所需要的 下面的链接有很大帮助 http msdn microsoft com en us library aa289166 v vs 71 aspx http www codeproject com Arti
  • 如何为 Google Cloud Function 分配内存?

    今天我在云函数中遇到这个错误 函数被杀死 错误 超出内存限制 我的功能是基于经过身份验证的 json api 示例Firebase 示例函数 因为它工作起来就像一个魅力 我用多个路由和多个任务扩展了它 比如连接多个外部 api 将 base
  • JTable刷新不显示

    我拼命地试图说服我的JTable当我更改其数据时刷新 数据存储在全局单例中 TreeSet 我正在使用 每当TreeSets 数据被更改 会触发一个事件来刷新TableModel 出于测试目的 我将其替换为一个简单的Timer射击事件 每次
  • 无法从数据源获取单元格

    下面的代码有什么问题 UITableViewCell tableView UITableView tableView cellForRowAtIndexPath NSIndexPath indexPath NSString CellIden
  • 使用 cout 打印正确的小数位数

    我有一个清单float值 我想打印它们cout保留 2 位小数 例如 10 900 should be printed as 10 90 1 000 should be printed as 1 00 122 345 should be p
  • 我无法删除使用苹果登录的用户

    我们正在实施新的指导方针Apple 强制要求删除用户 我正在使用 firebase 进行身份验证 我正在创建一个用户帐户 这里没问题 但我无法删除使用苹果登录的用户 我收到错误 我正在使用这个api来删除 令牌撤销API 我是快速的新手 我