12

我有一個使用google api(谷歌驅動器)的web應用程序。該應用程序被許多客戶端使用,每個客戶端都有一個子域來訪問系統。Google Console中的子域重定向URI

因此域是appdomain.com

並可爲用戶我有foo.appdomain.combar.appdomain.cometc.appdomain.com

但在谷歌控制檯重定向URI我必須手動把重定向的URL,有沒有什麼辦法,我可以使用通配符重定向,使谷歌接受任何子域名,如:* .appdomain.com?

有了這個,我可以讓谷歌的授權與REDIRECT_URI用戶的子域調用:

https://accounts.google.com/o/oauth2/auth?redirect_uri=http://foo.appdomain.com 

回答

15

通配符匹配的子域在谷歌OAuth是不支持的。您可以嘗試使用狀態參數並在其中包含用戶特定的信息。該參數將在響應中返回給您。 有關州的更多信息here

+0

@Lito具有上述使用狀態PARAM提出了一個解決方法。 – LukePOLO

+1

@vlatko看起來這個鏈接已經死了,或者至少重定向到了另一個沒有「狀態」信息的頁面,而且我在任何地方都找不到它。我已經看到了在iframe中加載Google+登錄按鈕的建議,然後讓iframe重新加載父頁面......似乎有點噩夢。 – iopener

2

萬歲有用但不必要的解決方法(感謝複雜自己逼到牆角谷歌)......

我使用谷歌驅動器使用JavaScript API來打開文件選擇器,檢索文件信息/ URL然後使用curl將其下載到我的服務器。一旦我終於意識到我所有的通配符域都必須註冊,我大約有一次中風。

我現在要做的是以下(這是我的使用情況下,迎合你的,因爲你需要)

  1. 在您所在的頁面,創建一個onclick事件開闢了新窗口(https://googledrive.example.com/oauth/index.php?unique_token={some unique token})。

  2. 在新的彈出窗口中,我做了所有的Google Drive驗證,點擊一個按鈕打開文件選擇器,然後至少從文件中檢索到我需要的元數據。然後我在我的數據庫(MySQL)中存儲了令牌(主鍵),access_token,downloadurl和文件名。

  3. 回到第一步,我創建了一個setTimeout()循環,它會每秒用同一個unique_token運行一次ajax調用,以檢查它何時進入數據庫。一旦找到它,我殺死循環,然後檢索內容並按照我的意願去做(在這種情況下,我通過使用curl來獲取文件的單獨上傳腳本來上傳它們)。

這顯然不是處理這個問題的最佳方法,但它比將每個子域輸入到Google雲端控制檯要好。我敢打賭,你可以使用谷歌服務器端的oauth庫來做到這一點,但我的使用案例有點複雜,我很胡思亂想,因爲我在過去的4天中感到沮喪,因爲我花費在與谷歌的一個愚蠢的小集成上。

7

您可以使用「狀態」查詢參數創建主子域以獲取所有谷歌身份驗證響應並將其重定向到正確的子域。

例如,創建google.mydomain。com並將其用作有效的「重定向URI」,Apache可以使用重定向(或重寫)功能將該URL重定向到每個用戶。關於Apache

更多信息重定向在http://www.simonecarletti.com/blog/2009/01/apache-query-string-redirects/

下面的代碼我使用:

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^google\. 
RewriteCond %{QUERY_STRING} state=([a-z0-9]+) 
RewriteRule ^(.*)$ http://%1.mydomain.com/$1 [L] 
+0

對於nginx只是做 返回301 https:// $ arg_state $ request_uri; – LukePOLO