为 Google OAuth2 同意屏幕预选帐户以防止选择多余的帐户
Preselect account for Google OAuth2 consent screen to prevent redundant account selection
在我的网络应用程序中,我想实现以下流程
- 用户点击使用 Google 按钮登录
- 重定向屏幕中的用户 select 帐户
- 我收到了一个包含帐户 ID 和电子邮件地址的 JWT
- 我设置账号ID为登录提示,只设置提示'consent'
- 我创建了 Auth URL 并再次重定向到 Google 以获得同意
- 在下一个同意屏幕中,用户应该只需要批准同意,而不是select他的帐户第二次
- 我处理来自同意的回调
根据文档,我实现了“使用 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
观察到的行为:
- 用户单击使用 Google 按钮登录
- 用户点击账号并提供JWT
- 用户被重定向到同意屏幕
- 用户必须再次 select 帐户 <-- 不需要的行为
- 用户同意同意
- 用户被重定向到回调
如何正确实施此 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 步)在观察到的行为中)被跳过。
在我的网络应用程序中,我想实现以下流程
- 用户点击使用 Google 按钮登录
- 重定向屏幕中的用户 select 帐户
- 我收到了一个包含帐户 ID 和电子邮件地址的 JWT
- 我设置账号ID为登录提示,只设置提示'consent'
- 我创建了 Auth URL 并再次重定向到 Google 以获得同意
- 在下一个同意屏幕中,用户应该只需要批准同意,而不是select他的帐户第二次
- 我处理来自同意的回调
根据文档,我实现了“使用 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
观察到的行为:
- 用户单击使用 Google 按钮登录
- 用户点击账号并提供JWT
- 用户被重定向到同意屏幕
- 用户必须再次 select 帐户 <-- 不需要的行为
- 用户同意同意
- 用户被重定向到回调
如何正确实施此 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 步)在观察到的行为中)被跳过。