2013-12-17 21 views
3

因此,在這裏的基本教程(https://developers.google.com/+/web/signin/javascript-flow)後,您可以輕鬆地爲Google帳戶添加客戶端登錄。如何驗證客戶端的Google +登錄?

通過修改代碼來查詢/人/我的,如下:

function signinCallback(authResult) { 
    if (authResult['status']['signed_in']) { 
    gapi.auth.setToken(authResult); 
    gapi.client.load('plus','v1', function(){ 
     var request = gapi.client.plus.people.get({ 
     'userId': 'me' 
     }); 
     request.execute(function(resp) { 
     console.log(resp); 
     }); 
    }); 
} 

您可以訪問到基本賬戶信息;用戶名,圖像,名稱等。

您還有一個來自oauth登錄的有效訪問令牌。

現在,除非你有一個完全的客戶端應用程序,因爲某些時候你必須通知服務器用戶登錄,才能獲得該用戶的應用程序數據。

我想要做的是發佈到/ login/gauth {'access_token':...,'user_id':....},它將用身份驗證cookie進行響應並重定向回來;除了現在我們有一個持久的本地身份驗證令牌,我們可以用它來識別用戶。

在服務器上,我需要做的是使用訪問令牌訪問相同的REST api(/ people/me),並驗證它返回的用戶ID;任何其他提供的信息都可以在客戶端上僞造。

問題是,我找不到驗證/使用服務器端訪問令牌的任何方式。

我可以設置服務器上的一個新的OAuth登錄,並做了服務器只登錄過程,但這是相當複雜的,而且似乎浪費考慮到我已經有效的訪問令牌。

我該如何使用它?

回答

3

您可能想要使用在https://developers.google.com/+/web/signin/server-side-flow列出的混合流。在這個流程中,您的客戶端的功能與現在大致相同,但您的客戶端也會獲得一個短暫的「代碼」,它應該通過安全通道傳遞給服務器。然後,服務器根據服務器驗證它以獲取其自己的訪問權限(可能是刷新)令牌。這比嘗試發送access_token的客戶端更安全,因爲它減少了中間人可以利用它的窗口,並且只能使用一次,從而減少了機會。

3

被接受的答案中的詳細信息是正確的,但有一種更容易的方式,只是模糊地暗示,而不是實際陳述,但如果您仔細閱讀,則會在示例代碼中出現。

的關鍵是:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=TOKEN 

當令牌是客戶端的訪問令牌。這將返回一個JSON塊這樣的:

{u'access_type': u'online', 
u'audience': u'...', 
u'expires_in': 3475, 
u'issued_to': u'...', <--- The client ID; use this to verify access token 
u'user_id': u'1234567890', <--- The unique google user id 
u'scope': u'https://www.googleapis.com/auth/userinfo.profile') 

請注意,這只是驗證:

  • 令牌有效(即。用戶登錄)
  • user_ID的< - >結合的access_token是有效的(而不是客戶端破解是一個不同的用戶)
  • 如果您想查詢更多的應用程序ID是正確

有關用戶的詳細信息,您需要使用其中一個OAuth庫。

在許多情況下,這可能足以唯一標識用戶。