为 Google OAuth2 同意屏幕预选帐户以防止选择多余的帐户

Preselect account for Google OAuth2 consent screen to prevent redundant account selection

在我的网络应用程序中,我想实现以下流程

  1. 用户点击使用 Google 按钮登录
  2. 重定向屏幕中的用户 select 帐户
  3. 我收到了一个包含帐户 ID 和电子邮件地址的 JWT
  4. 我设置账号ID为登录提示,只设置提示'consent'
  5. 我创建了 Auth URL 并再次重定向到 Google 以获得同意
  6. 在下一个同意屏幕中,用户应该只需要批准同意,而不是select他的帐户第二次
  7. 我处理来自同意的回调

根据文档,我实现了“使用 Google 按钮登录”的回调,如下所示;

$payload = $client->verifyIdToken($id_token); //Process  the JWT
if ($payload) {
    $userid = $payload['sub']; //Get the user's unique Google ID
    $client->setLoginHint($userid); //Set the user ID as hint for next consent
    $client->setPrompt('consent'); //Set the approval prompt to consent only
    $client->setScopes(...);
    $client->setAccessType('offline');
    $client->setRedirectUri(...);

    //Create auth URL for consent
    $auth_url = $client->createAuthUrl();
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));

https://developers.google.com/identity/protocols/oauth2/web-server#creatingclient

观察到的行为:

  1. 用户单击使用 Google 按钮登录
  2. 用户点击账号并提供JWT
  3. 用户被重定向到同意屏幕
  4. 用户必须再次 select 帐户 <-- 不需要的行为
  5. 用户同意同意
  6. 用户被重定向到回调

如何正确实施此 OAuth2 许可,以便我不必要求用户 select 他的帐户两次?

显然文档不正确。 login_hint的说明:

If your application knows which user is trying to authenticate, it can use this parameter to provide a hint to the Google Authentication Server. The server uses the hint to simplify the login flow either by prefilling the email field in the sign-in form or by selecting the appropriate multi-login session.

Set the parameter value to an email address or sub identifier, which is equivalent to the user's Google ID.

根据此声明,用户 ID(使用 $payload['sub'] 从 JWT 获取)可以作为参数传递,但这似乎不是正在工作。

当将其更改为实际电子邮件地址时(使用 $payload['email'] 从 JWT 获取)它确实有效,第二个帐户选择屏幕(第 4 步)在观察到的行为中)被跳过。