2017-01-17 12 views
1

匿名ユーザーでfirebase認証を使用しています。ユーザーがサイトにサインアップすると、その資格情報がリンクされます。Firebase認証EmailAuthProvider:期限切れのトークンで匿名ユーザーと信用証明書のリンクが失敗する

//Create the email and password credential, to upgrade the anonymous user.  
let credential = firebase.auth.EmailAuthProvider.credential(email, visitorId); 

//Link the credential to the currently signed in user (the anonymous user). 
auth.currentUser.link(credential).then((user) => { 

    console.log("anonymous visitor successfully upgraded"); 

    }, 

    (error) => { 

     //error upgrading the anonymouse user 
     console.log("Error upgrading anonymous visitor", error); 
}); 

Here is documentation of this approach

これは今日まで素晴らしい仕事をしています。ここ

はコードです。今私は突然、エラーコード:auth/network-request-failedを受け取りました。私はバイオリン弾きで失敗した要求を検査した場合

は、私がの応答を見つける:

{ 
"error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "invalid", 
    "message": "TOKEN_EXPIRED" 
    } 
    ], 
    "code": 400, 
    "message": "TOKEN_EXPIRED" 
} 

}

奇妙なことは、私はリクエストに応じてトークンをデコードした場合、有効期限が中に入ることです将来(トークンのデフォルトの時間長である約1時間先)。私はトークンを生成する時間と、それをユーザーにリンクしようとする時間との間にほとんど遅延がありません。だからなぜ失敗?

私の研究:

The issue here sounds similar, but I has not resolved it for me.

+0

詳しい情報は役に立つことができます。私は推測しかできない。匿名ユーザーが無効になったり削除されたり、同じアカウントでパスワード/電子メールが更新されたりしました。これは、通常、バックエンドによってTOKEN_EXPIREDエラーがスローされたときです。あなたは次のことをしていますか? – bojeil

+0

両方のアカウントでいいえ。ここに私がやっていることがあります: –

+0

両方のアカウントでいいえ。訪問時に最初に行うことは、ユーザーに匿名で署名することです。これは機能します。 userIdがコンソールに出力され、同じuserIdが認証ダッシュボードに表示されていることがわかります。次のステップでは、ユーザー名のユーザー入力を受け入れると(私はここで一意性が保証されます。以前は同じ電子メールが使用されていないことを保証します)、資格情報を取得して匿名ユーザーとリンクしようとします。これは "auth/network-request-failed"エラーで失敗します。また、同じことが異なるネットワーク、ブラウザ、およびデバイスで発生することにも言及する必要があります。 –

答えて

0

firebaseでのサポートチームが問題の単純化したデモだったために尋ねた最初の事。私はこれを最初にしておくべきだった。私の悪い。他のメリットのために、以下のデモコードを含めています。それは問題なく働いた。だから我々の問題は私たちの実装にはっきりとあった。

私はネットワークリクエストに戻りました。第1の手がかりは、firebase.auth()。currentUser.link(信任状)への応答として送信されたネットワーク要求がキャンセルされたとして表示されていることを認識したときのものです。 chrome:// net-internals /#eventsを使用して、> net_error = -3(ERR_ABORTED)が見つかりました。

これは、firebase要求が返される前に、ページがリダイレクトされていたことを意味していました。コードを実行すると、特定の要素がクリックされたときにGoogleタグマネージャのHTMLスニペットがリダイレクトされていることがわかりました。

削除され、問題は解決されました。私はこの死後が誰かにとって有用であることを証明してくれることを願っています。

<html> 
 
    <head> 
 
     <meta charset="utf-8"> 
 
     <script src="https://www.gstatic.com/firebasejs/3.6.2/firebase-app.js"></script> 
 
     <script src="https://www.gstatic.com/firebasejs/3.6.2/firebase-auth.js"></script> 
 
     <script> 
 
     
 
     window.config = { 
 
      apiKey: "<apikey>", 
 
      authDomain: "<authDomain>", 
 
      databaseURL: "<databaseUrl>", 
 
      }; 
 
      
 

 
      //initialize the app 
 
      firebase.initializeApp(window.config); 
 
    
 
      firebase.auth().onAuthStateChanged((user) => { 
 
       if (user) { 
 
       // User is signed in. 
 
       console.log("User is signed in:" + user.uid); 
 
       } else { 
 
       // No user is signed in. 
 
       console.log("no user so sign in anonymously"); 
 
       firebase.auth().signInAnonymously().catch((error) => { 
 
      \t \t \t console.log("marketing.visitor:" + error.code + " " + error.message); 
 
      \t }); 
 
       } 
 
      }); 
 
    
 
      function signInWithEmailAndPassword(){ 
 
       if(event.preventDefault){ 
 
        event.preventDefault(); 
 
       }else{ 
 
        event.returnValue = false; // for IE as dont support preventDefault; 
 
       } 
 
       
 
       var myElement = document.getElementById("lead_email"); 
 
       console.log(myElement.value); 
 
       
 
       //Create the email and password credential, to upgrade the anonymous user. 
 
       let credential = firebase.auth.EmailAuthProvider.credential(myElement.value, firebase.auth().currentUser.uid); 
 
       
 
       //Links the credential to the currently signed in user (the anonymous user). 
 
       firebase.auth().currentUser.link(credential).then((user) => { 
 
        
 
        console.log("anonymous visitor successfully upgraded"); 
 

 
       }, 
 
       
 
       (error) => { 
 
        console.log("error upgrading anonymous user", error); 
 
       }); 
 
       
 
       
 
       return false; 
 
      } 
 
    
 
      
 
     </script> 
 
     
 
     
 
    </head> 
 
    <body> 
 
     <form onsubmit="signInWithEmailAndPassword()"> 
 
      <label class="form-field" for="lead_email">Email Address:</label> 
 
     <input data-name="lead_email" id="lead_email" maxlength="256" name="lead_email" required="required" type="email"> 
 
     
 
     <input type="submit" value="Submit"> 
 
     </form> 
 
    </body> 
 
</html>

関連する問題