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

时间:2016-06-08 19:50:32

标签: google-oauth google-oauth2 google-oauth-java-client

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

  1. 用户登录我的自定义应用
  2. 用户点击按钮即可关联其YouTube帐户
  3. 应用程序使用下面的代码列表发出服务器端请求
  4. 用户被重定向到google auth url
  5. 此时,发生以下两件事之一:

    [我从不想要这种行为]   - 如果用户只登录了一个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()
    }
    

2 个答案:

答案 0 :(得分:4)

我认为您可以在网址中添加一些参数,告诉谷歌使用用户帐户显示同意屏幕,而不是假设使用默认的Google帐户。

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

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

答案 1 :(得分:3)

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

只需在请求Google的网址时添加 &prompt=consent 参数。