Ключи Google Calendar: где взять и куда вставить

Путь по консоли Google со схемами каждого экрана: включить Calendar API, внести test users, задать три права, создать OAuth-клиент, скопировать Client ID и секрет — и три молчаливые грабли, на которых теряют часы.

Чтобы записи уезжали в Google Calendar, платформе нужно собственное приложение в Google — пара значений Client ID и Client secret. Это делается один раз на всю платформу: салоны и мастера потом просто нажимают «Подключить». Ниже — путь по консоли Google с кадрами каждого экрана и кнопками «Копировать» для строк, которые Google сверяет символ в символ.

Кому что делать: шаги 1–7 выполняет администратор платформы (у него доступ к серверу), шаг 8 — владелец салона или мастер в своём кабинете. Полей для ключей Google в кабинете нет и не будет: ключ один на всех, и хранится он на сервере.

1. Проект и включение Calendar API

  1. Откройте console.cloud.google.com и создайте проект (например izzicrm-calendar).
  2. APIs & Services → Library → найдите Google Calendar API Enable.
APIs & Services → Library → Google Calendar API
Библиотека API: кнопка Enable у Google Calendar APIconsole.cloud.google.com › APIs & Services › LibraryEnabled APIsLibraryCredentialsOAuth consentGoogle Calendar APIGoogle Enterprise API · CalendarIntegrate with Google Calendar: create andmanage events, reminders and calendars.EnableнажатьПроект выбирается в шапке консоли — одинна всю платформу, отдельный для календаря.

Без «Enable» все остальные шаги пройдут успешно, а первый же вызов календаря вернёт ошибку доступа.

2. Экран согласия: кто и о чём просит

Раздел Google Auth Platform (в старых кабинетах — OAuth consent screen). User type — External. Название приложения и почта поддержки видны на экране согласия, поэтому пишите то, что клиент узнает: «IZZI CRM». Домен приложения и ссылки на политику приватности и условия — страницы платформы.

3. Test users — пока приложение не проверено Google

Audience → Test users → Add users. Внесите Google-аккаунты всех, кто будет подключать календарь: владельцев салонов и мастеров. Потолок — 100 аккаунтов на всю платформу; после прохождения verification список вести не нужно.

Google Auth Platform → Audience → Test users
Аудитория: список Test usersconsole.cloud.google.com › Google Auth Platform › AudienceBrandingAudienceClientsData AccessAudienceUser type: External · Publishing status: TestingTest usersowner@gmail.commaster.anna@gmail.com+ Add usersвнести всех, кто будет подключатьКого нет в списке — Google встретит экраном«Access blocked». Потолок — 100 аккаунтов.

«Access blocked: … has not completed the Google verification process» у пользователя означает ровно одно — его почты нет в этом списке. Кабинет тут ни при чём: кнопка отработала, отказ рисует Google.

4. Права (scopes) — ровно три

Data Access → Add or remove scopes. Нужны три и ни одного лишнего — они совпадают с тем, что запрашивает код:

Scopes
https://www.googleapis.com/auth/calendar.events openid email
Полный доступ к календарям (scope calendar) не запрашиваем намеренно: нам нужны только события. Лишние права затягивают verification и пугают на экране согласия.
Google Auth Platform → Data Access
Data Access: три запрошенных праваconsole.cloud.google.com › Google Auth Platform › Data AccessBrandingAudienceClientsData AccessYour sensitive scopes.../auth/calendar.eventsopenid.../auth/userinfo.emailAdd or remove scopesровно эти триПолный `calendar` не запрашиваем: нужнытолько события, а не все календари.

calendar.events — sensitive scope. Именно из-за него до verification действует потолок test users.

5. OAuth-клиент и адрес возврата

Credentials → Create credentials → OAuth client ID, тип приложения — Web application. Единственное, что нужно заполнить, — адрес возврата:

Authorized redirect URI
https://izzicrm.ru/api/v1/calendar-sync/google/callback
Строка сверяется символ в символ. Расхождение хоть в одном знаке — Google покажет redirect_uri_mismatch ещё до экрана согласия.
Credentials → Create OAuth client ID
Создание OAuth-клиента: поле Authorized redirect URIsconsole.cloud.google.com › Credentials › Create OAuth client IDCreate OAuth client IDApplication typeWeb applicationAuthorized JavaScript origins— оставить пустым —✗ не сюда: путь в origin = ошибкаAuthorized redirect URIshttps://izzicrm.ru/api/v1/calendar-sync/google/callbackсюда, символ в символCreateМастер кладёт origins ВЫШЕ redirect URIs — их легко перепутать.

Authorized JavaScript origins оставляем пустым: редирект серверный, JS-виджета Google у нас нет.

Мастер Google кладёт поле Authorized JavaScript origins ВЫШЕ Authorized redirect URIs, и адрес с путём естественно уходит не туда. Признак ошибки — Invalid Origin: URIs must not contain a path. Адрес с /api/v1/… идёт только во второе поле.

