我需要使用服务帐户从谷歌搜索控制台(Webmaster Tools)检索一些数据。
到目前为止,我已经能够检索到服务帐户的access_token
,我需要将其附加到请求的url中。问题是我找不到这样做的方法,这是我正在使用的代码:
function retrieveSearchesByQuery(token)
{
gapi.client.webmasters.searchanalytics.query(
{
'access_token': token,
'siteUrl': 'http://www.WEBSITE.com',
'fields': 'responseAggregationType,rows',
'resource': {
'startDate': formatDate(cSDate),
'endDate': formatDate(cEDate),
'dimensions': [
'date'
]
}
})
.then(function(response) {
console.log(response);
})
.then(null, function(err) {
console.log(err);
});
}
这是函数调用的url:
https://content.googleapis.com/webmasters/v3/sites/http%3A%2F%2Fwww.WEBSITE.com/searchAnalytics/query?fields=responseAggregationType%2Crows&alt=json"
相反,它应该是这样的:
https://content.googleapis.com/webmasters/v3/sites/http%3A%2F%2Fwww.WEBSITE.com/searchAnalytics/query?fields=responseAggregationType%2Crows&alt=json&access_token=XXX"
gapi.client.webmasters.searchanalytics.query
不将'access_token'
识别为有效密钥,因此它不会将其附加到url,这就是为什么我得到401 Unauthorized
作为响应的原因。
如果我使用'key'
而不是'access_token'
,则参数会附加到url,但'key'
用于OAuth2
身份验证,因此我传递的服务帐户令牌无效。
有人对此有解决方案或变通办法吗?
如果您的应用程序请求私有数据,则该请求必须由访问该数据的经过身份验证的用户授权。根据搜索控制台API文档中的规定,应用程序必须使用OAuth 2.0来授权请求。不支持其他授权协议。
如果应用程序配置正确,则在使用Google API时,经过身份验证的请求看起来与未经身份验证的申请完全相同。如文档中所述,如果应用程序收到OAuth 2.0令牌,JavaScript客户端库会自动将其包含在请求中。
您提到您已经检索到access_token
,如果接收正确,API客户端将自动为您发送此令牌,您不必自己附加。
一个非常基本的身份验证工作流,一旦通过身份验证,发送请求就像下面的代码一样。搜索控制台API可以使用以下作用域:https://www.googleapis.com/auth/webmasters
和https://www.googleapis.com/auth/webmasters.readonly
。
var clientId = 'YOUR CLIENT ID';
var apiKey = 'YOUR API KEY';
var scopes = 'https://www.googleapis.com/auth/webmasters';
function auth() {
// Set the API key.
gapi.client.setApiKey(apiKey);
// Start the auth process using our client ID & the required scopes.
gapi.auth2.init({
client_id: clientId,
scope: scopes
})
.then(function () {
// We're authenticated, let's go...
// Load the webmasters API, then query the API
gapi.client.load('webmasters', 'v3')
.then(retrieveSearchesByQuery);
});
}
// Load the API client and auth library
gapi.load('client:auth2', auth);
此时,需要修改retrieveSearchesByQuery
函数,因为它不再需要通过参数获取令牌来在查询中传递令牌。JavaScript客户端库应该自动将其包含在请求中。
您还可以使用API资源管理器检查特定查询支持哪些参数,并检查关联的请求。
如果您需要使用外部生成的访问令牌(服务帐户应该是这种情况),则需要使用gapi.auth.setToken
方法为应用程序自己设置OAuth 2.0令牌对象:
gapi.auth.setToken(token_Object);