GoogleAPI GMail要求进行身份验证,而不是使用刷新令牌?

时间:2019-09-09 16:27:50

标签: c# google-api gmail access-token refresh-token

我正在使用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”调用)来做到这一点吗?

感谢您的答复。

0 个答案:

没有答案