Oauth 2.0 在通过JS客户端库使用硬盘授权时,是否能够正确选择任何可用的Google帐户?
我有一个现有的支持Google驱动的应用程序,它使用Google Java客户端库和服务器流验证 如果您没有登录到应用程序并导航到URL,并且您在该浏览器上登录了多个google帐户(只能有一个个人google帐户,任何其他帐户都必须是google业务帐户),OAuth回调提供了选择使用哪个google帐户的选项 但是,在测试切换到使用JavaScript客户端库时,我无法使用gapi.auth.authorize激活多帐户选择屏幕。是否可以使用JS库处理多个帐户 更新:我尝试使用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
立即
参数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
类似(绕过多账户选择屏幕),但您可以使用电子邮件地址(例如。bob@gmail.com)或者您从我们的开放ID连接端点/Google+API/UserInfo API获得的用户IDauthuser
:默认为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在这里的配置文件是准确的;-)在中指定了变通方法或仅工作参数