强制用户通过 Google OAuth2 选择帐户

Posted

技术标签:

【中文标题】强制用户通过 Google OAuth2 选择帐户【英文标题】:Forcing a user to choose an account via Google OAuth2 【发布时间】:2016-10-09 06:18:19 【问题描述】:

我的应用程序中有以下工作流程:

    用户登录我的自定义应用程序 用户点击一个按钮来链接他们的 YouTube 帐户 应用程序使用下面的代码清单发出服务器端请求 用户被重定向到 google auth url

此时,会发生以下两种情况之一:

[我从不想要这种行为] - 如果用户只登录了一个 Google 帐户(即 gmail、Google Apps for Domains 等),则永远不会要求用户选择要链接的帐户。它只是假设他们想使用他们登录的那个并继续它的快乐方式。

[我总是想要这种行为] - 如果用户没有登录任何 Google 帐户,或者他们登录了多个 Google 帐户,则系统会要求他们选择要继续使用的帐户。

问题:我有没有办法强制用户选择一个帐户,即使用户当前登录的是单个 Google 帐户?

代码:

private def getFlow() = 
  if (flow == null) 
    logger.info("Using OAuth client secrets file: " + GoogleOAuthService.CLIENT_SECRETS_JSON)
    clientSecrets = GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(),
      new InputStreamReader(getClass.getResourceAsStream(GoogleOAuthService.CLIENT_SECRETS_JSON)));
    redirectUri = clientSecrets.getDetails().getRedirectUris().get(0)
    flow = new GoogleAuthorizationCodeFlow.Builder(
      httpTransport, JacksonFactory.getDefaultInstance(), clientSecrets, SCOPES).setDataStoreFactory(
      dataStoreFactory).setAccessType("offline").setApprovalPrompt("force").build()
  
  flow


def newAuthorizationUrl(userId: String) = 
  val urlRequest = getFlow().newAuthorizationUrl()

  urlRequest.setAccessType("offline")
   .setRedirectUri(redirectUri).setState(userId).build()

【问题讨论】:

***.com/questions/14384354/… 【参考方案1】:

我认为您可以在 url 中添加一些参数来告诉 google 显示用户帐户的同意屏幕,而不是假设默认的 google 帐户。

这可以通过在url中添加prompt=select_account+consent(“+”作为url编码的一部分添加)来完成。

直到现在我还没有尝试过,但也许你可以试试。

【讨论】:

【参考方案2】:

在第一条评论中,@Hans 给出了类似主题的正确链接。但是,如果它没有帮助,那么这里是解决方案:

只需在请求google的url中添加&prompt=consent参数即可。

【讨论】:

以上是关于强制用户通过 Google OAuth2 选择帐户的主要内容,如果未能解决你的问题,请参考以下文章

Google Sign in API OAuth2 错误:youtube 范围内的“invalid_request”

使用Firebase Google用户身份验证更改用户

通过 OAuth 2.0 和私钥(即服务帐户)访问 Google Contacts Api

强制谷歌帐户选择器

如何通过 Google Drive 和 App Engine SDK 使用 Oauth2 服务帐户

Google OAuth2 服务帐户 API 授权