【问题标题】:Receiving 403 error with Users.Messages.Send in Gmail API在 Gmail API 中使用 Users.Messages.Send 接收 403 错误
【发布时间】:2019-07-30 00:26:39
【问题描述】:

我正在尝试从 C# .NET MVC 应用程序调用 GmailService 上的发送。当我调用发送时,我不断收到 403 错误。

我检查了我的范围,Gmail 设置肯定启用了 Gmail API,而且我的 ClientID 和 ClientSecret 是新的。

var httpClient = new HttpClient{
  BaseAddress = new Uri("https://www.googleapis.com")
};

var requestUrl = $"oauth2/v4/token?code={code}&client_id={ClientId}&client_secret={SecretKey}&redirect_uri={RedirectUrl}&grant_type=authorization_code";

var dict = new Dictionary<string, string>{
  { "Content-Type", "application/x-www-form-urlencoded" }
};

var req = new HttpRequestMessage(HttpMethod.Post, requestUrl){Content = new FormUrlEncodedContent(dict)};
var response = await httpClient.SendAsync(req);
var token = JsonConvert.DeserializeObject<GmailToken>(await response.Content.ReadAsStringAsync());
Session["user"] = token.AccessToken;

//var obj = await GetuserProfile(token.AccessToken);
var obj = await DoSendEmail(token);
public void DoSendEmail(GmailToken inToken) {
  const string fromAcct = "XXXXXXXX@gmail.com";

  TokenResponse token = new TokenResponse();
  token.AccessToken = inToken.AccessToken;
  token.ExpiresInSeconds = inToken.ExpiresIn;
  token.IdToken = inToken.IdToken;
  token.TokenType = inToken.TokenType;
  token.IssuedUtc = DateTime.UtcNow;

  IAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer {
    ClientSecrets = secrets,
    Scopes = SCOPES,
    ProjectId = "Xcent CP"
  });

  UserCredential credential = new UserCredential(flow, fromAcct, token);

  if (credential.Token.IsExpired(credential.Flow.Clock)) {
    bool success = credential.RefreshTokenAsync(CancellationToken.None).Result;
    if (!success) {
      throw new Exception("Could not refresh token");
    }
  }

  GmailService gs = null;
  try {
    gs = new GmailService(new Google.Apis.Services.BaseClientService.Initializer() {
       ApplicationName = APP_NAME,
       HttpClientInitializer = credential
    });

    var mailMessage = new System.Net.Mail.MailMessage();
    mailMessage.From = new System.Net.Mail.MailAddress(fromAcct);
    mailMessage.To.Add("XXXXXXXX@comcast.net");
    mailMessage.ReplyToList.Add(fromAcct);
    mailMessage.Subject = "Test email";
    mailMessage.Body = "<html><body>Hi <b>Lee</b>, this is <b>yet another</b> test message.</body></html>";
    mailMessage.IsBodyHtml = true;

    var mimeMessage = MimeKit.MimeMessage.CreateFromMailMessage(mailMessage);

    var gmailMessage = new Google.Apis.Gmail.v1.Data.Message {
      Raw = Encode(mimeMessage.ToString())
    };

    gs.Users.Messages.Send(gmailMessage, fromAcct).Execute();

  }
  catch (Exception ex) {
    throw ex;
  }
  finally {
    if (gs != null) {
      gs.Dispose();
    }
    gs = null;
  }
}

我不知道该去哪里看...我浏览了很多很多在线文章和教程,似乎尝试了所有方法,但我仍然遇到 403 错误。救命!

谢谢, 李

【问题讨论】:

  • 这是你的全部代码吗?您在哪里使用 Google 的服务器进行身份验证?如果您查看developer's API reference for C#,这里有关于如何设置 Google 身份验证的指南。哪一行代码返回 403 错误?
  • 嗨 Rafa,失败的行是“gs.Users.Messages.Send(gmailMessage, fromAcct).Execute();”。不确定您所说的身份验证是什么意思...我有以下代码: Response.Redirect($"accounts.google.com/o/oauth2/v2/auth?client_id={ClientId}&response_type=code&scope=openid%20email%20profile&redirect_uri={RedirectUrl}&state=abcdef");
  • 您需要进行身份验证,以便向 Google 证明实际上是您授权这些操作,而不是其他人。您是否要访问您在 Response.Redirect 中获得的链接?您需要访问该 URL 并确认您愿意让程序以您的名义运行。
  • 以“var httpClient”(上面的第一个块)开头的代码是我处理重定向的地方。我收到了一个令牌,但该令牌似乎没有 mail.google.com 范围。
  • 代码中的一行是Scopes = SCOPESSCOPES 来自哪里?您需要定义范围,例如:static string[] SCOPES = { GmailService.Scope.Gmail}; 我建议您将代码基于 .NET 快速入门模板 developers.google.com/gmail/api/quickstart/dotnet 并通过您的请求替换请求 UsersResource.LabelsResource.ListRequest request = service.Users.Labels.List("me");...Users.Messages.Send(...

标签: c# google-api gmail-api


【解决方案1】:

所以在花了很多时间研究这个问题后,我发现了问题所在。我的 Google 登录链接是这样的:

Response.Redirect($"https://accounts.google.com/o/oauth2/v2/auth?client_id={ClientId}&response_type=code&scope=openid%20email%20profile&redirect_uri={RedirectUrl}&state=abcdef");

“openid%20email%20profile”是我为登录指定的唯一范围,因此关于我用于流变量的范围的 403 错误。

呸!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-18
    • 2020-04-05
    • 2021-08-20
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多