我正在使用Google Gmail API从我的c#应用程序发送电子邮件。该应用程序使用我在在线示例中找到的方法存储凭据。自从我第一次对应用程序进行身份验证以来,它一直运行良好。今天,它突然要求我再次验证该应用程序-它打开了一个浏览器窗口,并要求我使用该应用程序的发件人电子邮件登录,然后发送了验证码,等等。现在它又可以正常工作了。
我认为“刷新令牌”本来可以防止重新认证?使用刷新令牌是否有一些技巧,还是我需要手动检查令牌过期?我认为只要您存储了刷新令牌,它就会自动处理。
这是我用来获取/存储凭据并发送电子邮件的代码:
UserCredential credential;
using (var stream =
new FileStream(jsonfile, FileMode.Open, FileAccess.Read))
{
// The file token.json stores the user's access and refresh tokens, and is created
// automatically when the authorization flow completes for the first time.
string credPath = "token.json";
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
Scopes,
"user",
CancellationToken.None,
new FileDataStore(credPath, true)).Result;
Console.WriteLine("Credential file saved to: " + credPath);
}
// Create Gmail API service.
var service = new GmailService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = ApplicationName,
});
var mailMessage = new System.Net.Mail.MailMessage();
mailMessage.From = oFromAddress;
mailMessage.To.Add(oToAddress);
mailMessage.ReplyToList.Add(oFromAddress);
mailMessage.Subject = szSubject;
mailMessage.Body = szBody;
mailMessage.IsBodyHtml = false;
foreach (XmlElement oElement in oSettings["Settings"]["ErrorAttachFiles"])
{
try
{
mailMessage.Attachments.Add(new Attachment(m_szBuildToolsDirectory + "/"+oElement.Attributes["Name"].Value));
}
catch
{
//skip file if not found
}
}
var mimeMessage = MimeKit.MimeMessage.CreateFromMailMessage(mailMessage);
var gmailMessage = new Google.Apis.Gmail.v1.Data.Message
{
Raw = Encode(mimeMessage.ToString())
};
Google.Apis.Gmail.v1.UsersResource.MessagesResource.SendRequest request = service.Users.Messages.Send(gmailMessage, "me");
request.Execute();
此SO线程(Google.Apis client for C#sharp auth using refresh token)表示我可以像这样检查到期时间:
if (credential.Token.IsExpired(Google.Apis.Util.SystemClock.Default))
{
var refreshResult =
credential.RefreshTokenAsync(CancellationToken.None).Result;
}
但这是必要的吗?还是应该由AuthorizeAsync调用处理。另外,就像该线程中的OP一样,如果我以这种方式手动进行刷新,则无法确定是否需要再次手动存储新令牌。
此外,现在它又可以工作了,我不确定如何测试修复程序。如何使当前令牌无效,以便可以测试修复程序?我需要通过代码(即“ revokeToken”调用)来做到这一点吗?
感谢您的答复。