Как я могу использовать токен Refre sh для создания нового токена аутентификации с помощью Google API (C#)? - PullRequest
0 голосов
/ 11 февраля 2020

Пожалуйста, прости меня, если это новый ie вопрос. Приведенный ниже код работает в течение первого часа, затем срок действия токена доступа истекает, и он больше не работает. Я читал много мест, где токен доступа должен быть обновлен с помощью токена refre sh, но я нигде не вижу, как это сделать. Я использую сгенерированный токен доступа для отправки электронной почты. Спасибо за вашу помощь!


    private void GetClientSecrets()
    {
            // I don't like requesting this much access but I can't get it to work with less access
            string[] scopes = { "email", "profile", "https://mail.google.com/" };

            UserCredential credential;

            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                new ClientSecrets
                {
                    ClientId = _clientID,
                    ClientSecret = _clientSecret
                },
                scopes,
                "user",
                CancellationToken.None,
                new FileDataStore(_credentialPath, true)).Result;

            var jwtPayload = GoogleJsonWebSignature.ValidateAsync(credential.Token.IdToken).Result;
            _username = jwtPayload.Email;
            _accessToken = credential.Token.AccessToken;

}

    public void SendGmail(string toEmail, string subject, string body, string replyTo = "", string cc = "", string bcc = "")
    {
            // Gmail SMTP server address
            SmtpServer oServer = new SmtpServer("smtp.gmail.com");
            // enable SSL connection
            oServer.ConnectType = SmtpConnectType.ConnectSSLAuto;
            // Using 587 port, you can also use 465 port
            oServer.Port = 587;

            // use Gmail SMTP OAUTH 2.0 authentication
            oServer.AuthType = SmtpAuthType.XOAUTH2;
            // set user authentication
            oServer.User = _username;
            // use access token as password
            oServer.Password = _accessToken;
            oServer.MailFrom = _username;

            SmtpMail oMail = new SmtpMail("TryIt");
            oMail.From = _username;
            oMail.To = toEmail;
            if (!string.IsNullOrWhiteSpace(cc))
            {
                oMail.Cc = cc;
            }
            if (!string.IsNullOrWhiteSpace(replyTo))
            {
                oMail.ReplyTo = replyTo;
            }
            if (!string.IsNullOrWhiteSpace(bcc))
            {
                oMail.Bcc = bcc;
            }

            oMail.Subject = subject;
            oMail.TextBody = body;

            if (SystemConfig.DebugMode)
            {
                Logger.SimpleWriteToLog($"Sending email from {_username} (reply to: {replyTo}) to {toEmail} (CC: {cc}, BCC: {bcc}) using OAUTH 2.0{Environment.NewLine}{subject}{Environment.NewLine}{body}");
            }

            EASendMail.SmtpClient oSmtp = new EASendMail.SmtpClient();
            oSmtp.SendMail(oServer, oMail);
    }

}

ОБНОВЛЕНИЕ (2/12/2020)

Я не мог найти, как сделать это в API, но на этой странице показано, как это можно сделать с помощью POST.

Обновление токена доступа

https://developers.google.com/identity/protocols/OAuth2InstalledApp#offline

1 Ответ

0 голосов
/ 24 марта 2020

ОБНОВЛЕНИЕ (2/12/2020)

Я не смог найти, как это сделать в API, но на этой странице показано, как это можно сделать с помощью POST.

Обновление токен доступа

https://developers.google.com/identity/protocols/OAuth2InstalledApp#offline

...