授权命令行工具使用Google API(通过OAuth2.0或其他任何东西)

时间:2012-11-10 00:31:43

标签: command-line oauth authorization google-api oauth-2.0

我了解OAuth 2.0在移动应用或网站环境中的运作方式 - 我的情况也不是。

我有一个C ++ 命令行应用程序,我想要访问其中一个Google服务(Google Fusion Tables),但我认为这个问题适用于任何Google服务,或者哎呀,也许还有任何必须处理OAuth2的命令行应用程序。

我有用户名。我有密码(用户输入密码)。我需要获得一个令牌,以便我可以通过Curl进行调用。最简单的方法是什么?

更新1:

在阅读完文档后,似乎最不痛苦的OAuth2流程将是"Installed Application"

我在想的是我的命令行工具会在不需要令牌的情况下发出对公共表的请求(但似乎我们仍然需要从Google发送一个AppID,我可以从Google API仪表板中获取)。

每当我的命令行工具需要使用私有资源时,该用户将需要提供Google提供的授权代码(我的命令行工具可以使用它来获取可用的 >令牌)。如果用户未在命令行中提供授权代码,我的工具只会打印一个用户可以粘贴到URL的链接以生成授权代码。链接看起来像这样:

https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/fusiontables&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&client_id=812741506391-h38jh0j4fv0ce1krdkiq0hfvt6n5amrf.apps.googleusercontent.com

用户接受后,必须将授权码粘贴到终端,以便命令行工具使用它。命令行工具将使用授权代码向Google询问令牌,然后,最后,我可以使用Google令牌进行API调用。

我还不清楚一些事情。授权码是否会改变?如果是这样,我似乎需要保存令牌并在某处刷新令牌,以便每次令牌到期时我都可以重复使用刷新令牌。

这只是我,还是整个事情看起来像是疯狂的谈话,以便我可以从命令行使用Google API?

我通常会使用ClientLogin flow,但所有内容似乎都指出它很快就会被弃用。

1 个答案:

答案 0 :(得分:41)

回答有关“已安装的应用程序”流程的问题:

授权码仅有效一次。交换后 - 并获得刷新令牌访问令牌 - 它将不再可用。只是转储它。它只是一次性使用,你不再需要它了。您需要做的只是在某些本地文件中保留/保存/保留刷新令牌以便重复使用。

刷新令牌 重要令牌。它允许您无限期访问API,因为您可以使用它以编程方式获取新的访问令牌(有效1小时)。检查有关该操作的refresh token doc

Google API客户端库通常会自动为您自动和透明地刷新令牌,但由于我们没有C ++客户端库,您需要自己执行此操作。我们使用的一种技术是在向API发出请求时捕获403错误(表示无效访问令牌),在这种情况下,我们进行刷新以获取新的访问令牌,然后自动重新尝试最初失败的操作。

我的建议:

为您提供最佳用户体验的流程是使用服务器端Web应用程序流程。可以在已安装和/或命令行应用程序上使用它,但这是更多的工作。方法如下:

  1. 在用户的计算机上启动本地Web服务器,侦听空闲端口(例如:http://127.0.0.1:7777
  2. 生成网络浏览器窗口(或将其嵌入到您的应用中),将用户重定向到Google OAuth 2.0授权页面,并将重定向URI设置为http://127.0.0.1:7777
  3. 当用户授予应用程序访问权限时,会将其重定向到您在http://127.0.0.1:7777处收听的服务器。
  4. 在本地Web服务器上,您将获得URL查询参数中的身份验证代码。您现在可以交换身份验证代码以进行访问并刷新您持久存储的令牌
  5. 杀死/关闭您在步骤1中启动的本地Web服务器
  6. 杀死/关闭您在步骤2中生成的浏览器实例
  7. 就是这样,您现在拥有了刷新和访问令牌(从第4步开始),并且在您杀死浏览器后又回到了您的应用中。

    为什么这一切都搞乱了?

    已弃用客户端登录。它正在消失,不适用于较新的API。谷歌不希望用户给你他们的密码,因为你可能会想要存储它而你可能会被黑客入侵:))另外,它可以让你访问太多的信息,因为你可以用他们的Google Checkout帐户购买或者更改密码以窃取他们的帐户。目前,采用安全立场的唯一方法是使用OAuth2这样的三足认证系统,并阻止使用密码,这样用户就不会习惯向第三方提供用户名和密码。当然,OAuth2在桌面/命令行应用程序中使用起来要困难得多......

    OOB备选

    如果您不想或无法启动Web服务器来侦听代码,那么您可以使用oob OAuth流程。它只需将oob指定为重定向URI即可。在这种情况下,系统会向用户显示一个页面,其中显示“这是您的身份验证代码。请将其粘贴到您的应用中”,而不是重定向到给定的网址。在您的应用上,您只需让用户将身份验证代码粘贴到文本字段中即可。这是一种更糟糕的用户体验,但在某些情况下可以更强大,并且可以在更多环境中工作,尤其是低技术环境。

    请注意,并非所有OAuth 2提供商都支持这一点,但至少谷歌和Facebook会这样做。