【问题标题】:Google OAuth2 re-authorization is missing permissions on the consent pageGoogle OAuth2 重新授权在同意页面上缺少权限
【发布时间】:2013-12-12 22:14:48
【问题描述】:

当我使用approval_prompt=force 强制用户第二次重新授权我的应用程序时,如何让 Google 向用户显示我的应用程序请求的整个权限列表?

详情:

我有一个请求一组 Google API 权限的网络应用程序,包括access_type=offline。我第一次批准时,它会显示正确的同意页面,列出所有权限,如下所示:

稍后,我将用户发送回 Google 授权,使用相同的参数。第二次只显示“Have offline access”:

为什么不向用户显示所有权限?有没有办法强制它再次向用户询问所有权限?为什么现在第一次显示“有离线访问权限”?

我们的用户对我们的应用没有请求任何实际权限感到困惑,所以我宁愿再次显示第一个批准屏幕。

我提出的请求的完整参数如下。网址:

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

【问题讨论】:

  • 我们遇到了同样的问题。你有什么想出来的吗?

标签: google-api google-oauth


【解决方案1】:

我们启动了增量身份验证,这是按设计工作的。

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

这个想法是,如果用户已经授予了应用程序的权限,则无需显示相同的权限并要求用户批准。

如果您正确编写应用程序,则不会出现这种情况。如果您请求离线代码(刷新令牌)并将其存储在后端,则不应再次请求它,除非您需要获得一些新的范围/权限。您应该使用将来存储的刷新令牌。如果您只在用户访问您的网站时需要访问令牌,您可以使用其他流程来请求访问令牌,而用户不会看到批准页面。

【讨论】:

  • 感谢您的解释。似乎是合理的,尽管不是我对“approval_prompt=force”的预期(我想我希望它会再次请求所有权限)。我会修复我的应用以做其他事情。
  • “如果您正确编写应用程序,则不会出现这种情况” ...我们如何处理我们收到刷新令牌但出现故障而无法保存它的情况?当我们重试时,我们不得不向用户显示一个令人困惑的权限“具有离线访问权限”。
  • 是的,在这种情况下,我们需要做得更好,展示更有意义的页面。我们正在考虑 a) 再次显示所有范围 b) 显示一条消息并要求用户确认他们尝试用于登录的帐户。例如“选择您要用于登录此应用程序的帐户”。这可以解决用户登录多个帐户并可能希望使用不同帐户登录的情况。
  • 我认为如果你这样做 b) 你仍然想包括 a)。
  • 当我将另一个应用程序从 Google OpenID 迁移到 OAuth 时,这再次让我感到难过。咕咕咕咕。
【解决方案2】:

您必须撤销访问令牌并注销。然后如果你去登录过程,它会显示权限。

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线程或异步任务中调用

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 2020-04-17
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2014-09-27
    • 2016-11-18
    • 1970-01-01
    • 2012-10-17
    相关资源
    最近更新 更多