是否可以通过JS客户端库为Drive使用授权时正确选择任何可用的Google帐户?

Dav*_*vid 21 google-account oauth-2.0 google-api-client google-drive-api

我有一个现有的支持Google Drive的应用程序正在使用Google Java客户端库和服务器流程验证.

如果您没有登录该应用程序并导航到该网址并且您已在该浏览器上登录了多个Google帐户(只有一个个人Google帐户,则其他任何一个都必须是Google商家帐户)OAuth回调优惠选择要使用的Google帐户的选项.

但是,在测试使用JavaScript客户端库的开关时,我无法使用gapi.auth.authorize激活多个帐户选择屏幕.是否可以使用JS库处理多个帐户?

更新:我尝试了immediate参数false.只要我不在弹出窗口中更改帐户,我就可以登录.如果我更改帐户,我会:

https://accounts.google.com/o/oauth2/auth?client_id=433863057149.apps.googleusercontent.com&scope=https://www.googleapis.com/auth/drive.file+https://www.googleapis. COM /认证/ drive.install + HTTPS://www.googleapis.com/auth/userinfo.email+https://www.googleapis.com/auth/userinfo.profile&immediate=false&redirect_uri=postmessage&origin=https:// drivedrawio. appspot.com&代理= oauth2relay593063763&RESPONSE_TYPE =令牌状态= 701344514&AUTHUSER = 1

在一个新标签中没有任何反应.我制作了一个视频来演示.

更新2:已接受针对需要双重选择多个帐户的JS客户端库的此错误.

Nic*_*ier 43

由于以下参数,您没有获得多用户选择屏幕:authuser=0 这会自动选择您登录的第一个帐户(authuser=1将选择第二个等...).

目前无法使用客户端库删除该参数,因为客户端库会自动将其设置为0(这就是为什么它声称不处理多个帐户)如果没有值,所以一种方法是将其覆盖为-1例如,这将显示多帐户选择器.然后,您还可以要求访问用户的个人资料或电子邮件,同时您要求访问其他API并获取用户的电子邮件或其ID.然后在随后的身份验证中,您可以指定user_id绕过用户选择屏幕的参数.

所以在实践中,首先授权如下:

gapi.auth.authorize({client_id: <Your Client ID>,
                     scope: 'https://www.googleapis.com/auth/drive openid', // That requires access to Google Drive and to the UserInfo API
                     authuser: -1});
Run Code Online (Sandbox Code Playgroud)

上述问题的唯一问题是客户端库的自动刷新将无法工作,因为每个身份验证将在多帐户选择屏幕上被阻止.

诀窍是使用UserInfo API获取用户的ID,将该ID保存在会话cookie中,并在后续身份验证中使用它,如下所示:

gapi.auth.authorize({client_id: <Your Client ID>,
                     scope: 'https://www.googleapis.com/auth/drive openid',
                     user_id: <The User ID>,
                     authuser: -1});
Run Code Online (Sandbox Code Playgroud)

指定用户ID将确保多帐户选择器被绕过,并允许从客户端lib自动刷新令牌再次工作.

作为参考,影响用户流的其他URL参数是:

  • user_id:类似于authuser(绕过多帐户选择屏幕),但您可以使用电子邮件地址(例如bob@gmail.com)或从我们的Open ID Connect端点/ Google + API/UserInfo API获得的用户ID
  • approval_prompt:默认为auto,可以设置为force确保显示批准/授权屏幕.这可以确保在后续的auth(第一次之后)中不会绕过gant屏幕.
  • immediate:immediate有点棘手,设置为true它会绕过授权屏幕(有点像approval_prompt=auto),如果用户之前已经批准,但如果用户之前没有批准,您将被重定向并出现错误:error=immediate_failed.如果设置为false它将不会添加特殊行为,因此回退approval_prompt值的行为设置.

注意:immediate=true并且approval_prompt=force是无效组合.

我认为客户端库正在使用immediateparam,所以如果他得到error=immediate_failed它将重新启动没有authuserparam 的auth流程,但这只是推测:)