簡體   English   中英

Google Calendar API 服務帳戶錯誤

[英]Google Calendar API Service Account Error

我收到這個錯誤

{ "error": 
     { "errors": 
         [
            { "domain": "calendar", "reason": "forbiddenForServiceAccounts", "message": "Service accounts cannot invite attendees without Domain-Wide Delegation of Authority." } 
         ], 
         "code": 403,
         "message": "Service accounts cannot invite attendees without Domain-Wide Delegation of Authority."
      } 
}

已經關注這個https://developers.google.com/admin-sdk/directory/v1/guides/delegation

我正在使用這個庫並在 laravel 5.7 上運行它: https : //github.com/spatie/laravel-google-calendar

有什么辦法可以解決這個問題。 請幫忙。

以下是完成這項工作的步驟:

在您的服務帳戶中啟用域范圍委派

1 - 為您的服務帳戶提供日歷范圍

2 - 您的用戶需要具有 Service Account Token Creator 角色

3 - 在您要模擬的帳戶中創建一個日歷

服務帳戶沒有日歷,因此您必須創建自己的日歷

  • 使用您想要擁有日歷的電子郵件登錄https://calendar.google.com/ (我使用了不同的帳戶,與我要模擬的帳戶不同,也許它可以在模擬帳戶中使用日歷)
  • 創建日歷
  • 與有權修改和管理日歷的服務帳戶共享日歷
  • 與您將模擬的帳戶共享日歷,並具有修改和管理日歷的權限

創建谷歌客戶端

  • 驗證您的服務帳戶。 (我使用了 JSON 密鑰,我不確定其他身份驗證是否適用於此目的)

代碼示例:(我使用 PHP,但我假設其他語言非常相似,因此您可以將其用作指南)

請注意,使用一些電子郵件進行 IMPERSONALIZATION 至關重要。 否則,將保留 403 錯誤,將其用於身份驗證,有關詳細信息,請參閱 Maksym Kalin 響應。

$google_client = new Google_Client();
$google_client->setAuthConfig($LOCATION_OF_JSON_KEY);
$google_client->setAccessType( 'offline' );
$google_client->setSubject('EmailToImpersonate@SomeAddress.com');
$google_client->setApplicationName("YourApplicationName");
$google_client->setScopes([\Google_Service_Calendar::CALENDAR, \Google_Service_Calendar::CALENDAR_EVENTS]);

與受邀的人一起創建活動:) 並享受!

注意:通過這種方法,您可以創建事件並邀請人們加入。 請記住 G Suite https://support.google.com/a/answer/2905486的限制,因此如果您想創建許多事件,您需要擁有一個帶有日歷池的服務帳戶池。

向服務帳戶授予域范圍權限的目的是讓這些帳戶能夠代表域中用戶訪問數據。

如果您授予它域范圍的權限但沒有“模擬”任何帳戶,則服務帳戶的行為就好像您沒有授予此權限:它正在嘗試訪問自己的日歷。

當服務帳戶模擬域中的另一個用戶時(即,當它代表用戶行事時),服務帳戶可以訪問該用戶可以訪問的資源。

要冒充其他用戶,您必須指定用戶的電子郵件地址。 就我而言,我使用 Node.JS 庫,我的模擬代碼如下所示:

const auth = new google.auth.JWT(
  config.client_email,
  null,
  config.private_key,
  ["https://www.googleapis.com/auth/calendar.events"],
  "!!! user email to impersonate !!!!",
);

更重要的是,如果您需要填寫參加者[]數組,您必須授權服務帳戶發送電子郵件。 因為你得到了未經授權的錯誤。

為此,您需要在 G Suite 域的管理控制台上添加https://www.googleapis.com/auth/gmail.send范圍。

您可以在此處找到更多信息: https : //issuetracker.google.com/issues/14170493

僅供參考

就我而言,在 Node.js 上,我遵循了@Anathorn 的指示,但我一直得到

服務帳戶不能在沒有域范圍授權的情況下邀請與會者

然后我在我的身份驗證行添加了我應該替換的電子郵件,並且它起作用了。

const auth = new google.auth.JWT(
    CREDENTIALS.client_email,`
    null,
    CREDENTIALS.private_key,
    SCOPES,
    "admin@domain.com",
    "12345678987654321"
);

對於可能遇到這個問題的任何其他人,對我來說,這是 Anathorn 的回答和 Maksym Kalin 的回答的結合。 這是因為我沒有冒充用戶的電子郵件地址。

一個用戶之前曾嘗試提交您正在使用的同一個庫(我也在使用它),但被 repo 所有者拒絕了(多么悲傷)

https://github.com/spatie/laravel-google-calendar/pull/97

無論如何,他在這里的代碼是我最終修復它的方式。

祝其他遇到這個問題的人好運,這讓我痛苦太久了。

對於那些使用 googleapis-nodejs-client 庫的人,在 google-auth-library-nodejs github page 中的一個問題上提出了解決方案。

從@Anathorn 執行所有 conf 步驟並以這種方式記錄服務帳戶對我有用:

const auth = new google.auth.GoogleAuth({
keyFile: './service.json',
scopes: [
  'https://www.googleapis.com/auth/calendar',
  'https://www.googleapis.com/auth/calendar.events'
],
clientOptions: {
  subject: 'email@email.com'
},

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM