使用 API 键通过列表端点检索 Gmail 收件箱内容时出现 401 错误

Getting 401 error when using API Key to Retrieve Gmail inbox contents via list endpoint

我正在尝试为我们的应用程序添加一些 API 测试,以验证邮件是否已发送并最终在 Gmail 中收到。我继续在 Google 云服务开发人员控制台中为我的电子邮件添加了一个 API 密钥,并创建了以下代码。

Client.cs class 只是我在网上找到的一个示例,我对其进行了调整并使用了我们的端点(也许这种策略不适用于 Gmail API?)

Enpoints.cs 只是 class 到 return 的 URL。我还将密钥作为可选参数包含在内

Test.cs 仅包含一段我如何调用端点并获取 401 未经授权的错误

我们是否能够使用列表端点通过 API 密钥获取 gmail 收件箱的内容?

Client.cs

public enum Command {
    GET,
    POST,
    PUT,
    DELETE }

namespace Project{
    public class Client
    {

        public string endPoint { get; set; }
        public Command execute { get; set; }
        public string contentType { get; set; }
        public string postData { get; set; }
        public string encoded = "";

        // Basic Client
        public Client()
        {
            endPoint = "";
            execute = Command.GET;
            contentType = "application/JSON";
            postData = "";
            encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes("email@gmail.com"
+ ":" + "mypass"));
        }

        // Basic Request
        public string Request(string parameters)
        {
            var request = (HttpWebRequest)WebRequest.Create(parameters);
            request.Headers.Add("Authorization", "Basic " + encoded);
            request.Method = execute.ToString();
            request.ContentLength = 0;
            request.ContentType = contentType;

            if (postData != "")
            {
                request.SendChunked = true;
                request.ContentType = "application/json";

                using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                {
                    string json = postData;

                    streamWriter.Write(json);
                }
            }

            using (var response = (HttpWebResponse)request.GetResponse())
            {
                var responseValue = string.Empty;

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    var message = String.Format("Failed: Received HTTP {0}", response.StatusCode);
                    Console.WriteLine(message);
                    //throw new ApplicationException(message);
                }

                using (var responseStream = response.GetResponseStream())
                {
                    if (responseStream != null)
                        using (var reader = new StreamReader(responseStream))
                        {
                            responseValue = reader.ReadToEnd();
                        }
                }

                return responseValue;
            }
        }
    }


}

Endpoints.cs

namespace Project
{
    class Endpoints
    {

        // Class to store URLs for Gmail Integrations
        public static class Gmail
        {
            // Class to interface with Gmail Messages
            public static class Messages
            {
                // Retrieve Messsages (List)
                public static string List(string userId)
                {
                    return "https://gmail.googleapis.com/gmail/v1/users/" + userId + "/messages?key=mykey";
                }
            }
        }

    }
}

Test.cs

// Prepare the Client
Client client = new Client();

// Get the Response
client.execute = Command.GET;
var response = client.Request(Endpoints.Gmail.Messages.List("email@gmail.com"));

// Print Response
Console.WriteLine(response);

没有

由于 Gmail 包含个人|用户数据,因此您需要为特定用户提供一种允许使用 OAuth2 进行访问的工具。 domain-wide delegation of a Service Account Workspace 中有一个工具允许服务帐户代表您的用户进行操作。

Google的APIs Explorer很有用。

在浏览器中 Gmail API, you can interact with e.g. users.messages.list

Google 为每项服务提供 8 种语言的 auto-generated API 客户端库。这里是 Gmail API Client Library for .NET。我 强烈建议您使用 Google SDKs 以避免直接处理 API 的类型、身份验证、日志记录等。如您所见,这可能具有挑战性,不必要地重复工作(最好留给 Google)并增加安全审计的范围。

如果您查看 APIs Explorer 中的 HTTP 示例。您将看到 HTTPS 请求必须包含一个 Authorization header,其值为 Bearer [SOME-ACCESS-TOKEN]。访问令牌将由 Google 的 OAuth2 端点提供给您。

https://developers.google.com/gmail/api/reference/rest/v1/users.messages/list?apix_params=%7B%22userId%22%3A%22me%22%7D&apix=true

我找不到 link 来很好地概述 API 密钥以及为什么应该避免使用它们进行身份验证。 API 密钥很容易获得并且是不记名凭证(即您不希望它们很容易获得)。通常 (!) API 键用于将请求与特定的 Google 项目相关联以用于计费目的。它们不应用于对用户进行身份验证。参见 API keys

对于可能偶然发现此问题的任何其他人,事实证明使用 GMail 确实没有简单的方法来执行此操作。 post 确实描述了一种方法,但是使用 OAuth2 身份验证,您将需要使用浏览器弹出窗口登录,这意味着没有无头 API 测试..

https://www.swtestacademy.com/gmail-api-test-automation/

我最终使用了这个产品,https://testmail.app/,它超级实惠,重量轻,如果你只是想做一些简单的电子邮件验证,它会很好用。