Доступ к IMAP Gmail с помощью AssertionFlowClient и сервисной учетной записи

Можно ли использовать AssertionFlowClient и учетную запись службы для доступа к почтовому ящику любого пользователя в моем домене через IMAP. То же, что и с двухсторонним протоколом OAuth 1.0.

Вот мой код:

X509Certificate2 certificate =  new X509Certificate2(...)
AuthorizationServerDescription server = new AuthorizationServerDescription {...};
List<string> scope = new List<string> { 
    "https://mail.google.com/", 
    "https://www.googleapis.com/auth/userinfo#email" };

AssertionFlowClient provider = new AssertionFlowClient(server, certificate)
{
  ServiceAccountId = SERVICE_ACCOUNT_EMAIL,
  Scope = string.Join(" ",scope.ToArray()),
};

IAuthorizationState grantedAccess = AssertionFlowClient.GetState(provider);
accessToken = grantedAccess.AccessToken;

using (Imap client = new Imap())
{
    client.ConnectSSL("imap.gmail.com");
    client.LoginOAUTH2("[email protected]", accessToken);
    ...
}

Я могу получить действительный accessToken с сервера account.google.com (хотя в AssertionFlowClient/DotNetOpenAuth есть ошибка, и в настоящее время я использую отладчик и окно просмотра для его получения).

Я уверен, что accessToken правильный, так как с его помощью я могу запросить конечную точку API www.googleapis.com/userinfo/email — он возвращает то же значение, что и SERVICE_ACCOUNT_EMAIL.

Однако сервер IMAP Gmail возвращает следующую ошибку:

{"status":"400","schemes":"Bearer","scope":"https://mail.google.com/"}

«Управление клиентским доступом API» для этой служебной учетной записи настроено на «Электронная почта (чтение/запись/отправка) https://mail.google.com/" на cpanel.

Ошибка AssertionFlowClient/DotNetOpenAuth указывает на то, что никто никогда не пробовал это.

Это вообще возможно?


person Pawel Lesnikowski    schedule 05.04.2013    source источник


Ответы (1)


Похоже, Google забыл включить эту небольшую деталь в свою документацию:

AssertionFlowClient provider = new AssertionFlowClient(server, certificate)
    {
        ServiceAccountId = SERVICE_ACCOUNT_EMAIL,
        Scope = "https://mail.google.com/",
        ServiceAccountUser = "[email protected]",  // <- important
    };

Также кажется, что запрос доступа к нескольким областям (разделенным пробелом) завершается ошибкой.

person Pawel Lesnikowski    schedule 06.04.2013