我需要在自定义搜索引擎上进行 CRUD。从文档 https://developers.google.com/custom-search/docs/api,它看起来非常简单。但我不断收到 401 回复。
我正在使用 Google.Apis.Oauth2.v2 来获取令牌:
String serviceAccountEmail = "[email protected] /cdn-cgi/l/email-protection";
var certificate = new X509Certificate2(@"key.p12", "blah", X509KeyStorageFlags.Exportable);
var credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
Scopes = new[] { "https://www.googleapis.com/auth/cse" }
}.FromCertificate(certificate));
bool result = credential.RequestAccessTokenAsync(CancellationToken.None).Result;
TokenResponse token = credential.Token;
然后,我将令牌添加到以下请求(授权:Bearer mytoken):
GET http://cse.google.com/api/<USER_ID>/cse/<CSE_ID>
有几件事让我很震惊。
- 文档的准确引用:
虽然您可以将 HTTP 请求设置为 URLhttp://cse.google.com/api/[USER_ID]/cse/[CSE_ID] http://cse.google.com/api/%5BUSER_ID%5D/cse/%5BCSE_ID%5D,我们建议使用
改为以下 URL:
http://cse.google.com/api/[USER_ID]/cse/[CSE_ID] http://cse.google.com/api/%5BUSER_ID%5D/cse/%5BCSE_ID%5D
请注意,两个 URL 完全相同。
在身份验证部分,示例使用 ClientLogin,但已弃用。没有 OAuth 2.0 的示例。
在文档的示例中,它说:
每个自定义搜索引擎均由创建的唯一 ID 标识
将用户 ID 与自定义搜索引擎 ID 组合,并用 分隔
冒号,像这样:
011737558837375720776:mbfrjmyam1g 在本例中,用户 ID 为
011737558837375720776,搜索引擎ID为mbfrjmyam。
您可能已经注意到,搜索引擎 ID 比应有的值少了 2 个字符。
- 我在任何地方都没有看到范围为“https://www.googleapis.com/auth/cse https://www.googleapis.com/auth/cse“。我刚刚从 stackoverflow 的帖子中复制了它。
我知道这是一个很长的问题,但我希望这将帮助下一个人看这个并考虑这些要点。
有人知道为什么是401吗?