Использование OAuth2 для сервера API Gmail для серверного приложения

Использование Gmail API может быть проблемой. В отличие от Google Таблиц, Google Cloud Storage, Google Cloud Vision, учетная запись Gmail принадлежит кому-то.

Наш бот должен действовать от имени этого кого-то и, следовательно, должен быть аутентифицирован как этот кто-то.

Да… нам нужен OAuth2.

Эта статья разделена следующим образом:

1. Аутентификация Google API с помощью OAuth 2

  • Создание идентификатора клиента и секрета клиента (5 мин.)
  • Создайте функцию Google Cloud, чтобы получить код (5 мин.)
  • Получите код (3 мин.)
  • Получение токена доступа и токена обновления (4 мин.)

2. Ping Gmail API с помощью Python

  • Аутентифицируйтесь с помощью наших свежих токенов
  • Список адресов электронной почты
  • Список писем с определенной темой
  • Прочитать конкретное электронное письмо
  • Отправить письмо
  • Удалить электронное письмо
  • Создать ярлык
  • Классифицировать сообщение с помощью метки

Аутентификация Google API с помощью OAuth 2

У нас есть два способа аутентификации:

  • Использование пакетов python и google (см. Быстрый старт)
  • Использование API напрямую

Пакеты Python Google выполняют базовую проверку и генерируют URL для нас.

В этом руководстве я создам URL-адрес аутентификации вручную, чтобы он был понятен для не-специалистов по Python.

Создание идентификатора клиента и секрета клиента (5 мин.)

Сначала нам нужно аутентифицировать наше приложение.

To do so:

  • Перейдите в Панель инструментов Google Cloud Project API.
  • Перейдите на вкладку Учетные данные.
  • Нажмите «Создать учетные данные» и выберите «Идентификатор клиента OAuth».
  • Выберите тип приложения как веб-приложение (даже если это не так)
  • Выбери смешное и забавное имя
  • Прокрутите вниз до раздела «URI перенаправления».

Если вы создаете веб-приложение, именно здесь вы вводите URI вашего приложения, который обрабатывает код. Затем вам будет предложено указать идентификатор клиента и секретный клиент.

Если вы хотите создать межсерверное приложение, вам необходимо создать URI перенаправления, который будет обрабатывать код.

Это то, что мы делаем в следующем разделе (откройте новую вкладку, чтобы не потерять этот WIP) =>

Создание обратного вызова Google Cloud Function (5 мин.)

Это самая скучная часть. Если вы привыкли к облачным функциям Google, это займет две минуты.

  • Перейдите в Панель инструментов Google Cloud Functions
  • Нажмите «Создать функцию», назовите ее gmail_callback.
  • Оставьте все без изменений, нажмите «Сохранить» и «Далее».
  • Сохраните предварительно заполненный код «Hello World».
  • Нажмите «Развернуть»

После развертывания щелкните функцию и перейдите на вкладку «Триггер».

Скопируйте URL-адрес триггера.

Помните «URI перенаправления» из предыдущего раздела?

Чтобы авторизовать эту облачную функцию, вам нужно вставить этот URL-адрес в «Авторизованные URI перенаправления» из предыдущего раздела и нажать «Создать».

Появится окно с вашим идентификатором клиента и секретом клиента, сохраните их где-нибудь для следующего раздела.

Получите код запроса разрешения (3 мин.)

Предыдущая часть была обязательной для получения кода. Давайте запросим этот код!

Чтобы получить код для нашей авторизованной функции Google Cloud, мы должны создать URL-адрес.

Конечная точка:

[GET] https://accounts.google.com/o/oauth2/auth

Параметры:

response_type=code
client_id=YOUR_CLIENT_ID
redirect_uri=THE_CLOUD_FUNCTION_URL_MADE_JUST_BEFORE
scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.readonly+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.modify
access_type=offline

Просто измените THE_CLOUD_FUNCTION_URL_MADE_JUST_BEFORE and YOUR_CLIENT_ID.

Конечный URL выглядит следующим образом:

https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=THE_CLOUD_FUNCTION_URL_MADE_JUST_BEFORE&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.readonly+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.modify&access_type=offline

В любой строке поиска вставьте этот вымышленный URL, вы должны попасть сюда:

После авторизации доступа вы будете перенаправлены в созданную нами облачную функцию Google.

URL-адрес перенаправления нас интересует больше всего (а не ответ).

