我很难使用Google Analytics Reporting API v4对Node.js client library进行身份验证。 我尝试了所有方法,从JWT(服务令牌:JSON和P12),API密钥和OAuth 2.0开始,但我从未成功通过身份验证。
我在开发者控制台中激活了API,创建了ID并授予了我的Google Analytics分析属性和视图的权限。 我成功获得了服务帐户的授权和访问令牌,但我不知道如何使用它来对Analytics Reporting API v4进行身份验证。
我被困在401错误消息前面:"请求没有有效的身份验证凭据"。 我尝试使用JWT模仿用户,但随后服务帐户未经授权。
使用Node.js客户端库和JWT身份验证:
var google = require('googleapis.js');
var viewID = 'XXXXXXXXX'; // Google Analytics view ID
var key = require('service_account.json'); // Service account
var jwtClient = new google.auth.JWT(key.client_email, null, key.private_key, ['https://www.googleapis.com/auth/analytics.readonly'], null);
var oauth2Client = new google.auth.OAuth2();
jwtClient.authorize(function(err, result) {
if (err) {
console.log('Unauthorize');
console.log(err);
return;
}
oauth2Client.setCredentials({
access_token: result.access_token
});
//Need to authenticate somewhere near here
var analytics = google.analyticsreporting('v4');
//Or here
var req = {
reportRequests: [
{
viewId: viewID,
dateRanges: [
{
startDate: '2016-05-01',
endDate: '2016-06-30',
},],
metrics: [
{
expression: 'ga:users',
}, {
expression: 'ga:sessions',
},],
},],
};
//Maybe here
analytics.reports.batchGet(req,
function(err, response) {
if (err) {
console.log('Fail');
console.log(err);
return;
}
console.log('Success');
console.log(response);
}
);
});
Node.js客户端库的早期版本似乎有一个方法来指定客户端但它已经消失,可能已弃用。
withAuthClient(oauth2Client)
我已经尝试在API调用或请求中传递客户端或令牌,但都没有。
google.analyticsreporting({ version: 'v4', auth: oauth2Client });
google.analyticsreporting({ version: 'v4', access_token: result.access_token });
也许这是一个noob问题,但我不知道该怎么做,我在google api或客户端库文档中没有看到与Analytics Reporting v4身份验证相关的任何内容,大多数示例我发现使用了Google AnalyticsAPI v3。
如果有人成功通过Google Analytics Reporting API v4进行身份验证,请提供帮助:/
答案 0 :(得分:7)
找出我遗失的内容:
Google API客户端库“选项”:
google.options({ auth: oauth2Client }); //this one is not very optional
与Google Analytics Reporting API v4文档不同,使用客户端库的查询必须包含标头,以便为每个请求指定客户端(感谢CVarisco注意到,client library documentation并非如此准确..):
var request ={
'headers': {'Content-Type': 'application/json'},
'auth': oauth2Client,
'resource': req,
};
答案 1 :(得分:0)
另请注意,在服务器端对服务帐户进行身份验证的推荐方法是使用auth.getApplicationDefault。
https://developers.google.com/identity/protocols/application-default-credentials
我们建议在任何一个中使用Application Default Credentials 以下情况:
...略...
- 您正在访问API,其中包含与云项目关联的数据或以其他方式确定整个应用程序的范围,而不是个人用户数据。对于涉及用户数据的呼叫,最好使用授权流,最终用户明确同意访问(请参阅使用OAuth 2.0访问Google API)。
答案 2 :(得分:0)
这是我做到的方式:
您将需要在以下位置为您的应用程序创建凭据:https://console.developers.google.com/apis。这将为您提供客户端ID和客户端密码(注意-请确保https://developers.google.com/oauthplayground作为授权的重定向uri)。然后转到https://developers.google.com/oauthplayground创建授权令牌。您获得的访问令牌应通过标头和值:“ Authorization”:“ Bearer {{AccessToken}}”发送到Google API。如果您的令牌已过期,则可以通过点击OAUTH api(https://www.googleapis.com/oauth2/v4/token),在查询和“ user-agent”中发送refresh_token,client_id,client_secret,grant_type和access_type来检索一个新令牌:'google-oauth-playground ”。
如果遇到问题,请按照此处描述的方式实施Google API:https://developers.google.com/analytics/devguides/reporting/core/v4/quickstart/web-js。然后,您可以在浏览器中使用开发人员工具,以查看确切的值被发送到哪里。
希望这会有所帮助。 :)