web-dev-qa-db-ja.com

Appleでサインインを設定する際のエラーの原因?

私は https://firebase.google.com/docs/auth/ios/Apple をフォローしていて、「SHA256ハッシュされたナンスを16進文字列として送信する」というエラーが表示されますしかし、それはそれを解決するための助けを提供していません、そして私の検索は私に働く解決策を与えませんでした。

私のView Controllerコードの抜粋は


        fileprivate var currentNonce: String?

        @objc @available(iOS 13, *)
        func startSignInWithAppleFlow() {
          let nonce = randomNonceString()
          currentNonce = nonce
          let appleIDProvider = ASAuthorizationAppleIDProvider()
          let request = appleIDProvider.createRequest()
          request.requestedScopes = [.fullName, .email]
          request.nonce = sha256(nonce)
            print(request.nonce)

          let authorizationController = ASAuthorizationController(authorizationRequests: [request])
          authorizationController.delegate = self
          authorizationController.presentationContextProvider = self
          authorizationController.performRequests()
        }
        @available(iOS 13, *)
        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()
            print(hashString)
          return hashString
        }
    }
    @available(iOS 13.0, *)
    extension LoginViewController: ASAuthorizationControllerDelegate {

      func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
          guard let nonce = currentNonce else {
            fatalError("Invalid state: A login callback was received, but no login request was sent.")
          }
          guard let appleIDToken = appleIDCredential.identityToken else {
            print("Unable to fetch identity token")
            return
          }
          guard let idTokenString = String(data: appleIDToken, encoding: .utf8) else {
            print("Unable to serialize token string from data: \(appleIDToken.debugDescription)")
            return
          }
          // Initialize a Firebase credential.
            print(nonce)
            let credential = OAuthProvider.credential(withProviderID: "Apple.com",
                                                      idToken: idTokenString,
                                                      accessToken: nonce)

            print(credential)
          // Sign in with Firebase.
          Auth.auth().signInAndRetrieveData(with: credential) { (authResult, error) in
            if (error != nil) {
              // Error. If error.code == .MissingOrInvalidNonce, make sure
              // you're sending the SHA256-hashed nonce as a hex string with
              // your request to Apple.
                print(authResult)
                print(error!)
                print(error!.localizedDescription)
              return
            }
            // User is signed in to Firebase with Apple.
            // ...
          }
        }
      }

Xcodeでエラーが発生したため、このセクションはWebページの指示とは異なります


    let credential = OAuthProvider.credential(withProviderID: "Apple.com",
                                                      idToken: idTokenString,
                                                      accessToken: nonce)

直前にノンスを印刷すると


    let credential = OAuthProvider.credential(withProviderID: "Apple.com",
                                                      idToken: idTokenString,
                                                      accessToken: nonce)

2eNjrtagc024_pd3wfnt_PZ0N89GZ_b6_QJ3IZ_が表示されます

response.nonceの値はcd402f047012a2d5c129382c56ef121b53a679c0a5c5e37433bcde2967225afeです。

明らかにこれらは同じではありませんが、私が間違っていることを理解することはできません。

完全なエラー出力は

Error Domain=FIRAuthErrorDomain Code=17999 "An internal error has occurred, print and inspect the error details for more information." UserInfo={NSUnderlyingError=0x60000388a820 {Error Domain=FIRAuthInternalErrorDomain Code=3 "(null)" UserInfo={FIRAuthErrorUserInfoDeserializedResponseKey={
    code = 400;
    errors =     (
                {
            domain = global;
            message = "MISSING_OR_INVALID_NONCE : Nonce is missing in the request.";
            reason = invalid;
        }
    );
    message = "MISSING_OR_INVALID_NONCE : Nonce is missing in the request.";
}}}, FIRAuthErrorUserInfoNameKey=ERROR_INTERNAL_ERROR, error_name=ERROR_INTERNAL_ERROR, NSLocalizedDescription=An internal error has occurred, print and inspect the error details for more information.}
An internal error has occurred, print and inspect the error details for more information.
6
ruraldev

間違った認証方法を使用している可能性はありますか? ON documentation ノンスを​​取るものは次のようになります:

 let credential = OAuthProvider.credential( withProviderID: "Apple.com", IDToken: appleIdToken, rawNonce: rawNonce )

しかし、ここで使用しているものはアクセストークンを取得します。これが役立つかどうかはわかりません。

0
ethanrj