2013-12-12 114 views
8

當我強制用戶第二次使用approval_prompt=force重新授權我的應用程序時,我如何讓Google向用戶顯示我的應用程序的完整權限列表請求?Google OAuth2重新授權缺少許可頁面上的權限

詳情:

我有一個請求一組的谷歌API的權限,包括access_type=offline一個Web應用程序。我第一次批准它,它顯示正確的同意頁面,列出所有的權限,它看起來像:

first time Google OAuth2 consent page

後來,我向用戶發送回與谷歌授權,使用相同的參數。第二次,它只能顯示「離線訪問」:

enter image description here

爲何不顯示用戶的所有權限?有沒有辦法迫使它第二次詢問用戶所有的權限?爲什麼現在第一次顯示「有離線訪問」?

我們的用戶發現我們的應用程序沒有要求任何實際的權限令人困惑,所以我寧願再次顯示第一個批准屏幕。

我正在做的請求的完整參數如下。網址:

https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force&client_id=1039955146864.apps.googleusercontent.com&redirect_uri=http://localhost:8081/sync/google/callback&response_type=code&scope=openid%20email%20https://www.googleapis.com/auth/admin.directory.group.readonly%20https://www.googleapis.com/auth/admin.directory.group.member.readonly%20https://www.googleapis.com/auth/admin.directory.user.readonly&state=480704597031619284232891277399900450622 

參數爆發:

access_type:offline 
approval_prompt:force 
client_id:1039955146864.apps.googleusercontent.com 
redirect_uri:http://localhost:8081/sync/google/callback 
response_type:code 
scope:openid email https://www.googleapis.com/auth/admin.directory.group.readonly https://www.googleapis.com/auth/admin.directory.group.member.readonly https://www.googleapis.com/auth/admin.directory.user.readonly 
state:480704597031619284232891277399900450622 
+0

我們有同樣的問題。你有沒有想過什麼呢? –

回答

8

我們推出增量權威性,這是事先設計好的。

http://googleplusplatform.blogspot.com/2013/12/google-sign-in-improvements11.html

的想法是,如果用戶已經授予的權限的應用程序,也沒有必要表現出同樣的權限,並要求用戶同意。

如果您正確編寫應用程序,則不會出現這種情況。如果您請求脫機代碼(刷新令牌)並將其存儲在您的後端,則除非您需要獲取新的作用域/權限,否則不應再次請求它。您應該使用將來存儲的刷新令牌。如果用戶在您的站點上時只需要訪問令牌,則可以使用其他流來請求訪問令牌,而無需用戶查看批准頁面。

+0

感謝您的解釋。看起來合理,雖然不是我期望的「approval_prompt = force」(我猜我希望它再次要求所有權限)。我會修復我的應用程序來做其他事情。 –

+1

「如果您正確編寫應用程序,則不會出現這種情況」...我們如何處理收到刷新令牌的情況,但是如果出現故障而無法保存它?當我們再次嘗試時,我們不得不向用戶展示令人困惑的許可「有離線訪問權限」。 –

+0

是的,那是我們需要做得更好並顯示更有意義的頁面的情況。我們正在考慮a)再次顯示所有範圍b)顯示一條消息並要求用戶確認他們嘗試用於登錄的帳戶。例如「選擇您想用來登錄此應用程序的帳戶」。這可以處理用戶登錄到多個帳戶並可能想用其他帳戶登錄的情況。 – nvnagr

0

您必須撤銷訪問令牌並註銷。然後,如果您登錄過程中,它將顯示權限。

public static void RevokeAcess(String accessOrRefreshToken) throws ClientProtocolException, IOException 
{ 
    HttpClient client = new DefaultHttpClient(); 
    HttpPost post = new HttpPost("https://accounts.google.com/o/oauth2/revoke?token="+accessOrRefreshToken); 
    client.execute(post); 
} 

這個網絡過程中應在非UI線程調用或asyntask