2017-08-01 67 views
0

我正在嘗試自動執行獲取OAuth2授權碼的過程,以用於Google表格。使用PowerShell獲取Google表格的OAuth2授權碼

我創建了谷歌項目並與http://localhost/oauth2callback

重定向URI我已經成功地通過輸入此網址到瀏覽器手動得到授權碼註冊吧:

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瀏覽器中顯示的結果URL中複製出授權碼來提取授權碼:

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

我試圖複製用PowerShell處理這個過程失敗了。我想我錯過了一些關於所有這些HTTP重定向工作的基本理解。

我已經嘗試了幾個變化的主題,包括採取第一個重定向結果並將其與另一個Invoke-WebRequest調用一起提交,但無論我做什麼,我只在第一次調用時才返回一個值,只有當我設置-MaximumRedirection0 - 什麼我回來不幫助我:

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 

沒有什麼,沒有我effo rts使用返回的信息也得到了我的授權碼。

我已經鑽了一堆谷歌和StackOverflow搜索結果,要麼我正在尋找錯誤的東西,或者不知道我在找什麼。

我很難過。有人能幫我弄清楚我需要什麼方向來引導嗎?

謝謝!

+0

隨着你的PowerShell你試圖打開瀏覽器供用戶進行身份驗證,或者你想在PowerShell中完成身份驗證?如果你想使用powershell的用戶名和密碼進行身份驗證,你必須使用https://tools.ietf.org/html/rfc6749#section-4.3 –

+0

我試圖執行任務直接獲取授權代碼與Powershell,與沒有開放的瀏覽器。謝謝你的鏈接。我需要更徹底地閱讀它,但乍一看它似乎涵蓋了獲取身份驗證令牌的步驟,而不是授權代碼。如果是這樣,那不是我正在做的那一步。 –

+0

此外,即使這不是規定的技術,瀏覽器*可以在沒有人爲干預的情況下生成結果URL這一事實表明該信息應該可以通過PowerShell腳本進行檢索。現在有了一個令人興奮的機會來了解更多關於幕後瀏覽器和HTTP以及重定向(哦,我的!)的情況。因此,試圖複製這種行爲不僅會很有趣,而且會對我有很大的教育意義。所以我真的想知道如何在PowerShell中執行這一步驟。 :-) –

回答

1

如果你使用你的瀏覽器,瀏覽器會讓你登錄谷歌,然後驗證你併發送給你authcode。如果要使用powershell或shell腳本自動執行此過程,請使用資源所有者密碼憑據授予您將用戶名和密碼作爲請求的一部分發送的位置,並且服務器將返回Auth代碼。但不幸的是,它不受Google支持。 https://developers.google.com/identity/protocols/OAuth2InstalledApp

因此,您必須從PowerShell動態打開瀏覽器並讓用戶進行身份驗證,並且一旦通過身份驗證的用戶應手動複製粘貼身份驗證代碼以生成訪問令牌。爲了讓它變得不那麼容易,你可以重定向到一個javascript頁面,該頁面打開一個帶有認證代碼的彈出窗口。例如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

+0

再次感謝你@Venkatesh Marepalli - 你是這個話題信息的真正來源。儘管如此,我們似乎仍然錯誤地傳播了信息。 我所在的步驟不是驗證步驟。這是授權步驟。我無需登錄Google即可手動完成此步驟。 我* *必須登錄才能執行身份驗證步驟,但那不是我描述的步驟。 我在這裏錯過了什麼? –

+0

授權步驟是什麼意思?獲取授權碼?讓我知道你是什麼意思,這一步,以及在這一步的結尾會發生什麼,所以我會有一個清晰的瞭解 –

+0

原來的帖子顯示了問題的步驟和結果。 在獲得授權碼之後,可以使用它來執行驗證,從而獲得訪問令牌。我會在早上從頭到尾發佈一個更徹底的例子。 –