Автоматический доступ OAuth2 к почтовому ящику Google с использованием IMAP
У меня есть программа, которая получает электронную почту из почтового ящика Google, используя IMAP. В настоящее время он использует аутентификацию по имени пользователя и паролю («PLAIN») в протоколе IMAP. Я хотел бы изменить его для поддержки аутентификации XOAUTH2. Программа написана на .NET и работает как служба в Windows, поэтому нет возможности для запроса согласия на авторизацию, который обычно связывается с OAuth2.
Мне кажется, правильная процедура будет такой:
- Создайте «Проект» в Google для учетной записи адреса электронной почты с единственной целью получения почты.
- Создайте «Сервисную учетную запись» в этом проекте (которая, по моему мнению, должна дать возможность иметь автоматический доступ)
- Загрузите сертификат, чтобы Google мог использовать свой открытый ключ для аутентификации запроса токена доступа, который подписывается с использованием закрытого ключа клиентской службой Windows.
- Используйте ServiceAccountCredential и его класс Initializer (часть пакета Google.Apis.Auth NUGet) для получения токена доступа.
- Передайте токен доступа во время настройки протокола IMAP.
Кажется, у меня есть выбор: удариться о две стены: во-первых, когда я не задавал пользователя при создании ServiceAccountCredential, я мог получить токен доступа, но при использовании в IMAP я получал ошибку авторизации. Во-вторых, когда я указал адрес электронной почты в качестве пользователя, я получил следующую ошибку при попытке получить токен доступа:
Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested
Я предполагаю, что «клиент», упомянутый в сообщении об ошибке, относится к проекту Google, хотя я могу ошибаться, он может относиться к учетной записи службы. В любом случае запрашиваемая область действияhttps://mail.google.com/
В настройках проекта Google я вижу раздел («Включенные API и службы»), где я могу включить определенные API для проекта (API GMail включен).
Я также могу увидеть, если перейду на «Экран согласия OAuth», где я могу авторизовать определенные области для выбранного API и, в частности, где я могу включить область . Однако вся цель здесь состоит в том, чтобы не иметь экрана согласия (и в любом случае включение области https://mail.google.com/https://mail.google.com/ здесь не помогает).
Мне не нужен доступ к какому-либо другому почтовому ящику, поэтому я не думаю, что мне нужно «Делегирование всего домена» в учетной записи службы. Кроме того, это всего лишь индивидуальный почтовый аккаунт, без использования домена Google.
Кажется, я не знаю, как авторизовать область для учетной записи службы (или проекта), хотя характер сообщения об ошибке «это ИЛИ то» может вводить меня в заблуждение. Или, возможно, я совсем не так понял...
Предложения?