【问题标题】:Preselect account for Google OAuth2 consent screen to prevent redundant account selection为 Google OAuth2 同意屏幕预选帐户,以防止多余的帐户选择
【发布时间】:2022-01-10 13:34:50
【问题描述】:

在我的 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 次?

【问题讨论】:

  • $client->setPrompt('consent');
  • 看来我误解了 $client->setPrompt('consent') 所以感谢您的提示,但是无论我尝试哪种设置,我似乎都无法摆脱第二次选择用户帐户(观察行为的第 4 步)

标签: php google-oauth google-authentication google-cloud-identity


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-20
    • 2016-10-09
    • 2014-06-19
    • 2016-07-28
    • 2018-05-05
    • 1970-01-01
    • 2013-10-16
    • 2017-06-17
    相关资源
    最近更新 更多