Мой URL-адрес перенаправления выглядит следующим образом:

https://us-central1-project.cloudfunctions.net/gmail_callback?code=4/0AX4XfWinb4UhzrL87RO7IAjwm2XUha&scope=https://www.googleapis.com/auth/gmail.readonly%20https://www.googleapis.com/auth/gmail.modify

Видите ключ code? Это то, что нам нужно, чтобы перейти к следующему разделу.

Получение токена доступа и токена обновления (4 мин.)

Почти готово.

Теперь у нас есть: секрет клиента, идентификатор клиента и код ⇒ мы можем получить наш токен доступа и обновления.

Конечная точка:

[POST] https://www.googleapis.com/oauth2/v4/token

Параметры:

code=PREVIOUS_SECTION_CODE
client_id=YOUR_CLIENT_ID
client_secret=YOUR_CLIENT_SECRET
grant_type=authorization_code
redirect_uri=THE_CLOUD_FUNCTION_URL_MADE_JUST_BEFORE

Оставьте grant_type=authorization_code и измените code, client_id, client_secret и redirect_uri на свои собственные значения.

Конечный URL выглядит следующим образом:

https://www.googleapis.com/oauth2/v4/token?code=PREVIOUS_SECTION_CODE&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=authorization_code&redirect_uri=THE_CLOUD_FUNCTION_URL_MADE_JUST_BEFORE

Используйте любой оставшийся клиент для вызова этой конечной точки. Я использую Почтальон.

Ура!

Как только мы получили наш токен доступа и токен обновления, все готово!

Просто имейте в виду, что вы получите токен доступа с токеном обновления только при первой авторизации, поэтому обязательно сохраните этот токен обновления в первый раз, и вы сможете использовать его в любое время.

Проверка связи с API Gmail

Аутентифицируйтесь с помощью наших свежих токенов

У вас есть два способа использования вашего токена:

  • Импортировать токен в виде файла
  • Импортировать токен как переменную (например, в Google Secret Manager)

Токен в виде файла

Создайте файл token.json и скопируйте и вставьте ответ, который мы получили в предыдущем разделе.

В этот файл JSON добавьте два ключа: client_id и client_secret, значение будет из предыдущего раздела.

Окончательный файл выглядит так:

Токен как переменная

Перейдите в свой блокнот и создайте переменную token.

Вставьте ответ, который мы получили в предыдущем разделе.

К этой переменной добавьте два ключа: client_id и client_secret, значение будет из предыдущего раздела.

Наш блокнот начинается так:

Здесь нет ничего сложного: импорт, объявление токена и аутентификация в Gmail API.

Теперь мы готовы использовать API. Поздравляем, если вы дошли до этого момента!

Не забудьте хлопнуть 50 раз :)

Список адресов электронной почты

service.users().messages().list(userId=’me’, maxResults=10).execute()

Список писем с определенной темой

service.users().messages().list(userId='me', q='subject: ([GitHub] Please verify your device)', maxResults=10).execute()

Получить конкретное электронное письмо

message = service.users().messages().get(userId='me', id='17fb050593f97da5').execute()
message['snippet']

Отправить письмо

message = MIMEText('Give me 50 claps!')
message['to'] = '[email protected]'
message['from'] = '[email protected]'
message['subject'] = 'Hello from API'
message_body = {
'raw': base64.urlsafe_b64encode(message.as_bytes()).decode()
}
message = service.users().messages().send(userId='me', body=message_body).execute()
print('Message Id: %s' % message['id'])

Удалить электронное письмо

service.users().messages().trash(userId='me', id='17fb050593f97da5').execute()

Создать ярлык

label_body = {
"name": "API",
"messageListVisibility": "show",
"labelListVisibility": "labelShow",
}
service.users().labels().create(userId='me', body=label_body).execute()

Классифицировать сообщение с помощью метки

label_body = {
'removeLabelIds': ['IMPORTANT', 'CATEGORY_UPDATES', 'INBOX'],
'addLabelIds': ['Label_3']
}
service.users().messages().modify(userId='me', id='17f4b937f4ce6847', body=label_body ).execute()

И последнее, но не менее важное: перед выходом в эфир храните свой токен в безопасном месте. Я настоятельно рекомендую Secret Manager для таких конфиденциальных данных:



Если вас интересуют API Google, вы можете прочитать эту статью об API Google Таблиц и API Google Диска. На этот раз мы используем учетную запись службы.



Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.