0

我剛剛開始使用c#Google.Apis.Gmail.V1類並使用服務帳戶來閱讀郵箱。C#GMAIL API服務帳戶修改 - unauthorized_client

我的代碼工作正常,當我用下面的代碼片段

ServiceAccountCredential credential = new ServiceAccountCredential(
      new ServiceAccountCredential.Initializer(ServiceAccountEmailAddress) 
      { 
       User = "[email protected]", 
       Scopes = new[] { "https://www.googleapis.com/auth/gmail.readonly" } 
      }.FromCertificate(certificate)); 

與該代碼我可以調用成功以下

if (credential.RequestAccessTokenAsync(CancellationToken.None).Result) 
     { 
} 

但我需要修改的電子郵件,所以我改變範圍從

https://www.googleapis.com/auth/gmail.readonly

https://www.googleapis.com/auth/gmail.modify

我現在要求的訪問令牌

{時得到一個異常 「錯誤:\」 unauthorized_client \ 「描述:\」 在請求授權客戶端還是範圍。 \「,」Uri:\「\」「}

我已經在Google Developers Console中檢查了服務帳戶(* .iam.gserviceaccount.com),並且已嘗試所有權限選項g應該給我的所有者完全訪問所有資源,但沒有快樂。

我想我只是缺少一個簡單的步驟,但我不確定接下來要看的地方。

回答

1

TL; DR

我將通過這個閱讀,但這裏是短版。我知道這是一個較舊的帖子,但希望它找到你!

如果您尚未在Google管理控制檯中更新/列出服務帳戶的權限/範圍,則需要執行此操作,確保該域已啓用API訪問權限,確保服務帳戶設置正確,創建「證書」對象時要注意其參數,以便正確實例化,檢查被模擬帳戶的權限,最後確保您已創建適當的Google Apps服務帳戶密鑰(可輕鬆製作不合適的密鑰類型。)

在管理控制檯

這克白-上市谷歌的API使Google Apps服務帳戶可以使用您在Google Apps域中提供的任何範圍。

  1. 使用以下鏈接登錄到Google Apps管理控制檯。 https://admin.google.com/
    • Google Apps用戶帳戶必須具有足夠的權限才能修改域相關設置。它不一定是用於在開發人員控制檯中創建Google Apps項目的帳戶。如果帳戶沒有權限,您將被導向到一個完全不同的屏幕,無法點擊不同的域名控制Web應用程序,如「安全」,「角色」,「支持」,「羣組」等。相反,您會轉到顯示諸如「Gmail」,「雲端硬盤」,「文檔」等的典型用戶應用的頁面。它滴在你當前的鏈接是https://apps.google.com/user/hub
  2. 點擊「安全」
  3. 點擊「顯示更多」,在安全選項列表底部的選項。
  4. 點擊「高級設置」以獲得更多選項。
  5. 選擇「管理API客戶端訪問」鏈接。
  6. 現在某些API範圍必須是白色的,上市所需的服務帳戶。在「客戶名稱」文本框中提供服務帳戶的客戶端ID。客戶端ID是在開發人員控制檯中獲取的。在「一個或多個API範圍」中添加所需的範圍;逗號分隔。

    注意,如果有現有的作用域,他們將被刪除,所以一定要重新添加任何將需要。

通過以下鏈接啓用域範圍的API訪問

  1. 登錄到谷歌Apps的管理控制檯。 https://admin.google.com/
  2. 進入「安全」頁面。
  3. 在「API參考」一節
  4. 確保「啓用API訪問」已啓用。

創造適當的谷歌應用服務帳戶的關鍵(這大概)

  1. 轉到谷歌開發者控制檯。以創建Google Apps項目/服務帳戶的Google Apps用戶身份登錄。 https://console.developers.google.com/
  2. 導航到與您創建的服務帳戶的具體項目。
  3. 點擊項目頁面左側的「服務帳戶」按鈕,彈出一個頁面,該項目的所有服務帳戶。
  4. 單擊垂直橢圓形小部件一直到所需服務帳戶的行右側。選擇「創建密鑰」。
  5. 選擇.p12鍵,因爲它看起來像這是你想要使用的。點擊「創建」。一定要保護這個鍵。

我發現如果沒有按照這種方式創建密鑰,那麼它就會打開製作API密鑰或OAuth 2.0客戶端/用戶密鑰的可能性。這些是在這種情況下使用的錯誤鍵類型,您需要創建服務帳戶密鑰。上述方法迫使您創建服務帳戶密鑰。

修改現有的谷歌應用服務帳戶的設置

我不會就如何建立實際的服務帳戶,有一件事你可能需要在你的情況是,以確保該服務帳戶具有啓用域範圍的委派。這是在Google Developer Console中切換的。應該很容易找到。

代碼

你不創建令牌提供你的整個代碼庫,所以只是想增加你可能會不正確地做幾件事情。

  1. 確保在創建證書時,您提供的密碼是默認的「notasecret」字符串。這個祕密目前是由Google發佈的所有密鑰提供的默認值,並且在密鑰創建期間是不可變的。我有一個鏈接來證明這一點,但後來失去了它。

    X509Certificate2 certificate = new X509Certificate2(certificateFilePath, "notasecret", X509KeyStorageFlags.Exportable); 
    
  2. 試圖提倡正確的編碼。雖然我在過去發現了一些缺陷,但Google的常量值需要額外的字符串操作(添加額外的斜槓)。您應該真正使用它們提供的字符串常量來代替文字。我只是說要使用它們,因爲它提供了一個抽象層,誰會說Google永遠不會改變文字;不太可能。

在你的情況下,新範圍是:

GmailService.Scope.GmailModify 

雖然老了範圍:

GmailService.Scope.GmailReadonly 

否則,一切碼聰明對我來說很好。


要嘗試的另一件事是確保由服務帳戶模擬的實際Google Apps用戶帳戶具有足夠的權限。如果是這種情況,我會懷疑會出現不同的錯誤,而是會在響應中獲得403。無論如何,在你的情況下,這是「[email protected]」帳戶。再次,您將轉到Google管理控制檯,檢查其角色,確保它已檢查了足夠的角色,無論您嘗試執行何種操作。在這種情況下,我不知道你需要什麼,最好的辦法是給它與「超級管理員」角色相同的權限,然後在你去看看它實際需要的時候刪除權限。否則,如果可能的話就給它「超級管理員」。


如果我是一個賭徒,我會把我的錢放在一個不適當創建的服務賬號密鑰上。我剛剛遇到了這個問題,這是唯一一個產生了相同的確切錯誤,你收到。其他的東西會使我在響應令牌中得到相同的「描述」值,但不是相同的「錯誤」值。我真的不知道是如何製造肇事者的關鍵,因爲我沒有做到。我只知道解決方法是用上述步驟重新創建一個新密鑰,並解決問題。