2017-11-04 3 views
0

Facebook/Googleでのメール/パスワードとソーシャルログインの認証を取得しました。もしユーザーがFacebook/Googleで署名していればfirebaseにそのアカウントをリンクできます以前はFacebook/Googleや電子メールでサインアップしていました。firebaseで複数のプロバイダをjavascriptでリンクする方法

私は現在'auth/email-already-in-use'コードをチェックしています。

私は分割された部分を行っていますが、どういうわけか私はリンクする部分を行うことができません。このコードでは、Firebase上でnothingsがリンクされます。

私はFrontendにVuejsを使用していますが、これは基本的にはこれらの種類の認証を処理するJavaScriptです。あなたがもう少しの説明が必要な場合は私に教えてください。

は、と私は電子メール/パスワードのためにサインアップ]ボタンをクリックしたときに取得する:私がしようとし、可能な場合は、あなたのselfの参照を取り除く

<template> 
    <div class="row"> 
     <div class="display-block"> 
      <div class="row"> 
       <div class="input-field col s12"> 
        <input id="email" type="email" v-model="email" class="validate email-input-field" placeholder="Email Address"> 
        <i class="material-icons prefix">email</i> 
       </div> 
      </div> 
      <div class="row"> 
       <div class="input-field col s12"> 
        <input type="password" v-model="password" class="validate password-input-field password-sign-up" placeholder="Password"> 
        <i class="material-icons prefix">lock</i> 
       </div> 
      </div> 
      <div class="row"> 
       <div class="col s12 padding-right-0"> 
        <button class="btn waves-effect waves-light btn-sign-up" v-on:click="signUp" @keyup.enter>Sign Up 
        </button> 
       </div> 
      </div> 
      <div class="row"> 
       <div class="col s12"> 
        <a href="#modal-forgot-passoword" class="modal-trigger">Forgot password ?</a> 
       </div> 
      </div> 
      <p class="light special-text-sign-up">or continue with</p> 
      <div class="social-container"> 
       <a href="#" class="facebook" v-on:click="facebookSignin"><i class="fa fa-facebook"></i>Facebook</a> 
       <a href="#" class="googleplus color-googleplus" v-on:click="googleSignin"><i class="fa fa-google-plus"></i>Google</a> 
      </div> 
     </div> 
     <!-- end display block --> 
    </div> 
</template> 
<script> 
import firebase from 'firebase' 
import axios from 'axios' 


var googleProvider = new firebase.auth.GoogleAuthProvider(); 
var facebookProvider = new firebase.auth.FacebookAuthProvider(); 
export default { 
    name: 'signUp', 
    data: function() { 
     return { 
      email: '', 
      password: '', 
      credential: {} 
     } 
    }, 
    methods: { 
     signUp: function(provider) { 
      var self = this; 
      firebase.auth().createUserWithEmailAndPassword(this.email, this.password).then(
       (user) => { 

        self.registerProfile() 
        user.sendEmailVerification() 
        Materialize.toast('Email verification sent to: ' + this.email, 5000) 
       }, 
       (err) => { 
        console.log("Error Code: " + err.code) 
        if (err.code == 'auth/email-already-in-use') { 
         var credential = firebase.auth.EmailAuthProvider.credential(self.email, self.password) 
         self.credential = credential 
          //check if google-link with facebook or if facebook link with google 
         self.googleSignin().then(function() { 
          firebase.auth().currentUser.link(self.credential).then(function(user) { 
           console.log("Account Linking success: " + user) 
          }, function(error) { 
           console.log("Error on linking accounts" + error) 
          }) 
         }) 
        } else { 
         Materialize.toast('Uppss: ' + err.message, 5000) 
         user.sendEmailVerification() 
        } 

       } 
      ); 
     }, 
     googleSignin: function() { 
      var self = this 
      firebase.auth().signInWithPopup(googleProvider).then(function(result) { 
       var token = result.credential.accessToken; 
       var user = result.user; 
      }).catch(function(error) { 
       var errorCode = error.code; 
       var errorMessage = error.message; 
       console.log(error.code) 
       console.log(error.message) 
      }); 
     }, 
     facebookSignin: function() { 
      firebase.auth().signInWithPopup(facebookProvider).then(function(result) { 
       var token = result.credential.accessToken; 
       var user = result.user; 
      }).catch(function(error) { 
       var errorCode = error.code; 
       var errorMessage = error.message; 
       console.log("error code:" + error.code) 
       console.log("error msg:" + error.message) 
      }); 
     }, 
    }, 

} 
</script> 
+0

エラーが発生しますか?いくつかのブレークポイントでコードをデバッグすると、どこで停止するのですか? – timothyclifford

+0

Googleで試した登録方法で、Facebook/Googleリンクをリンクしていないが、リンク部分はFirebaseで行われていないので、エラーは出ない。本当にわからない理由:() – Muli

+0

コンソールで警告が表示されるのを忘れてしまった:TypeError:self.googleSignin(...)は定義されていない – Muli

答えて

0

TypeError: self.googleSignin(...) is undefined

はここに私のコードです。ここではややリファクタリングのアプローチがあります:

var googleProvider = new firebase.auth.GoogleAuthProvider(); 
var facebookProvider = new firebase.auth.FacebookAuthProvider(); 

var app = {} 

app.data = function() { 
    return { 
     email: '', 
     password: '', 
     credential: {} 
    }; 
}; 

app.signup = function(provider) { 
    firebase.auth().createUserWithEmailAndPassword(app.data.email, app.data.password).then(
     (user) => { 
      self.registerProfile() 
      user.sendEmailVerification() 
      Materialize.toast('Email verification sent to: ' + app.data.email, 5000) 
     }, 
     (err) => { 
      console.log("Error Code: " + err.code) 
      if (err.code == 'auth/email-already-in-use') { 
       var credential = firebase.auth.EmailAuthProvider.credential(app.data.email, app.data.password) 
       app.data.credential = credential 
       //check if google-link with facebook or if facebook link with google 
       app.googleSignin().then(function() { 
        firebase.auth().currentUser.link(app.data.credential).then(function(user) { 
         console.log("Account Linking success: " + user) 
        }, function(error) { 
         console.log("Error on linking accounts" + error) 
        }) 
       }) 
      } else { 
       Materialize.toast('Uppss: ' + err.message, 5000) 
       user.sendEmailVerification() 
      } 
     } 
    ); 
}; 

app.googleSignin = function() { 
    firebase.auth().signInWithPopup(googleProvider).then(function(result) { 
     var token = result.credential.accessToken; 
     var user = result.user; 
    }).catch(function(error) { 
     var errorCode = error.code; 
     var errorMessage = error.message; 
     console.log(error.code) 
     console.log(error.message) 
    }); 
}; 

app.facebookSignin = function() { 
    firebase.auth().signInWithPopup(facebookProvider).then(function(result) { 
     var token = result.credential.accessToken; 
     var user = result.user; 
    }).catch(function(error) { 
     var errorCode = error.code; 
     var errorMessage = error.message; 
     console.log("error code:" + error.code) 
     console.log("error msg:" + error.message) 
    }); 
}; 

export default { 
    name: 'signUp', 
    data: app.data, 
    methods: { 
     signUp: app.signup, 
     googleSignin: app.googleSignin, 
     facebookSignin: app.facebookSignin, 
    } 
} 

物事私はまだ気付か:

  • あなたはしかし、私はどこでもあなたのコード内でこの機能を見ることができませんself.registerProfile()への呼び出しがありますか?
  • signupメソッドで直接dataを参照していますが、これが関数パラメータとして渡された方がよいでしょう - これは可能ですか?
関連する問題