通过 Google OAuth2 强制用户选择帐户
Forcing a user to choose an account via Google OAuth2
我的应用程序中有以下工作流程:
- 用户登录到我的自定义应用程序
- 用户点击按钮进入 link 他们的 YouTube 帐户
- 应用程序使用下面的代码清单发出服务器端请求
- 用户被重定向到 google 授权 url
此时,发生以下两种情况之一:
[我从不想要这种行为]
- 如果用户只登录了一个 Google 帐户(即 gmail、Google 域应用等...),则永远不会要求用户选择要 link 的帐户。它只是假设他们想使用他们登录的那个,然后继续它的快乐方式。
[我总是想要这种行为]
- 如果用户未登录任何 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()
}
我认为您可以在 url 中添加一些参数来告诉 google 使用用户帐户显示同意屏幕,而不是假定默认的 google 帐户。
这可以通过在 url.
中添加 prompt=select_account+consent
(“+”作为 url 编码的一部分添加)来完成
直到现在我还没有尝试过这个,但也许你可以试试。
在第一条评论中,@Hans 给出了相似主题的正确 link。但是,如果它没有帮助,那么这里是解决方案:
只需在请求 google 的 url.
中添加 &prompt=consent
参数
我的应用程序中有以下工作流程:
- 用户登录到我的自定义应用程序
- 用户点击按钮进入 link 他们的 YouTube 帐户
- 应用程序使用下面的代码清单发出服务器端请求
- 用户被重定向到 google 授权 url
此时,发生以下两种情况之一:
[我从不想要这种行为] - 如果用户只登录了一个 Google 帐户(即 gmail、Google 域应用等...),则永远不会要求用户选择要 link 的帐户。它只是假设他们想使用他们登录的那个,然后继续它的快乐方式。
[我总是想要这种行为] - 如果用户未登录任何 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()
}
我认为您可以在 url 中添加一些参数来告诉 google 使用用户帐户显示同意屏幕,而不是假定默认的 google 帐户。
这可以通过在 url.
中添加prompt=select_account+consent
(“+”作为 url 编码的一部分添加)来完成
直到现在我还没有尝试过这个,但也许你可以试试。
在第一条评论中,@Hans 给出了相似主题的正确 link。但是,如果它没有帮助,那么这里是解决方案:
只需在请求 google 的 url.
中添加&prompt=consent
参数