Вчера я создал ClientID и Client Secret (используя руководство это) для аутентификации настольного приложения (C# /. NET) для отправки электронных писем из учетной записи Gmail.
Мой метод, который аутентифицирует и отправляет электронное письмо, выглядит следующим образом:
public static async System.Threading.Tasks.Task<int> SendEmailOAuth2Async(string sFromMailAddress, string sClientID, string sClientSecret)
{
var credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets
{
ClientId = sClientID,
ClientSecret = sClientSecret
},
new[] { "email", "profile", "https://mail.google.com/" },
"user",
CancellationToken.None
) ;
var jwtPayload = GoogleJsonWebSignature.ValidateAsync(credential.Token.IdToken).Result;
var username = jwtPayload.Email;
var mailMessage = new MimeMessage();
mailMessage.From.Add(new MailboxAddress("from name", sFromMailAddress));
mailMessage.To.Add(new MailboxAddress("to name", "[email protected]"));
mailMessage.Subject = "Automated Mail with OAuth";
mailMessage.Body = new TextPart("plain")
{
Text = "Hello"
};
using (var client = new SmtpClient())
{
client.Connect("smtp.gmail.com", 587, SecureSocketOptions.StartTls);
// use the access token
var oauth2 = new SaslMechanismOAuth2(sFromMailAddress, credential.Token.AccessToken);
client.Authenticate(oauth2);
client.Send(mailMessage);
client.Disconnect(true);
}
return 0;
}
Вчера отправка электронного письма этим методом работала. Сегодня я получаю
System.AggregateException: 'One or more errors occured. (JWT has expired.)'
Я новичок в OAuth и токенах. Что я могу сделать, чтобы это снова заработало?
Вы имеете в виду, когда я назначаю jwtPayload
? Потому что это то, что я нашел для этого. См. emailarchitect.net/easendmail/sdk/html/object_oauth.htm под заголовком «Использовать идентификатор клиента и секрет клиента для получения токена доступа».
Очень впечатляет, я никогда не думал об использовании библиотеки таким образом. Мне просто интересно, у какого JWT истек срок действия. вещь использует швы Idtoken странно, поскольку он не будет обновляться, если вы не используете соединение с открытым идентификатором и пользователь не вошел в систему. Использование хранилища файловых данных для обновления просто обновляет токен доступа, используя сохраненный токен обновления. Вы не получите новый IdToken, если пользователь не войдет в систему.
Можете ли вы включить минимальный воспроизводимый пример, я даже не могу заставить ваш код скомпилировать, что-то не хватает.
Вы используете клиентскую библиотеку Google .net для создания токена доступа для использования с сервером Smtp. Ну давай, я даже не думал, что это возможно. Мне любопытно, почему вы передаете IdToken, а не токен доступа