Авторизация API Google с помощью AWS Lambda - FileDataStore не поддерживается - PullRequest
0 голосов
/ 04 июля 2018

Я создал WebAPI и опубликовал его в AWS Lambda. В рамках этого API я автоматически отправляю некоторые электронные письма через GMail SMTP. Мой код электронной почты выглядит так:

var secrets = new ClientSecrets
{
    ClientId = Environment.GetEnvironmentVariable("GMailClientId"),
    ClientSecret = Environment.GetEnvironmentVariable("GMailClientSecret")
};

var googleCredentials = await GoogleWebAuthorizationBroker.AuthorizeAsync(secrets, new[] { GmailService.Scope.MailGoogleCom }, ((MailboxAddress)message.From.First()).Address, CancellationToken.None);
if (googleCredentials.Token.IsExpired(SystemClock.Default))
{
    await googleCredentials.RefreshTokenAsync(CancellationToken.None);
}

using (var client = new SmtpClient())
{
    client.Connect("smtp.gmail.com", 587, SecureSocketOptions.StartTls);

    var oauth2 = new SaslMechanismOAuth2(googleCredentials.UserId, googleCredentials.Token.AccessToken);
    client.Authenticate(oauth2);

    await client.SendAsync(message);
    client.Disconnect(true);
}

Это прекрасно работает на моем локальном компьютере, но при попытке запустить его через AWS Lambda при вызове GoogleWebAuthorizationBroker.AuthorizeAsync появляется следующая ошибка:

Относительные пути FileDataStore не поддерживаются на этой платформе.

GoogleWebAuthorizationBroker определяет AuthorizeAsync как:

public static Task<UserCredential> AuthorizeAsync(ClientSecrets clientSecrets, IEnumerable<string> scopes, string user, CancellationToken taskCancellationToken, IDataStore dataStore = null, ICodeReceiver codeReceiver = null);

Я не предоставляю ничего для параметра dataStore, поэтому по умолчанию он использует реализацию FileDataStore.

Я предполагаю, что Lambda не нравится это, потому что он пытается получить доступ к файловой системе.

Кто-нибудь сталкивался с этой проблемой раньше, и если да, знаете ли вы решение? Я не уверен, что любая из реализаций Google для IDataStore будет работать? https://developers.google.com/api-client-library/dotnet/reference/1.9.2/interfaceGoogle_1_1Apis_1_1Util_1_1Store_1_1IDataStore

EDIT: Интересно, нужно ли мне создать реализацию базы данных IDataStore? Что-то вроде: https://www.codeproject.com/Articles/1088092/ADO-NET-Implementation-of-Google-API-IDataStore. Кажется немного странным, что Google не предоставляет такую ​​реализацию, хотя ...

...