2017-01-27 6 views
-1

Firebaseを使用してFacebookでのログインを実装していますが、データベースに存在し、アプリが見つかった場合はログに記録されています。このメソッドが非同期であるため、ユーザが登録ビューコントローラに見つからない場合はユーザを誘導し、ユーザが動作しないようにします。誰でも手伝っていただければ幸いです。ここに私のコードです:Firebaseを使用したFacebookのログイン - Swift iOS

func getFacebookUserInfo() { 
    if(FBSDKAccessToken.current() != nil){ 
     let graphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields" : "id,name,gender,email,education"]) 
     let connection = FBSDKGraphRequestConnection() 
     connection.add(graphRequest, completionHandler: { (connection, result, error) -> Void in 
      let data = result as! [String : AnyObject] 
      let email = data["email"] as? String 

      let emailRef = FIRDatabase.database().reference().child("usernameEmailLink") 
      emailRef.queryOrderedByValue().observe(.childAdded, with: { snapshot in 
       if let snapshotValue = snapshot.value as? [String: AnyObject] { 
        for (key, value) in snapshotValue { 

         if(value as? String == email){ 
          self.stringMode = snapshotValue["mode"]! as! String 
          self.username = key 
          self.parseUserInfoFromJSON() 
          return 
         } 

        } 
       } 

      }) 


     }) 
     connection.start() 

    } 

} 

ありがとうございます。

+1

質問は少し不明ですので、答えるのは難しいです。ユーザーがFacebook認証で認証すれば、認証されます。なぜあなたは自分のメールを検索しますか?すなわち、Firebase Facebook APIはFirebaseユーザを先に作成する。 [Facebook認証]の手順4と5を参照してください(https://firebase.google。 – Jay

+0

@Jay私のアプリケーションでは、ユーザーが登録されていることが必要です – Reem

+0

それはどういう意味なのかはっきりしませんが、あなたが探している答えかもしれません。 – Jay

答えて

3

Firebaseでのユーザの登録/存在は、おそらく質問のgraphRequestコードの前に決定されるべきです。

メールアドレスは動的であるため、ユーザーが存在するかどうかを確認するために使用するべきではありません。つまり、電子メールアドレスが「[email protected]」のユーザは、自分の電子メールを「[email protected]」に更新します。電子メールを使って登録を確認すると、その電子メールが変更されると完全に破損する可能性があります。

Firebaseのuidは静的でユニークなので、そのために使用してください。

私たちはコードの小さなスニペットしか持っていないので、使用されている正確なシーケンスはわかりません。この答えは、可能なシーケンスを概説する擬似コードです。

「登録済み」とは、ユーザーが何らかの種類のアプリ登録シーケンスを行ったことを意味し、ユーザーがFirebaseに作成された(登録済みの/登録済みの)ことを意味します。

一般に、実際のログイン操作を処理するためのログインボタンとデリゲートメソッドがあります。

は、ユーザーが自分のログインに入り、

func loginButton(loginButton: FBSDKLoginButton!, 
       didCompleteWithResult result: FBSDKLoginManagerLoginResult!, 
       error: NSError?) { 

Firebaseは、その時点で、そのユーザーの資格情報(以下Firebaseドキュメントの引用を参照)

let credential = FIRFacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString) 

を得ることができ、サインインログインボタンをタップしますユーザがFirebaseユーザノードに登録(存在)されているかどうかを確認します。

初めて、新しいユーザーアカウントが 作成され、資格情報-、ユーザー名とパスワード あるにリンクされているユーザーがサインインした後Firebaseドキュメント

から

FIRAuth.auth()?.signIn(with: credential) { (user, error) in 
    if let error = error { //failed due to an error 
    return 
    } 

    let uid = user.uid //the firebase uid 
    let thisUserRef = userRef.child(uid) //a reference to the user node 

    //check to see if the user exists in firebase (i.e. is Registered) 
    thisUserRef.observeSingleEvent(of: .value, with: { (snapshot) in 

    //if snapshot exists 
     //then the user is already 'registered' in the user node 
     // so continue the app with a registered user 
    //if not, then need to have the user go through a registration sequence and 
    // then create the user (make them registered) in the user node 
     doRegisterUser(user) 
    }) 


func doRegisterUser(user: FIRUser) { 

    //get what you need from the user to register them 
    // and write it to the users node. This could be from additional 
    // questions or from their Facebook graph, as in the code in the 
    // question 

    //for this example, we'll just write their email address 
    let email = user.email 
    let dict = ["email": email] 

    //create a child node in the users node with a parent of uid 
    // and a child of email: their email 
    thisUserRef.setValue(node) 

    //next time the user logs in via FB authentication, their user node 
    // will be found as they are now a 'registered' user 
} 

、ユーザーがサインインしたプロバイダ情報を認証します。この 新しいアカウントはFirebaseプロジェクトの一部として保存されている、とにかかわらず、プロジェクト内のどのユーザがサインの をすべてのアプリケーション間でユーザーを識別するために使用 することができます。

私が述べたように、これは非常に擬似的なコードですが、解決策の可能なシーケンスを提供します。

+0

パーフェクト。これはFacebookのサインインベースfirebaseが登録とログインの両方として機能するので意味があります。ユーザーが最初にログインしたのか、返信したのかを把握する方法はありません。 – Annjawn

関連する問題