【问题标题】:How to get new access token in c#?如何在 C# 中获取新的访问令牌?
【发布时间】:2021-01-09 04:12:55
【问题描述】:

我正在阅读/发送带有 API 请求的 c# 中的 gmail 电子邮件。我有一个访问令牌,但它在一小时后过期,不再执行进一步的操作。请问有人可以帮助我了解如何获取新的有效访问令牌的程序吗?

提前谢谢你!

编辑:

这是我获得授权的代码:

public static GmailService AuthenticateOauthGmail(string clientSecretJson, string userName)
    {
        try
        {
            if (string.IsNullOrEmpty(userName))
                throw new ArgumentNullException("userName");
            if (string.IsNullOrEmpty(clientSecretJson))
                throw new ArgumentNullException("clientSecretJson");
            if (!File.Exists(clientSecretJson))
                throw new Exception("clientSecretJson file does not exist.");

            // These are the scopes of permissions you need. It is best to request only what you need and not all of them
            string[] scopes = new string[] { "https://mail.google.com"};

            //UserCredential credential;
            using (var stream = new FileStream(clientSecretJson, FileMode.Open, FileAccess.Read))
            {
                string credPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
                credPath = Path.Combine(credPath, ".credentials/", System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);


                // Requesting Authentication or loading previously stored authentication for userName
                Variables.Credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets,
                                                                         scopes,
                                                                         userName,
                                                                         CancellationToken.None,
                                                                         new FileDataStore(credPath, true)).Result;
                var newCredentials = GoogleWebAuthorizationBroker.ReauthorizeAsync(Variables.Credential, CancellationToken.None);
            }

            // Create Drive API service.
            return new GmailService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = Variables.Credential,
                ApplicationName = "Gmail Oauth2 Authentication Sample"
            });
        }
        catch (Exception ex)
        {
            Console.WriteLine("Create Oauth2 account GmailService failed" + ex.Message);
            throw new Exception("CreateServiceAccountGmailFailed", ex);
        }
    }

这就是我的 Credentials.Token 的样子 credentials.Token

由于访问令牌已过期,在尝试阅读邮件时,我收到错误消息:

{
"error": {
    "code": 401,
    "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
    "errors": [
        {
            "message": "Invalid Credentials",
            "domain": "global",
            "reason": "authError",
            "location": "Authorization",
            "locationType": "header"
        }
    ],
    "status": "UNAUTHENTICATED"
   }
}

我有 nuget 包 Google.Apis.Auth。我应该使用另一个吗?

【问题讨论】:

  • 请编辑您的问题并包含您的代码,我会看看是否可以提供帮助。您是否使用 Google .net 客户端库,如果是,它应该会为您处理所有这些。
  • 嗨@DaImTo,我已经编辑了我的帖子。请你再过一遍好吗?谢谢你:)

标签: c# api email request gmail


【解决方案1】:

对于谷歌服务的扩展访问,你不能只发出一个访问令牌,你应该使用刷新令牌。请参阅基本步骤 5:https://developers.google.com/identity/protocols/oauth2#:~:text=If%20your%20application%20needs%20access,long%20as%20they%20remain%20valid

您可以在此类上使用 RefreshTokenAsync 方法: https://googleapis.dev/dotnet/Google.Apis.Auth/latest/api/Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow.html

【讨论】:

  • 嗨@Semlir Aljic,谢谢你的回复:) 我知道我应该使用刷新令牌,但不知道如何使用它们,因为API 请求需要在标头中访问令牌。还是应该在标头中发送刷新令牌?
  • 嘿@nellop 我已经更新了我的答案。如果没有,我希望这对你来说已经足够了,在堆栈溢出之前有类似的问题,你可以在这里找到更多信息:stackoverflow.com/questions/22357348/…
  • 非常感谢@Selmir Aljic,我成功获得了新的访问令牌:)
  • @nellop 不客气,我很高兴能为您提供帮助 :)
猜你喜欢
  • 2019-09-09
  • 2022-10-13
  • 2018-02-17
  • 1970-01-01
  • 2020-02-26
  • 2021-01-29
  • 2018-11-26
  • 1970-01-01
相关资源
最近更新 更多