6. Где на самом деле лежит секрет

После Create Google показывает окно с Client ID и кнопкой Download JSON. Скопируйте Client ID сразу. Секрет ищите в карточке клиента (Clients → ваш клиент) или внутри скачанного JSON — он начинается с GOCSPX-.

Clients → карточка OAuth-клиента
Карточка клиента: Client ID и Client secretconsole.cloud.google.com › Clients › IZZI CRMOAuth client createdClient ID8391….apps.googleusercontent.comCopyскопироватьClient secretGOCSPX-••••••••••••••••••••••Showпоказать и скопироватьФинальный экран мастера секрет НЕ показывает — только Client IDи «Download JSON». Секрет — здесь, в карточке клиента, или внутри JSON.Секрет не пересылать в переписке, где он останется навсегда.

Client ID заканчивается на .apps.googleusercontent.com, секрет начинается с GOCSPX-. Обе строки — из одного клиента: пара от разных клиентов даёт invalid_client.

Финальный экран мастера client_secret не показывает вовсе — только Client ID и «Download JSON». Это сбивает: люди закрывают окно и ищут секрет заново. Он всегда доступен в карточке клиента, терять его не страшно — но и пересылать в чат, где он останется навсегда, не нужно: при ротации секрета все висящие OAuth-переходы обрываются.

7. Куда вставить

Обе строки уезжают в окружение сервера (переменные GOOGLE_OAUTH_CLIENT_ID, GOOGLE_OAUTH_CLIENT_SECRET и адрес возврата) и применяются перезапуском API — кода это не меняет, миграций не требует. Если вы владелец салона: передайте значения администратору платформы, вставлять их в кабинете некуда.

Признак, что ключи доехали: на экране Настройки → Уведомления кнопка «Подключить календарь салона» ведёт на экран согласия Google, а не показывает сообщение «Google Calendar не настроен на сервере».

8. Подключение салона — и галочка, которую нельзя снимать

  1. Настройки → Уведомления → блок «Календарь салона»«Подключить календарь салона». Личный календарь мастера подключается там же, в карточке сотрудника, вкладка «Календарь».
  2. Выберите Google-аккаунт — тот, что внесён в Test users (шаг 3).
  3. На экране согласия оставьте отмеченной галочку про события календаря и нажмите Continue.
accounts.google.com — экран согласия
Экран согласия Google: галочка доступа к календарюaccounts.google.com › IZZI CRM запрашивает доступIZZI CRM запрашивает дополнительный доступк аккаунту owner@gmail.comПросмотр и изменение событий в календаряхгалочка обязана остаться отмеченнойПросмотр адреса электронной почтыContinueCancelСнятая галочка = «подключено»без прав на календарь.

Sensitive-права Google показывает отдельными галочками. Снять её и нажать «Continue» — обычная ошибка: экран выглядит успешным.

Со снятой галочкой Google выдаёт токен без доступа к календарю и ничего об этом не сообщает. Кабинет такую привязку не создаёт вовсе: вы вернётесь с сообщением о том, что доступ к календарю не выдан, и достаточно нажать «Подключить» ещё раз, оставив галочку. Рабочая привязка при этом не затирается.

Если что-то пошло не так

  • «Google Calendar не настроен на сервере» — ключей на сервере ещё нет (шаги 1–7) или API не перезапускали после их добавления.
  • redirect_uri_mismatch — адрес возврата в консоли не совпадает с нашим символ в символ; сверьте строку из шага 5 (частое: лишний слэш в конце, http вместо https, адрес попал в поле origins).
  • Access blocked — почта не внесена в Test users (шаг 3).
  • invalid_client — Client ID и секрет от разных клиентов или секрет скопирован с пробелом.
  • Подключено, но записи не уезжают — проверьте, включён ли тумблер «Синхронизировать записи», и что подключён тот аккаунт, в календарь которого смотрите. Уже существующие записи в календарь не переносятся сами: для них есть кнопка «Выгрузить».

Чек-лист

  • Проект создан, Google Calendar API включён (Enable).
  • Экран согласия заполнен, User type — External.
  • В Test users внесены все, кто будет подключать календарь.
  • В Data Access ровно три права, среди них calendar.events.
  • Тип клиента — Web application, адрес возврата вставлен в Authorized redirect URIs.
  • Client ID и Client secret скопированы из ОДНОГО клиента и переданы администратору платформы.
  • Кнопка «Подключить календарь салона» ведёт на экран согласия Google.
  • На экране согласия галочка про календарь осталась отмеченной, кабинет показывает «Подключён — почта».

Рядом в рубрике «Каналы и клиенты»

Хватит держать бизнес в десяти вкладках

Соберите записи, клиентов и деньги в одном окне. Настройку возьмёт на себя ИИ. Первые 14 дней — полный доступ бесплатно.

Данные в РФ · 152-ФЗ Без карты