2016-07-20 14 views
2

以下のコードを実行すると、認証ウィンドウがポップアップし、ユーザーがログインを確認します。この部分は動作します。認証ボタンがクリックされると、これは同じウィンドウ内の前のタブにリダイレクトされます(親ウィンドウにないポップアップ内)。認証がユーザーによって確認された後、このポップアップウィンドウを閉じるにはどうしたらいいですか?また、どのようにしてURLから認証コードを取り戻すことができますか?たとえば、以下のコードでは、最初の "console.log(event.url);"実行されません。Angularjsでサードパーティのログインを使用して認証を処理する方法

var redirectUri = "http://localhost:8100/callback"; 

    var ref = window.open('https://www.example.com/oauth/authorize?client_id=' + clientID + '&redirect_uri=' + redirectUri + '&scope=write&response_type=code&approval_prompt=force', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes'); 

    ref.addEventListener('loadstart', function (event) { // THIS IS NOT TRIGGERED FOR SOME REASON 

     console.log(event.url); 

     if ((event.url).indexOf(redirectUri) === 0) { 
      requestToken = (event.url).split("code=")[1]; 

      $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; 
      $http({ 
        method: "post", 
        url: "https://www.example.com/oauth/token", 
        data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&code=" + requestToken 
       }) 
       .success(function (data) { 
        $scope.data = data; 
        console.log(event.url); 

       }) 
       .error(function (data, status) { 
        deferred.reject("Problem authenticating"); 
       }); 
     } 
    }); 

以下は、アプリケーションで使用されるタブです。コールバックの後でtab.exampleに戻るにはどうすればよいですか?

// setup an abstract state for the tabs directive 
    .state('tab', { 
    url: '/tab', 
    abstract: true, 
    templateUrl: 'templates/tabs.html' 
}) 

.state('tab.example', { 
     url: '/example', 
     views: { 
      'tab-example': { 
       templateUrl: 'templates/tab-example.html', 
       controller: 'ExampleAPICtrl' 
      } 
     } 
    }) 
    .state('callback', { 


    }); 

// if none of the above states are matched, use this as the fallback 
$urlRouterProvider.otherwise('/'); 
+0

'http.php'が実行されなかった場合、' console.log'が実行されなかったことは意味がありません。時にはログがコンソールウィンドウのb/cに表示されないことがあります。しかし、それは実行されていないことを意味しません。 'console.log'にブレークポイントを入れてみてください –

+0

基本的にウィンドウハンドラはトリガされず、そのハンドラでは何も実行されません。私は複数のハンドラを試したが、何もトリガされていない/ – Andrei

+0

あなたのコードには欠けているようだ。私は何が行われたのか、そしてなぜそれが理解できないのですか。たとえば、なぜ 'loadstart'イベントを待ち受けるのですか?そこから放出されるのはどこですか?あなたのアプリは、別のウィンドウから送信されたイベントをピックアップすると思いますか? –

答えて

0

イベントコールバックを聞くことができるようにサードパーティプロバイダをラップするサービスが必要です。

私が使用した偉大なライブラリの実装:

mrzmyr Angular-Google-Plus

librarieのアプローチの中心は、次のコードスニペットである:あなたがしたい

 NgGooglePlus.prototype.login = function() { 
      deferred = $q.defer(); 
      gapi.auth.authorize({ 
       client_id: options.clientId, 
       scope: options.scopes, 
       immediate: false, 
       approval_prompt: "force", 
       max_auth_age: 0 
      }, this.handleAuthResult); 
      return deferred.promise; 
     }; 

+0

私はグーグルプラスを統合していません、私が見ているのは、それが何でも(その部分を気にしないで)何でも認証するサードパーティのアプリです。 – Andrei

+0

説明があまりにも曖昧です。それはあなた自身のサードパーティのアプリですか?それがあなたのものであろうとなかろうと、もっと説明が必要です。実際の実装の詳細。 –

+0

正直言って、それがGoogle、FB、Twitter、または独自の実装であっても、アプローチは基本的に同じです。新しいウィンドウ呼び出しをサービスにラップして、約束またはコールバックを取得したいとします。そして、プロバイダーはコールバックや解決の約束を持っていなければなりません。他に何が必要なのか分かりません。 –

0

第三者とのログイン、良い情報をログインシステムに送信することによってログインを実行するログインサービスを作成するアドバイス(他のAPI、WebアプリケーションイオンとURL ...)。で返すようにhttps://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

:そのような は、あなたのサービスでは、イベントを進めて行きたい場合は、このリンクをたどることができ、よりアクション

$scope.$broadcast('loadstart', { 
    someProp: 'send parameter to your event in the data object' 
}); 

$scope.$on('loadstart', function (event, data) { 
    //your function the tretment of the reply 
}); 

を実行するには、アプリケーションで使用できるイベントを発することができますあなたのtab.exampleではhttpリクエストの.success部分で$ stateを試すことができます。このサービスでは、次の状態を選択することができます。

$state.go('tab.example'); 
関連する問題