Firebaseのドキュメントを見ながらこんなに簡単にOAuthやってくれるならと思いやってみました。
解決できない問題について教えていただきたくお願いいたします。
やったこと
- プロジェクトをfirebaseで初期化(Hostingのみ選択)
- ホスティング用のデフォルトの構成がプロジェクトフォルダ内にできる
- 処理部分を追加するためにmain.jsをindex.htmlに加え以下のようになった
index.html
HTML
1<!DOCTYPE html> 2<html> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 <title>Welcome to Firebase Hosting</title> 7 <link rel="stylesheet" href="../style.css"> 8 <script defer src="/__/firebase/5.8.3/firebase-app.js"></script> 9 <script defer src="/__/firebase/5.8.3/firebase-auth.js"></script> 10 <script defer src="/__/firebase/init.js"></script> 11 <script src="./jquery.min.js"></script> 12 </head> 13 <body> 14 <h4>アクセストークン</h4> 15 <div>TOKEN:</div> <div class="token"></div> 16 <div>SECERET:</div><div class="secret"></div> 17 <script src="./main.js"></script> 18 </body> 19</html>
main.js
JavaScript
1 document.addEventListener('DOMContentLoaded', function() { 2 const provider = new firebase.auth.TwitterAuthProvider(); 3 let loggedInnUser; 4 console.log('current user'+loggedInnUser); 5 firebase.auth().onAuthStateChanged(function(user) { 6 if (user) { 7 loggedInnUser = user; 8 } else { 9 console.log('no loginn user'); 10 } 11 }); 12 if(!loggedInnUser){ 13 // firebase.auth().signInWithRedirect(provider) 14 firebase.auth().signInWithPopup(provider).then(function(result) { 15 var token = result.credential.accessToken; 16 var secret = result.credential.secret; 17 loggedInnUser = result.user; 18 $('.token').text(token); 19 $('.secret').text(secret); 20 }).catch(function(error) { 21 var errorCode = error.code; 22 var errorMessage = error.message; 23 var email = error.email; 24 var credential = error.credential; 25 }); 26 } 27 });
アプリ設置先(TWT認証はポップアップ方式)
困っていること
上記のようにOAuthの認証をポップアップでやると問題なく
意図したとおりの動きになるのですが
ポップアップの方式はスマホでは推奨されていないらしく(ドキュメント内より)
リダイレクトの方式に変えてみました(上記のコメントアウトしている部分です)
するとツイッターでの認証が終わって帰ってきてもonAuthStateChangedのハンドラが呼ばれないので
ログインユーザーがnullのままで認証と戻りの無限ループに陥ります。
解決のためにやってみたこと
ドキュメントにあるようにリダイレクト後の処理はこちら・・・みたいな部分を
追加したのですが、やはりハンドラが呼ばれないのです
JavaScript
1 firebase.auth().getRedirectResult().then(function(result) { 2 loggedInnUser = result.user; 3 }).catch(function(error) { 4 // ... 5 });
ひょっとしてsignInWithRedirectから直接、処理を書かないといけないのかと思い
以下のようにしましたが反応はなく、どうやらthenableではないような感じです
JavaScript
1firebase.auth().signInWithRedirect(provider).then((res) => { 2 loggedInnUser = res.user; 3})
また、ひょっとして戻り値になにかあるのかと思い、見てみましたが
私には意味不明なオブジェクトが返ってきてるだけでした
JavaScript
1let res = firebase.auth().signInWithRedirect(provider); 2console.log(res);
質問
signInWithRedirectを使って、認証後に得たアクセストークンを使ったアプリを作っていくために
この部分をどう変更すればいいでしょうか?
環境
OS: Mojave
NodeJS: 10.6.0
npm: 6.3.0
firebase: 6.3.1
GoogleChrome: 72
FireFox: 65.0.1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。