2013-03-15 48 views
1

我正在升級帳戶以使用新的plus.login範圍,因此我測試了添加一個僅具有userinfo範圍的用戶,然後使用plus.login添加了重新登錄。其結果是引入了授權訪問面板中的新條目,並且從後面的訪問返回的訪問令牌僅具有userinfo權限。我通過進行驗證的令牌調用以及嘗試列出人來測試了這一點。使用Google OAuth更改權​​限

這是預期的行爲,如果是這樣,我應該提前撤銷舊的令牌嗎?我發現/revoke行動是可能的。 Server side removal of Oauth token

更新:Relevant Gist。這是使用Ruby的Omniauth寶石。我實際上並不確定用戶如何在授權訪問面板中看到多於一個條目,但在這種情況下,我可以看到2.在昨天測試了各種場景之後,我有大約6個條目都屬於相同的應用程序!請注意,我並未隨時更改客戶端ID,實際上只有一個客戶端ID。

我希望我描述的情況可以被其他人複製;它只是簡單地通過黑客入侵Google端URL來刪除plus.login範圍,然後再次登錄,同時保留URL。

更新(2):我還發現this gotcha:「您不應該請求userinfo.profile或plus.me與此範圍相結合,因爲它們隱式包含在內,並且會爲您的用戶創建令人困惑的權限對話框。事實上,這不僅僅是一個UX權限問題,看起來谷歌實際上並不存儲針對用戶的「plus.me」範圍,所以這意味着即使用戶已經授予權限,它也會始終顯示OAuth權限對話框(我認爲它是通過簡單的相等性檢查和通知加.me被請求,但不是針對用戶存儲的)。

更新(3):有關使用錯誤登錄的錯誤是由我的代碼執行類似user.login || user.signup而不更新登錄中的令牌數據。所以現在每次登錄後都會更新訪問令牌和刷新令牌。 (我仍然不明白爲什麼每個客戶端用戶組合需要多於一個令牌。)

回答

3

也許您在發佈新的令牌之前沒有取消先前通過身份驗證的客戶端的令牌?

可以升級範圍之後測試撤銷適用於以下的JavaScript演示:使用this page

  1. 授權。 (不要斷開授權客戶端)
  2. 升級您的授權using this page, which includes the calendar範圍作爲示例,並且它具有相同的客戶端。
  3. 現在,如果您查看your issued authorizations subtokens page,您會注意到有兩個條目對應於每個客戶端。
  4. 通過刷新並單擊斷開按鈕從第二頁撤銷。
  5. 返回到your issued authorizations subtokens page。兩套授權的子令牌現在都沒有了。

我對此進行了進一步測試,並對項目進行了更改,添加了驅動器範圍。在將範圍添加到API客戶端項目並授權其他客戶端後,撤銷任何令牌都會撤銷該項目中的所有授權客戶端。

如果要從其他客戶端升級現有的授權憑證,則應在升級現有令牌時撤銷舊的令牌,以避免出現無法按預期工作的憑證實例。

但是,從演示中可以看到,從同一API客戶端撤銷令牌會撤銷額外發出的授權令牌,因此您無需擔心撤銷先前發放的令牌。

撤銷舊標記(例如,您的刷新標記帶有userinfo.email作用域)的最佳理由是您可以稍後嘗試使用該標記爲新作用域創建API調用,即使該標記尚未已經升級到包括額外的範圍,並可能引入奇怪的錯誤。

最後一點:希望用戶將會更習慣於從Manage apps page on Google+中查看他們發佈的授權令牌,該授權令牌可更好地解除連接應用程序的實例。

+0

謝謝,這個演示基本上覆制了大部分我感到困惑的東西,也就是說我還有第二個入口,因爲我認爲升級只會覆蓋它,但我看到它是預期的行爲。 (雖然我仍不確定爲什麼錯誤的令牌回來了,我會重新測試一下。) 我仍然有關於升級現有令牌的最佳實踐的相同實際問題,因爲我最好只想一個令牌(即使我每次都可以用正確的令牌準確地打電話,這是不必要的)。所以我想我的服務器應該在升級的令牌回來時撤銷「所有其他令牌」? – mahemoff 2013-03-15 15:36:00

+0

添加到答案中的其他註釋,因爲註釋中的空間不足。 – class 2013-03-15 15:42:24

+0

謝謝,這對確認其他人應該被撤銷非常有用。所以聽起來好像你在暗示當用戶點擊登錄按鈕時,我的服務器應該首先嚐試撤銷任何現有的令牌,並且只有在收到來自Google服務器的成功響應時才請求新的令牌。換言之,服務器到服務器之間的往返發生在用戶請求和應用服務器的重定向到Google響應之間。 – mahemoff 2013-03-15 15:57:36

2

這聽起來不像正確的行爲。您能否在稍後的通話中獲得訪問令牌並將其插入https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=TOKEN_GOES_HERE - 這將顯示授權的範圍。

您正在實施哪個平臺?如果你有一個可能有用的代碼片段!

更新:嘗試之前進行身份驗證後添加plus.login,我得到了一個新的同意對話,所以這一切都非常順利。可能是客戶特定的問題?

+0

我沒有檢查令牌;這就是我通過驗證的意思,它返回了請求的原始範圍(不帶plus.login)。根據要求添加了代碼鏈接。 – mahemoff 2013-03-15 12:32:21

+0

隨着更新,之後發生了什麼?您是否在訪問面板中看到了兩個條目(https://t.co/BIv3RN67MK),以及當您使用/ tokeninfo時會返回哪個範圍。 – mahemoff 2013-03-15 12:33:17