即使用户只使用一个帐户登录,我是否有办法强制显示Google帐户选择器?
我尝试通过重定向到此URL:
https://accounts.google.com/AccountChooser?service=lso&continue=[authorizeurl]
看起来它能够正常工作,但我不知道是否存在其他可能导致其失败的条件。
即使用户只使用一个帐户登录,我是否有办法强制显示Google帐户选择器?
我尝试通过重定向到此URL:
https://accounts.google.com/AccountChooser?service=lso&continue=[authorizeurl]
看起来它能够正常工作,但我不知道是否存在其他可能导致其失败的条件。
prompt
目前可以具有的值为none
,select_account
和consent
。
none:会导致Google不显示任何UI,因此如果用户需要登录,或者在多次登录的情况下选择帐户,或者在第一次批准时进行同意,则会失败。 它可以在隐形的i-frame中运行,以从先前授权的用户获取令牌,然后再决定,例如呈现授权按钮。
consent:即使用户之前已经授权了您的应用程序,也会强制显示批准页面。 在某些极端情况下可能会有用,例如如果您丢失了用户的refresh_token,因为Google仅在明确同意操作时发出refresh_tokens。
select_account:将导致帐户选择器显示,即使只有一个登录用户,就像您所请求的那样。
select_account
可以与consent
结合使用,如下:
prompt = select_account consent
有些人可能会到这里寻找如何在Microsoft.AspNetCore.Authentication中执行此操作的答案。
我们能够通过在Startup.ConfigureServices方法中使用以下代码来完成它:
services.AddAuthentication()
.AddGoogle(options =>
{
options.ClientId = configHelper.GoogleOAuthClientID;
options.ClientSecret = configHelper.GoogleOAuthSecret;
options.CallbackPath = "/signin-google";
options.AuthorizationEndpoint = string.Concat(options.AuthorizationEndpoint, "?prompt=select_account");
});
另外,在HTML标签中,您可以添加"data-prompt"参数作为"select_account":
<div class="g-signin2" data-onsuccess="onSignIn" data-prompt="select_account">
它会每次强制出现帐户选择器,即使您只使用一个帐户登录
<div class="g-signin2" data-scope="profile email" data-width="298" data-onsuccess="onSignIn" data-prompt="select_account"></div>
,但是每次仍会调用 onSignIn。 - Benjamin Poignantgapi.auth2.getAuthInstance().signOut();
从您的应用中注销用户。这个问题是关于如何在这样做后确保当用户再次点击登录按钮时,他们有机会选择要作为哪个Google帐户登录,而不是在点击登录按钮后立即使用他们当前的Google帐户。 - Mark Amery对于 Google API PHP客户端(https://github.com/google/google-api-php-client),您可以按照以下步骤进行管理:
$client = new Google_Client();
$client->setApprovalPrompt("force");
$client->createAuthUrl();
如果你正在使用gapi
,只需添加prompt: 'select_account'
例如:
gapi.load('auth2', function () {
gapi.auth2.init({
client_id: "client_id.apps.googleusercontent.com",
scope: "profile email", // this isn't required
ux_mode: 'redirect',
redirect_uri: 'https://www.example.com',
prompt: 'select_account'
}).then(function (auth2) {
console.log("signed in: " + auth2.isSignedIn.get());
x = auth2.isSignedIn.get();
auth2.isSignedIn.listen(onSignIn);
var button = document.querySelector('#signInButton');
button.addEventListener('click', function () {
auth2.signIn();
});
});
});