2016-10-05 76 views
2

我試圖通過他們的嚮導登錄/註銷從谷歌添加到/: https://developers.google.com/identity/sign-in/web/sign-in谷歌登入按鈕在角2+

但我面臨的一些問題。

的index.html:

<meta name="viewport" content="width=device-width, initial-scale=1"> 
    <script src="https://apis.google.com/js/platform.js" async defer></script> 
    <meta name="google-signin-client_id" content="**my-google-api-key**.apps.googleusercontent.com"> 
    <script> 
    gapi.load('auth2',function() { 
     gapi.auth2.init(); 
    }); 
    </script> 

app.component.html:

<div class="g-signin2" data-onsuccess="onSignIn"></div> 
<a href="#" onclick="signOut();">Sign out</a> 

app.component.ts:

public onSignIn(googleUser):void { 
    var profile = googleUser.getBasicProfile(); 
    console.log('ID: ' + profile.getId()); // Do not send to your backend! Use an ID token instead. 
    console.log('Name: ' + profile.getName()); 
    console.log('Image URL: ' + profile.getImageUrl()); 
    console.log('Email: ' + profile.getEmail()); 
    } 
    public signOut():void { 
    var auth2 = gapi.auth2.getAuthInstance(); 
    auth2.signOut().then(function() { 
     console.log('User signed out.'); 
    }); 
    } 

個問題:

  1. succussfully登錄後,onSignIn功能不會被調用,所以打印什麼,但簽到工作。
  2. 在signOut函數中我有錯誤:「找不到名字'gapi'。」但註銷正在工作。

問:

谷歌告訴我們,不要使用googleUser.getBasicProfile()的getId()作爲用戶ID,但使用ID令牌這一翻譯:googleUser.getAuthResponse()id_token.sub 。 爲什麼?

+0

你成功完成了嗎? 我被困在同一件事上... – mrgoos

+0

是的,我搬到了firebase,在那裏你有簡單的方法來登錄谷歌/臉譜/ ....它很容易。你調用login並訂閱你登錄後recive對象的auth對象的變化(如果它成功了,你會得到用戶的詳細信息等)。我用一個dbase的firebase替換我的應用程序中的服務器端,但我想我會使用firebase api來登錄,雖然谷歌即使我不會用它作爲dababse。 CHECK OUT:來自github的angularfire和這個鏈接:https://github.com/firebase/angularfire/blob/master/docs/guide/user-auth.md –

+0

很酷。是的firebase是偉大的,但我不能在我的項目中使用它。我確實找到了一種方法,我會把它作爲答案。 – mrgoos

回答

6

我使用NgZone解決了這個問題。不知道是否是最好的方式,但它是最好的,直到我找到另一個:)

import { Component, NgZone } from '@angular/core'; 
...... 
...... 
constructor(ngZone: NgZone) { 
    window['onSignIn'] = (user) => ngZone.run(() => this.onSignIn(user)); 
} 
...... 
...... 
onSignIn(googleUser) { 
    //now it gets called 
...... 
}