2015-10-05 77 views
1

我正在嘗試將谷歌登錄併入網頁。我已經按照文檔和正在使用這個腳本:Google登錄驗證谷歌ID

function onSignIn(googleUser) { 
var id_token = googleUser.getAuthResponse().id_token; 
var xhr = new XMLHttpRequest(); 
xhr.open('POST', 'https://www.googleapis.com/oauth2/v3/tokeninfo?id_token='+id_token); 
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
xhr.onload = function() { 
    console.log('Signed in as: ' + xhr.responseText); 
}; 
xhr.send('idtoken=' + id_token); 
} 

我真的不明白下位,但 - 我可以看到responseText的對象,但我該怎麼辦呢?我只想驗證用戶是否來自我們的工作,即從我們的域名有一個電子郵件地址(這是一個工作Gmail的谷歌應用程序)。一旦它被驗證了,我想將一個PHP文章發佈到不同的API,但是我認爲在後端製作的任何類型的檢查似乎都很容易欺騙我。我看到有用於驗證令牌here的php庫,但我不知道我應該怎麼做。任何人都可以給我一個指針嗎?

[編輯:信息如下的添加]

所以,我回來的反應是這樣的JSON對象(隨機字符串代替有意義的值):

{ 
"iss": "accounts.google.com", 
"at_hash": "e2CYheQnJjpBfyS2StkM9D", 
"aud": "168479532489-Y23kc3sHhn9frJ65Bwtx8Ff4Xdq5RqSH.apps.googleusercontent.com", 
"sub": "56798241598765321849762", 
"email_verified": "true", 
"azp": "168479532489-Y23kc3sHhn9frJ65Bwtx8Ff4Xdq5RqSH.apps.googleusercontent.com", 
"hd": "example.com", 
"email": "[email protected]", 
"iat": "1444085795", 
"exp": "1444089395", 
"name": "Lucas Smith", 
"given_name": "Lucas", 
"family_name": "Smith", 
"locale": "en", 
"alg": "GU788", 
"kid": "jyaKrpekvYhcRx6KpYSbKhAdYYScLNbEqxqMfCY7" 
} 

現在,根據this我仍然需要檢查aud聲明是否包含我的應用的客戶端ID之一,並且我還可以檢查託管域(此處的hd密鑰)是否與我們的域匹配。

所以,問題就變成了:如果我通過ajax將該JSON對象發送到php頁面,那麼將該對象中的字符串與我從開發者控制檯獲得的字符串進行比較 - 我猜測使用strcmp() - 是我需要做的是什麼?如果他們匹配,做我想做的事情(調用其他API等等)?

對不起,過於謹慎。我在PHP和服務器端認證方面幾乎沒有任何經驗,並且真的不知道欺騙這樣的系統是多麼容易。我想它可能看起來很安全,但是對於想偷偷摸摸地進來的人來說,請大開一扇門。謝謝你的任何建議。

+0

@deek - 爲什麼甚至推薦這個?代碼是100%可讀的,他們正在做的事情很好。這不是一個Ajax問題。根據您的建議,他們仍然會有同樣的問題:「如何處理數據」。 – Jesse

+1

請檢查https://developers.google.com/api-client-library/php/auth/web-app – sandeepsure

+0

盧卡斯,你能告訴我們輸出是在控制檯(刪除個人信息)? – Jesse

回答

1

所以,如果有人認爲這在以後的日子,這是我落得這樣做(警告:我不知道,如果這是最安全的方式,但它似乎確定我)......

  1. 貼id_token到我的PHP頁面
  2. 通過捲曲
  3. 張貼的ID令牌 https://www.googleapis.com/oauth2/v3/tokeninfo得到的迴應從對象往回捲曲,檢查其對澳元 和HD 簡單===比較
  4. 如果他們退房,做API的東西

我希望有人幫助。如果這種方法存在一些災難性的錯誤,請告訴我!