2015-12-17 50 views
2

我有一個使用谷歌Apps腳本API執行調用返回我需要的數據功能的單個頁面的Web應用程序中調用gapi.auth.authorize。我基於quick start sample code provided by Google的我的項目。替代每次

這需要使用OAuth,我通過使用the client JavaScript library provided by Google的函數來完成該操作。

第一次要求用戶進行身份驗證以下函數用於​​:

gapi.auth.authorize({client_id: CLIENT_ID, scope: SCOPES, immediate: false}, handler); 

後續API請求,還必須提供身份驗證令牌,所以我呼籲相同的功能,但immediate: true

gapi.auth.authorize({'client_id': CLIENT_ID, 'scope': SCOPES, 'immediate': true}, handler); 

每一次,gapi.auth.authorize被調用時,一個新的IFRAME被添加到頁面,看似存儲認證操作的結果/令牌等

所以,是的,一切正常,但我想,必須有這樣做的更好的方法。

是否有另一種方法可以在初始驗證後進行後續API調用,而不需要使用gapi.auth.authorize並在頁面中添加另一個IFRAME

據谷歌稱:

注意

初始用戶授權後,調用gapi.auth.authorize在使用即時:真正的模式將獲得身份驗證令牌不用戶交互。

回答

4

總之,你不能避免的iframe(或彈出這是舊的方式),除非你使用「離線」模式。這是交易:
有兩種不同的方式來請求權限,「離線」或「不離線」。

離線,的oauth2給你給你的「刷新令牌」(OK如果用戶撤消谷歌的帳戶安全頁面的權限,或對某些領域它不是真的永遠永久權限,如果用戶改變他們的密碼)。

這個特殊的令牌可以讓您隨時創建新的訪問令牌,只需對API執行「GET」調用,而無需任何用戶干預。 就你而言,這是你需要的模式,沒有辦法繞過它,這就是它存在的原因,你必須特別小心地安全地存儲它,等等。

不離線模式下,您只會獲得一個臨時權限(「訪問令牌」在1小時內到期),您不會得到「刷新令牌」。但這是如何工作的?某處必須有一些刷新令牌或私人存儲的東西。

Authentication using the Google APIs Client Library for JavaScript利用瀏覽器安全功能來執行此操作。特別是,瀏覽器爲每個子域保存存儲和cookie,一旦你登錄到瀏覽器,google.com將存儲或使用cookie來保護它發送給谷歌的參數以驗證你的身份。
那麼,如何讀取這些值呢?打開google.com網址是讓javascript讀取值的唯一方法。 Google允許使用特殊參數,因此可以傳回訪問令牌。如何打開頁面?通過「iframe」或「popup」是瀏覽器目前支持的唯一方式。

這允許谷歌頁面像一個安全的代理服務器問谷歌的東西。頁面iframe或打開谷歌頁面(作爲彈出窗口)不能僞造自己的URL,所以這個「代理」知道什麼頁面要求數據。然後代理可以通過谷歌服務器驗證此調用方的範圍,並返回一個新的訪問令牌。黑客無法從服務器僞造這個,因爲它沒有所需的cookie(存儲在每個用戶的瀏覽器下的谷歌子域下,這是「在線」模式工作的唯一地方。)

「popup」是舊的在瀏覽器已經確保iframe之前,但是當彈出窗口打開並立即關閉時(在上面的鏈接中搜索「震撼」),至少會導致「閃光」

因此,後來Google提供了「iframe」更順暢的體驗。使用iframe是上面提到的鏈接的「直接」模式。

TLDR:必須使用「脫機」或破解用戶的瀏覽器。

+0

感謝您的回覆。如果可能的話,我想避免請求對作用域的離線許可。當我調用'authorize'時,我找回了一個令牌對象。我不知道如何存儲它的'access_token'屬性,並且在請求之前不需要調用'authorize'就可以在後續請求中重新提供它。表面上看,即使在「脫機許可」情況下也需要這樣做。有沒有我可以調用的方法或其他我可以在提出請求之前設置授權標頭的方法?希望我有道理。 – bobleeswagger

+0

訪問令牌將在一小時內過期。如果可以的話,你會繞過所需的離線許可。 oauth2客戶端實現依賴於(未提供的)瀏覽器安全功能,例如必須點擊某些內容(用戶操作以顯示權限對話框)或iframe,以便安全地爲您的代碼提供基於Google存儲的Cookie的新訪問令牌在瀏覽器中。因此需要iframe,因此它可以使用google.com域中的谷歌cookie。 –

+0

非常感謝您的全面回覆。非常感謝。你讓它「有道理」。因此,我需要保持原樣並繼續調用授權,然後執行(並對IFRAMES進行架設),或者添加脫機範圍,然後爲用戶首次授權請求並存儲請求令牌。代表用戶的後續請求將通過提供其各自的請求令牌(我需要存儲和保護)進行授權。這將允許我反過來獲取不含大量IFRAMES的訪問令牌等。非常感謝! – bobleeswagger