【问题标题】:How to supply scopes as part of POST body rather than URL params?如何提供范围作为 POST 正文的一部分而不是 URL 参数?
【发布时间】:2016-02-04 12:38:10
【问题描述】:

一点背景

我正在开发一个Installed Application 项目,该项目可能为每个用户处理很多 Google API 及其范围。我遇到的一个major issue 是当用户选择大量范围进行身份验证时,它们在URL 中作为参数提供并被切断。例如,url 可能会这样终止(为了便于阅读而换行):

...%20https://www.googleapis.com/auth/admin.directory.userschema.
readonly%20https://www.googleapis.com/auth/admin.reports.audit.readon
ly%20https://www.googleapis.com/auth/admin.rep

这是因为我希望我的用户只需要验证一次,但我意识到他们使用的每个 API 都必须验证一次并不会太糟糕。所以我把它拆了,但后来发现再次验证后它会覆盖他们的访问权限。所以,我查看了文档中提到的Incremental Authorization,却发现no it won't work 代表Installed Apps,显然no intention 可以这样做:

我认为这里的问题是您使用的是已安装的应用程序 OAuth2 流程,这与文档不支持 include_granted_scopes 参数相反。

好的,所以在这一点上,听起来我有两个选择。第一个和obvious option是为每个API维护一个单独的令牌。但是,在我承诺这条路线之前,我研究了基于 Python 的Google Apps Manager 如何处理它,因为在进行身份验证时我没有看到 URL 中的任何范围,所以我假设它是作为 POST 正文发送的。

主要问题

对已安装的应用程序使用Google API Client Library for .NET,是否可以在不提供范围作为 URL 参数的情况下进行身份验证?我尝试使用 PowerShell 和 Invoke-RestMethod 来尝试让 POST 请求之类的东西正常工作,但没有任何运气。

【问题讨论】:

    标签: .net google-admin-sdk google-api-dotnet-client google-oauth


    【解决方案1】:

    我不认为这是客户端库的问题。问题是最初的授权请求。向用户弹出列表的是 HTTP get。

    https://accounts.google.com/o/oauth2/auth?client_id={clientid}.apps.googleusercontent.com&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://www.googleapis.com/auth/analytics.readonly&response_type=code
    

    据我所知,http get 的最大长度为 2000 个字符。如果它更多,那么它将被某些浏览器切断。

    选项

    我读到了incremental authorization

    Google 支持增量授权,这使您的应用能够 在登录时请求初始权限,以后可以请求 额外的权限,通常在需要它们之前。为了 例如,如果您的应用允许用户将音乐播放列表保存到 Google 云端硬盘,您可以在登录时询问基本用户信息,稍后再询问 当用户准备好保存时,只请求 Google Drive 权限 他们的第一个播放列表。此时,同意对话框询问 用户只为新的权限,这给他们一个更简单, 在上下文中做出决定。

    我只能找到有关webAndroidiOS 的信息。这并不意味着它仅由他们支持。所有这些都是谷歌的 SDK,所以它可能是他们只在内部允许的东西。然而,这可能是我们可以添加到客户端库中的东西。我建议你添加一个问题请求。 Google-api-dotnet-client issues

    看起来应该是可以的。有一个 http/rest 示例here

    我认为唯一的其他选择是您现在正在做的事情,并为每个 API 或应用程序的每个部分设置一个刷新令牌。

    更新

    经过一番挖掘,include_granted_scopes 不在客户端库中。这意味着必须添加它,否则您将不得不在没有客户端库的情况下艰难地完成它。问题请求可能是要走的路。

    【讨论】:

    • 我介绍了为什么客户端库不会在问题中明确处理增量授权,以及为什么它不重要。我目前正在处理将其添加的拉取请求,即使它不适用于像我这样的已安装应用程序。有关更多背景信息,请参阅我在问题中引用的链接 - 他们明确表示,根据设计,它不适用于已安装的应用程序。
    • 它应该仍然适用于已安装的应用程序。您是否尝试过使用已安装的应用程序执行此操作?做原始的http请求。仅仅因为文档说它不起作用并不意味着它是正确的。
    • 我已经用原始请求完成了它 - 它正确地将 include_granted_scopes=true 放在 url 中,但它没有附加范围,它只是替换。因此,如果我对范围 A 进行身份验证,我可以请求 A 但不能请求 B。如果我随后使用该参数对范围 B 进行重新身份验证,我可以请求 B 但不能请求 A。我希望它将是 B 并且 A. 另外,文档说它确实有效。 This library issue 是他们说文档错误的地方,它不适用于已安装的应用程序。请参阅 this SO question 以更好地明确展示有关该问题的 PoC。
    【解决方案2】:

    我已经确定这是不可能的。在爬取了我认为工作方式不同的 python 代码后,我使用 Fiddler 来捕获发送到浏览器的初始 URL,并看到它确实与查询参数完全相同。由于某种原因,我无法直接使用浏览器开发人员工具来捕捉范围似乎只是在重定向中丢失了。

    也就是说,我不再有比较基础或任何理由认为其他项目以不同于记录的方式工作,所以我认为我的问题是无效的。

    编辑:在撰写本文时,尽管有文档,但已安装的应用程序不支持增量身份验证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 2011-08-03
      • 1970-01-01
      • 2019-03-31
      相关资源
      最近更新 更多