gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:00:38 26 4
gpt4 key购买 nike

我有一个现有的支持 Google 云端硬盘的应用程序,该应用程序使用 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/auth/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&proxy=oauth2relay593063763&response_type=token&state=701344514&authuser=1

在新选项卡中什么也没有发生。我有made a video to demonstrate .

更新2:This bug针对JS客户端库的多账户双重选择的需求已被接受。

最佳答案

由于以下参数,您无法进入多用户选择屏幕:authuser=0这会自动选择您登录的第一个帐户( authuser=1 将选择第二个帐户,依此类推...)。

目前无法使用客户端库删除该参数,因为如果没有值,客户端库会自动将其设置为 0(这就是它声称不处理多帐户的原因),因此一种方法是将其覆盖例如 -1,这将显示多帐户选择器。然后您还可以要求访问user's profile or email同时您请求访问其他 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});

上述唯一的问题是客户端库的自动刷新将不起作用,因为每个身份验证都会在多帐户选择屏幕上被阻止。

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

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

指定用户 ID 将确保绕过多帐户选择器,并允许从客户端库自动刷新 token 再次工作。

仅供引用,影响用户流程的其他 URL 参数包括:

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

注:immediate=trueapproval_prompt=force是无效的组合。

我认为客户端库正在使用 immediate参数,以便如果他得到 error=immediate_failed它将重新启动身份验证流程,而无需 authuser参数,但这只是猜测:)

关于oauth-2.0 - 通过 JS 客户端库为 Drive 使用授权时,是否可以正确选择任何可用的 Google 帐户来使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13366254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com