1

在我的 webapp 中,我想实现以下流程

  1. 用户单击使用 Google 登录按钮
  2. 用户在重定向屏幕中选择帐户
  3. 我收到带有帐户 ID 和电子邮件地址的 JWT
  4. 我将帐户 ID 设置为登录提示,并将提示设置为仅“同意”
  5. 我创建了 Auth URL 并再次重定向到 Google 以获得同意
  6. 在下一个同意屏幕中,用户应该只需要批准同意,而不是第二次选择他的帐户
  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. 用户必须再次选择帐户 <-- 不需要的行为
  5. 用户同意同意
  6. 用户被重定向到回调

如何正确实施此 OAuth2 同意,以便我不必要求用户选择他的帐户 2 次?

4

1 回答 1

0

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

如果您的应用程序知道哪个用户正在尝试进行身份验证,它可以使用此参数向 Google 身份验证服务器提供提示。服务器使用提示来简化登录流程,方法是预先填写登录表单中的电子邮件字段或选择适当的多登录会话。

将参数值设置为电子邮件地址或子标识符,相当于用户的 Google ID

根据此语句,用户 ID(使用$payload['sub']从 JWT 获取)可以作为参数传递,但这似乎不起作用。

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

于 2021-12-05T00:18:01.220 回答