Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oauth 2.0 在通过JS客户端库使用硬盘授权时,是否能够正确选择任何可用的Google帐户?_Oauth 2.0_Google Drive Api_Google Account_Google Api Client - Fatal编程技术网

Oauth 2.0 在通过JS客户端库使用硬盘授权时,是否能够正确选择任何可用的Google帐户?

Oauth 2.0 在通过JS客户端库使用硬盘授权时,是否能够正确选择任何可用的Google帐户?,oauth-2.0,google-drive-api,google-account,google-api-client,Oauth 2.0,Google Drive Api,Google Account,Google Api Client,我有一个现有的支持Google驱动的应用程序,它使用Google Java客户端库和服务器流验证 如果您没有登录到应用程序并导航到URL,并且您在该浏览器上登录了多个google帐户(只能有一个个人google帐户,任何其他帐户都必须是google业务帐户),OAuth回调提供了选择使用哪个google帐户的选项 但是,在测试切换到使用JavaScript客户端库时,我无法使用gapi.auth.authorize激活多帐户选择屏幕。是否可以使用JS库处理多个帐户 更新:我尝试使用立即参数fal

我有一个现有的支持Google驱动的应用程序,它使用Google Java客户端库和服务器流验证

如果您没有登录到应用程序并导航到URL,并且您在该浏览器上登录了多个google帐户(只能有一个个人google帐户,任何其他帐户都必须是google业务帐户),OAuth回调提供了选择使用哪个google帐户的选项

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

更新:我尝试使用
立即
参数
false
。只要我不在弹出窗口中更改帐户,我就可以登录。如果我确实更改了帐户,我可以:

在一个新的选项卡中,什么也没有发生。我有


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

OAuth授权访问页面仅在不处于立即模式时显示,如果将
immediate
参数设置为false,它是否能正常工作?

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

当前无法使用客户端库删除该参数,因为如果没有值,客户端库会自动将其设置为0(这就是它声称不处理多个帐户的原因),因此一种方法是将其覆盖为-1。例如,这将显示多帐户选择器。然后,您还可以在请求访问其他API的同时请求访问,并获取用户的电子邮件或其ID。然后在后续身份验证中,您可以指定将绕过用户选择屏幕的
用户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});
gapi.auth.authorize({client\u id:,
范围:'https://www.googleapis.com/auth/drive openid',//需要访问Google Drive和UserInfo API
authuser:-1});
上面提到的唯一问题是,客户端库的自动刷新将不起作用,因为每个身份验证都将在多帐户选择屏幕上被阻止

诀窍是使用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});
gapi.auth.authorize({client\u id:,
范围:'https://www.googleapis.com/auth/drive openid',
用户id:,
authuser:-1});
指定用户ID将确保多帐户选择器被绕过,并允许从客户端库自动刷新令牌再次工作

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

  • user\u id
    :与
    authuser
    类似(绕过多账户选择屏幕),但您可以使用电子邮件地址(例如。bob@gmail.com)或者您从我们的开放ID连接端点/Google+API/UserInfo API获得的用户ID
  • approval\u提示符
    :默认为
    自动
    ,可设置为
    强制
    ,以确保显示批准/授予屏幕。这样可以确保在后续身份验证时(第一次之后)不会绕过甘特屏幕
  • immediate
    immediate
    有点棘手,如果用户之前已经授予了批准,当设置为
    true
    时,它将绕过授予屏幕(有点像
    approval\u prompt=auto
    ),但是,如果用户之前未授予批准,您将被重定向,并出现错误:
    error=immediate\u failed
    。如果设置为
    false
    ,则不会添加特殊行为,因此会通过
    approval\u提示符
    值返回行为设置
注意:
immediate=true
approval\u prompt=force
是无效组合

我认为客户端库正在使用
immediate
参数,这样,如果他得到
error=immediate\u failed
,它将在没有
authuser
参数的情况下重新启动身份验证流,但这只是推测:)

根据
Javascript客户端不支持多重登录

请注意authuser参数。例如,将此设置为“2”,即使您已经通过身份验证,也会提示您登录。

这确实会生成授权访问页面,但不会生成前面的帐户选择屏幕。然而,您确实从技术上回答了问题“在使用JS客户端库驱动时,如何获得使用哪个Google帐户的提示?”,我的问题实际上标题不对,抱歉:)。我之所以回答这个问题,是因为我比JS客户端库更了解OAuth端点的工作原理:D我不知道它不适用于多用户帐户:/D您在哪里找到这个参数的?我找不到,谢谢!有人知道为什么谷歌没有正式记录这一点吗?当然,有很多用户拥有多个谷歌账户,使用谷歌认证/选取器API的应用程序应该能够无缝地获取正确的文件…@JaKXz我认为这是谷歌官方记录的,如果Nivco在这里的配置文件是准确的;-)在中指定了变通方法或仅工作参数