通过身份验证后如何退出Apple

Posted

技术标签:

【中文标题】通过身份验证后如何退出Apple【英文标题】:How to Sign Out of Apple After Being Authenticated 【发布时间】:2020-03-09 04:42:01 【问题描述】:

我的应用具有“使用 Apple 登录”帐户功能。我想知道 Apple 帐户是否有退出功能。

我尝试了以下但没有成功

    let request = ASAuthorizationAppleIDProvider().createRequest()

    request.requestedOperation = .operationLogout

    let authorizationController = ASAuthorizationController(authorizationRequests: [request])

    authorizationController.performRequests()

【问题讨论】:

【参考方案1】:

Apple 目前仅允许用户执行注销 (ios/watchOS/tvOS) 或显示为对我们的权限撤销。他们建议您在使用之前获取凭据的状态以检查撤销,如果发生这种情况,请删除任何本地信息(删除您存储的用户标识符)(如果需要,可能更改 UI;例如显示登录查看)。

        let appleIDProvider = ASAuthorizationAppleIDProvider()
    appleIDProvider.getCredentialState(forUserID: KeychainItem.currentUserIdentifier)  (credentialState, error) in
        switch credentialState 
        case .authorized:
            // The Apple ID credential is valid.
            break
        case .revoked:
            // The Apple ID credential is revoked.
            break
        case .notFound:
            // No credential was found, so show the sign-in UI.
            break
        default:
            break
        
    

您可以在用户退出时向用户提供提示,指导他们也撤消设备设置并听取更改通知。

【讨论】:

上面的代码只是为了检查当前的状态,请您建议按照问题中的要求注销用户。 @MohitG。如前所述; Apple 没有可用于“使用 Apple 登录”的退出功能。目前,用户必须进入设置应用程序并撤销权限。如果应用程序检测到撤销状态;清除本地存储的任何本地 OAuth 或其他身份验证数据并要求重新身份验证。您还可以将本地存储的令牌清除到您的服务器,然后无论“使用 Apple 登录”状态如何都需要重新身份验证。 这也让我感到困惑,所以在移动应用程序中,如果我使用 Apple 登录并且本质上想要“注销”我的应用程序,那只不过是重定向回登录页面(除了我需要为我自己的应用程序的注销过程执行的逻辑)? @Reza 现在这是正确的。当您注销使用 Sign in with Apple 的应用程序时,他们只会删除其本地令牌以访问其服务器并再次向您显示登录页面(即使您在技术上仍通过设置通过 Apple 登录)。 如果他们不打算这样做,那么当用户尝试重新授权时,他们需要提供姓名/电子邮件凭据。有一个非常常见的边缘情况,用户删除帐户,而企业在帐户删除后不归档用户数据。该应用程序要么必须告诉用户撤销权限,要么设置自定义流程来收集电子邮件和姓名,这违背了此功能的大部分目的。【参考方案2】:

您需要从钥匙串中删除现有项目。

这是我的示例代码,使用 Apple 示例代码。 您可以从Apple获取示例代码

Apple 建议您在使用前获取凭据的状态以检查是否撤销,如果发生这种情况,请删除任何本地信息

struct KeychainItem 

    
    init(service: String, account: String, accessGroup: String? = nil) 
        self.service = service
        self.account = account
        self.accessGroup = accessGroup
    

    static func deleteUserIdentifierFromKeychain() 
        do  //please change service id to your bundle ID 
            try KeychainItem(service: "com.example.apple-samplecode", account: "userIdentifier").deleteItem()
         catch 
            print("Unable to delete userIdentifier from keychain")
        
    

   func deleteItem() throws 
        // Delete the existing item from the keychain.
        let query = KeychainItem.keychainQuery(withService: service, account: account, accessGroup: accessGroup)
        let status = SecItemDelete(query as CFDictionary)
        
        // Throw an error if an unexpected status was returned.
        guard status == noErr || status == errSecItemNotFound else  throw KeychainError.unhandledError 
    

钥匙串查询

keychainQuery 来自苹果示例代码。

    
    private static func keychainQuery(withService service: String, account: String? = nil, accessGroup: String? = nil) -> [String: AnyObject] 
        var query = [String: AnyObject]()
        query[kSecClass as String] = kSecClassGenericPassword
        query[kSecAttrService as String] = service as AnyObject?
        
        if let account = account 
            query[kSecAttrAccount as String] = account as AnyObject?
        
        
        if let accessGroup = accessGroup 
            query[kSecAttrAccessGroup as String] = accessGroup as AnyObject?
        
        
        return query
    

【讨论】:

它给了我以下错误 1. 类型 'KeychainItem' 没有成员 'keychainQuery' 2. 在范围内找不到 'KeychainError' 告诉我如何解决这两个错误 我添加了 keychainQuery。

以上是关于通过身份验证后如何退出Apple的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 中的 Apple ID 双重身份验证

Angularfire2 ng5.0 身份验证在登录后立即退出

在 Flutter Web 中长时间使用 Firebase 后退出

AWS Cognito 用户池 + 用于身份验证/登录的社交提供商

通过 Facebook 进行 Flutter 和 Firebase 身份验证:与设备的连接丢失

如何在通过 Redux 操作进行身份验证后重定向用户?