名称和邮件范围的ASAuthorizationAppleIDRequest返回nil值

mha*_*ddl 5 ios13 xcode11 apple-sign-in

我正在使用Apple实施Sign in,并注意到返回的emailfullName属性ASAuthorizationAppleIDCredential仅在此Apple ID的第一个Sign-In上填写。在所有后续登录中,这些属性均为零。

这是iOS 13上的错误还是预期的行为?

这是我用来启动请求的代码:

@available(iOS 13.0, *)
dynamic private func signInWithAppleClicked() {
    let request = ASAuthorizationAppleIDProvider().createRequest()
    request.requestedScopes = [.fullName, .email]

    let controller = ASAuthorizationController(authorizationRequests: [request])
    controller.delegate = self
    controller.presentationContextProvider = self
    controller.performRequests()
}
Run Code Online (Sandbox Code Playgroud)

我正在此委托方法中收到证书:

public func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
    guard let credential = authorization.credential as? ASAuthorizationAppleIDCredential else { return }

    let userIdentifier = credential.user
    let token = credential.identityToken
    let authCode = credential.authorizationCode
    let realUserStatus = credential.realUserStatus
    let mail = credential.email // nil
    let name = credential.fullName // nil
}
Run Code Online (Sandbox Code Playgroud)

Bil*_*lal 54

似乎是一个错误,但在阅读了苹果论坛上的不同帖子后,这似乎是预期的行为。

所以一些外卖。

  1. 在第一次使用苹果登录(注册)时,请确保在您的后端创建用户帐户。
  2. 如果您的服务器出现任何连接错误,请确保将用户详细信息保存在本地(因为您下次不会收到此信息)并继续重试在您的后端创建帐户。

  3. 为了在设备上进行测试,您可以撤销您的应用程序的 Apple ID 登录。撤销后它将像下次注册一样工作,您将获得详细信息,例如(电子邮件、姓名等)。

使用 IOS 13 撤销对您设备的访问。

iPhone Settings > Apple Id > Password & Security > Apple ID logins > {YOUR APP} > Stop using Apple ID
Run Code Online (Sandbox Code Playgroud)


小智 7

如果您想知道如何第二次和以后检索电子邮件,这里有一个提示:使用包含在 JWT 用户授权数据(包括电子邮件)中编码的identityToken

  1. 导入这个库来解码 JWT:https : //github.com/auth0/JWTDecode.swift
  2. 试试这个代码
    import JWTDecode
    // ...
    if let identityTokenData = appleIDCredential.identityToken,
    let identityTokenString = String(data: identityTokenData, encoding: .utf8) {
    print("Identity Token \(identityTokenString)")
    do {
       let jwt = try decode(jwt: identityTokenString)
       let decodedBody = jwt.body as Dictionary<String, Any>
       print(decodedBody)
       print("Decoded email: "+(decodedBody["email"] as? String ?? "n/a")   )
    } catch {
       print("decoding failed")
    }
Run Code Online (Sandbox Code Playgroud)

或者像这样在 PHP 后端解码它:

    print_r(json_decode(base64_decode(str_replace('_', '/', str_replace('-','+',explode('.', $identityTokenString)[1])))));
Run Code Online (Sandbox Code Playgroud)

  • 仅在首次登录期间,JWT 包含电子邮件。并且绝不会涉及用户的姓名或其他信息。https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_rest_api/verifying_a_user (2认同)
  • 当我尝试时,该电子邮件也在后续的identityToken响应中发送。也许值得注意的是,我选择隐藏我的电子邮件地址,并且令牌包含苹果中继邮件地址...... (2认同)

小智 6

这不是错误,但它表明您的身份验证已成功存储到您的设备设置。

如果您想再次获取所有信息,则需要遵循此说明。

  1. 转到您的设备 -> 设置 -> Apple ID -> 密码和安全 -> 使用您的 Apple ID 的应用程序 -> 您将获得使用苹果登录时使用的应用程序列表 {查找您的应用程序} -> 在您的应用程序行左侧快速{显示删除选项} -> 单击删除

  2. 重新启动您的应用程序或使用苹果按钮抑制登录

现在您可以获取所有信息


Hit*_*esh 5

这是实现 SignIn with Apple 时的正确行为。

ASAuthorizationAppleIDCredential此行为正确,用户信息仅在初始用户注册时发送 。使用同一帐户使用“Sign In with Apple”后续登录您的应用程序不会共享任何用户信息,只会返回 ASAuthorizationAppleIDCredential. 建议您安全地缓存包含用户信息的初始 ASAuthorizationAppleIDCredential,直到您可以验证帐户已在服务器上成功创建。

为了解决这个问题,我们可以将所有必需的信息存储在Keychain. 我已经Singleton为 SignIn With Apple 创建了类。我相信它会对你有所帮助。

Git 来源: https: //github.com/IMHitesh/HSAppleSignIn

您需要按照以下步骤操作:

步骤1

将 AppleSignIn 文件夹添加到您的项目中。

第2步

在 中启用“使用 Apple 登录” Capabilities

步骤:3 -> 重要

转到您的UIViewController“添加容器”视图以使用 Apple 登录。

if #available(iOS 13.0, *) {
    appleSignIn.loginWithApple(view:viewAppleButton, completionBlock: { (userInfo, message) in
        if let userInfo = userInfo{
            print(userInfo.email)
            print(userInfo.userid)
            print(userInfo.firstName)
            print(userInfo.lastName)
            print(userInfo.fullName)
        }else if let message = message{
            print("Error Message: \(message)")
        }else{
            print("Unexpected error!")
        }
    })
}else{
    viewAppleButton.isHidden = true
}
Run Code Online (Sandbox Code Playgroud)


Jua*_*rre 4

这似乎是预期的行为:

此行为正确,用户信息仅在初始用户注册时在 ASAuthorizationAppleIDCredential 中发送。使用同一帐户使用 Apple 登录的后续登录应用程序不会共享任何用户信息,只会返回 ASAuthorizationAppleIDCredential 中的用户标识符。建议您安全地缓存包含用户信息的初始 ASAuthorizationAppleIDCredential,直到您可以验证帐户已在服务器上成功创建。

来源https://forums.developer.apple.com/thread/121496#379297