Как мы храним маркер доступа GMail OAuth пользователя с помощью Mailkit в ASP.NET Основной веб-сайт?

#c# #gmail #gmail-api #gmail-imap #mailkit

Вопрос:

Я пытался использовать Mailkit и OAuth для чтения почтового ящика Gmail пользователя и следовал образцу кода, приведенному в часто задаваемых вопросах Mailkit. Для протокола, вот код, который я использую…

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

 private async Task<ImapClient> GetMailClientOAuth(string account, string clientId, string clientSecret) {
  ClientSecrets clientSecrets = new() {
    ClientId = clientId,
    ClientSecret = clientSecret
  };
  GoogleAuthorizationCodeFlow codeFlow = new(new GoogleAuthorizationCodeFlow.Initializer {
    DataStore = new FileDataStore($@"{_env.ContentRootPath}{account}"),
    Scopes = new[] { "https://mail.google.com/" },
    ClientSecrets = clientSecrets
  });

  LocalServerCodeReceiver codeReceiver = new();
  AuthorizationCodeInstalledApp authCode = new(codeFlow, codeReceiver);
  UserCredential credential = await authCode.AuthorizeAsync(account, CancellationToken.None);

  if (authCode.ShouldRequestAuthorizationCode(credential.Token)) {
    await credential.RefreshTokenAsync(CancellationToken.None);
  }

  SaslMechanismOAuth2 oauth2 = new(credential.UserId, credential.Token.AccessToken);

  ImapClient client = new();
  await client.ConnectAsync("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect);
  await client.AuthenticateAsync(oauth2);
  return client;
}
 

Код отлично работал в приложении для тестовой консоли, и сейчас я пытаюсь интегрировать код в свой ASP.NET Основное веб-приложение.

Я создал веб-проект на своей панели управления Google Cloud, добавил API Gmail и создал учетные данные OAuth, как и для консольного приложения.

Когда я пытаюсь ввести код для доступа к Gmail, в моем браузере появляется окно с сообщением…

Ошибка Авторизации

Ошибка 400: перенаправление_ури_мисматч

URI перенаправления в запросе, http://localhost:54392/authorize/, не соответствует тем, которые авторизованы для клиента OAuth

Теперь я понятия не имею, где он появился http://localhost:54392/authorize/, так как он не имеет никакого сходства ни с чем, что я использую (не то, чтобы я давал ему какой-либо URL-адрес в любом случае), но я перешел по ссылке, которая была в сообщении, и установил URL-адрес, который находится на моем веб-сайте (при запуске на моем локальном компьютере).

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

Я проверил идентификатор клиента и секрет, и я определенно использую правильные.

Кто-нибудь знает, куда это ведет http://localhost:54392/authorize/ от, и как я говорю ему использовать что-то другое?

Спасибо

Ответ №1:

Не уверен, правильно ли это, но я решил эту проблему, установив тип проекта в настольное приложение, для которого не требуется URI перенаправления.

Комментарии:

1. Спасибо, это было просто!