Достъп до IMAP на Gmail с помощта на AssertionFlowClient и сервизен акаунт

Възможно ли е да използвам AssertionFlowClient и сервизен акаунт за достъп до пощенската кутия на всеки потребител в моя домейн чрез IMAP. Същото като при 2-legged 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 от сървъра accounts.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