使用PowerShell获取Google表格的OAuth2授权码

时间:2017-08-01 19:33:19

标签: powershell redirect google-sheets-api

我正在尝试自动获取用于Google表格的OAuth2授权码。

我创建了Google项目,并使用http://localhost/oauth2callback

的重定向URI进行了注册

我已成功通过在Chrome中输入此网址来手动获取授权码:

https://accounts.google.com/o/oauth2/v2/auth
  ?redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback
  &response_type=code
  &client_id=##CLIENTID##
  &scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fspreadsheets
  &access_type=offline
  &include_granted_scopes=true
  &state=state_parameter_passthrough_value

...然后通过将其复制到Chrome中显示的结果网址中提取授权码:

http://localhost/oauth2callback
  ?state=state_parameter_passthrough_value
  &code=##AUTHCODE##
  &scope=https://www.googleapis.com/auth/spreadsheets#

我尝试使用PowerShell复制此过程失败了。我想我对所有这些HTTP重定向内容的工作方式缺乏一些基本的了解。

我在主题上尝试了几种变体,包括获取第一个重定向结果并通过另一个Invoke-WebRequest调用提交它,但无论我做什么,我只会在第一次调用时得到一个值,并且只有当我将-MaximumRedirection设置为0时 - 我得到的回复并没有帮助我:

Function getAuthorizationCode($cliids) {
    $auturl = "https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=http`%3A`%2F`%2Flocalhost`%2Foauth2callback`&response_type=code`&client_id=$cliids`&scope=https`%3A`%2F`%2Fwww.googleapis.com`%2Fauth`%2Fspreadsheets`&access_type=offline`&include_granted_scopes=true`&state=state_parameter_passthrough_value";
    #$autrsp = Invoke-WebRequest -UseBasicParsing -Uri $auturl -UseDefaultCredentials -TimeoutSec 180 -ErrorAction SilentlyContinue;
    $autrsp = Invoke-WebRequest -UseBasicParsing -Uri $auturl -UseDefaultCredentials -TimeoutSec 180 -MaximumRedirection 0 -ErrorAction Ignore;
    $autrdi = "";
    if ($autrsp.StatusCode -ge 300 -and $autrsp.StatusCode -lt 400) {
        $autrdi = $autrsp.Headers.Location;
    }   
    return $autrdi;
}
# Force main variables to be non-global
Function myMain($arglis) {
    $cliids = "##CLIENTID##";
    getAuthorizationCode $cliids;
}
# Force main variables to be non-global
myMain $Args;

这导致:

https://accounts.google.com/ServiceLogin
  ?passive=1209600
  &continue=https://accounts.google.com/o/oauth2/v2/auth
    ?redirect_uri%3Dhttp://localhost/oauth2callback
    %26response_type%3Dcode
    %26client_id%3D##CLIENTID##
    %26scope%3Dhttps://www.googleapis.com/auth/spreadsheets
    %26access_type%3Doffline
    %26include_granted_scopes%3Dtrue
    %26state%3Dstate_parameter_passthrough_value
    %26from_login%3D1
    %26as%3D##LOGINCODE##
  &oauth=1
  &sarp=1
  &scc=1

由此产生的重定向值中没有任何内容是授权码,我使用返回信息的努力也没有让我获得授权码。

我仔细研究了一堆Google和StackOverflow搜索结果,要么我正在搜索错误的内容,要么不了解我找到的内容。

我很难过。有人可以帮我弄清楚我需要指导的方向吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您使用浏览器,浏览器将允许您登录谷歌,然后验证您并发送authcode。如果您想使用powershell或shell脚本自动执行该过程,请使用资源所有者密码凭据授予您在请求中发送用户名和密码的位置,并且服务器返回Auth代码。但不幸的是,谷歌不支持它。 https://developers.google.com/identity/protocols/OAuth2InstalledApp

因此,您必须从您的powershell动态打开浏览器并让用户进行身份验证,一旦经过身份验证的用户应手动复制粘贴您的控制台中的Auth代码以生成访问令牌。为了方便起见,您可以重定向到一个javascript页面,该页面打开一个带有auth代码的弹出窗口。例如,redirect_uri=http://localhost:8899/getcode.html将打开http://localhost:8899/getcode.html?code=xyz如果您在getcode.html内编写了一些javascript代码,它会读取代码查询参数并在弹出窗口中向用户显示,则用户可以轻松复制它。

另一种方法是自定义重定向方案。在这里,您必须安装自定义方案。这可以作为另一个应用程序(您可以调用Shell或批处理脚本)在身份验证后打开。你编写自己的自定义代码将authcode复制到剪贴板并在powershell中读取它。 (这可以避免手动复制粘贴)。请参阅此http://edoceo.com/howto/xfce-custom-uri-handler