2013-12-12 76 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