6

AngularJS、Firebase(SDK v3)、GoogleカレンダーAPIを使用してWebアプリケーションを構築しています。私はGoogle OAuthを使用しているユーザーを認証しています。私の目的は、Firebaseのデータベースノードからカレンダーイベントを作成できるようにすることです。しかし、それはのように思えるFirebase Authを使用してGoogle Calendar APIにアクセスする

_fbAuthObject.getRedirectResult() 
    .then(function _readToken(result) { 
     if (result.credential) { 
     _googleToken = result.credential.accessToken; 
     var authHeader = 'Bearer '+ _googleToken; 

     // Just a test call to the api, returns 200 OK 
     $http({ 
      method: 'GET', 
      headers: { 
      'Authorization': authHeader 
      }, 
      url: 'https://www.googleapis.com/calendar/v3/users/me/calendarList/primary' 
     }) 
      .then(function success(response) { 
      console.log('Cal response', response); 
      }, 
      function error(response) { 
      console.log('Error', response); 
      }); 

:認証リダイレクトがとして利用可能であるので、私はリダイレクトフローを使用して認証してい

_authProvider = new firebase.auth.GoogleAuthProvider(); 
// Get permission to manage Calendar 
_authProvider.addScope("https://www.googleapis.com/auth/calendar"); 
_fbAuthObject.signInWithRedirect(_authProvider); 

:これまでのところ私はカレンダーのスコープへのアクセスを要求するために管理してきました最初のログインの外では、Firebase SDKを介してGoogleのアクセストークンを取得することはできません。 Firebase JWTトークンにアクセスすることは可能ですが、Calendar APIでは使用できません。私はアクセストークンを保存することができましたが、これはトークンをリフレッシュするときに問題を解決しません。Firebase SDKで現在のGoogle Accessトークンを取得する方法はありますか?そうでない場合、ユーザーを2回認証するには?

UPDATE 1:

someone else has struggled with similar problems with Facebook authenticationのように思えます。その質問にはlink to the Firebase documentationがあり、Firebase認証でアクセストークンが保持されなくなったと記載されています。トークンのリフレッシュはどのように処理できますか?これには本当に答えはありませんか?

UPDATE 2:

だから、私はこの問題についての機能要求とFirebaseサポートに連絡し、彼らは私に次のような答えた:私たちを書くためにあなたの時間を割いて

感謝を。

ここにあなたの意見があります。これは本当に良い提案です。私たちは、あなた自身のような多くのユーザーが、更新時にトークンにアクセスするOAuth機能を望むことは間違いなく知っています。私たちは潜在的な解決策を模索していますが、これがすぐに利用できるかどうかは保証できません。私たちはあなたのフィードバックを前進させることを考慮しておきます。継続的な改善は私たちのコミュニティにとって非常に重要なので、これを持ってきてくれてありがとう!

今後の更新については、リリースノートを確認してください。

だから、現時点でFirebase SDKからアクセストークンを入手できないようです。私はまだ回避策を見つけようとしているので、誰かが有効な解決策についてのアイデアを持っていれば、それを聞いてうれしいです。もちろん、自分で解決策を見つけることができれば、ここに投稿します。

+1

私は、currentUserオブジェクトに詳細を追加する必要があると思いますが、現在のユーザーオブジェクトに何が存在するかを調べてみましたか? 'firebase.auth()。currentUser;' https://firebase.google.com/docs/auth/web/manage-users –

+0

はい、そこからGoogleのトークンを見つけることはできません。また、getToken()関数を試しましたが、Firebase JWTトークンをGoogle APIで使用することはできません。 – RoniPa

+0

https://stackoverflow.com/questions/49182671/is-it-possible-to-add-events-to-a-users-google-calendar-via-firebase-server-sid/49183647#49183647も参照してください。 – Kato

答えて

4

Google API JavaScriptクライアントを使用してFirebase以外の認証を処理することで、この問題を回避できました。このソリューションでは、Google認証クライアントをdocumented hereとする必要があります。 Firebaseのサインインフローを手動で処理する方法については、hereを参照してください。

gapi.auth2.getAuthInstance().signIn() 
    .then(function _firebaseSignIn(googleUser) { 
     var unsubscribe = firebase.auth().onAuthStateChanged(function(firebaseUser) { 
     unsubscribe(); 
     // Check if we are already signed-in Firebase with the correct user. 
     if (!_isUserEqual(googleUser, firebaseUser)) { 
      // Build Firebase credential with the Google ID token. 
      var credential = firebase.auth.GoogleAuthProvider.credential(
      googleUser.getAuthResponse().id_token); 

      // Sign in with credential from the Google user. 
      return firebase.auth().signInWithCredential(credential) 
      .then(function(result) { 
       // other stuff... 
      }); 

_isUserEqual機能:これはまだ私のための理想的なソリューションではありませんが、それはのために働く

function _isUserEqual(googleUser, firebaseUser) { 
    if (firebaseUser) { 
    var providerData = firebaseUser.providerData; 
    for (var i = 0; i < providerData.length; i++) { 
     if (providerData[i].providerId === firebase.auth.GoogleAuthProvider.PROVIDER_ID && 
     providerData[i].uid === googleUser.getBasicProfile().getId()) { 
     // We don't need to reauth the Firebase connection. 
     return true; 
     } 
    } 
    } 
    return false; 
} 

今、私はこのようなアクセストークンを参照することができます今、FirebaseとCalendar APIの両方を認証できます。

関連する問題