javascript - 无法使用服务帐户令牌生成 Google Analytics DataChart 客户端(无效凭据错误)
问题描述
我正在尝试通过他们的 Javascript API 实现Google Analytics Graphs,作为他们网站链接上的示例。
但是每次我尝试执行gapi.analytics.googleCharts.DataChart时,我都会收到“401 Invalid Credentials”
我正在使用以下代码以及为服务帐户生成的 JSON 中的数据获取访问令牌服务器端 (C#)
var cred = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(clientId)
{
Scopes = new[] { AnalyticsReportingService.Scope.AnalyticsReadonly },
User = clientEmail,
ProjectId = "projectID"
}.FromPrivateKey(privateKey));
var token = cred.GetAccessTokenForRequestAsync(authURI);
token.Wait();
var result = token.Result;
return result;
或(使用完整的 json 字符串,也请参见注释)
GoogleCredential cred;
var gCred = GoogleCredential.FromJson(json).UnderlyingCredential as
ServiceAccountCredential;
var token = gCred.GetAccessTokenForRequestAsync("https://accounts.google.com/o/oauth2/auth");
return token.Result;
在客户端时
gapi.analytics.auth.authorize({
'serverAuth': {
'access_token': '{{ ACCESS_TOKEN_FROM_SERVICE_ACCOUNT }}'
}
});
通过并使用gapi.analytics.auth.isAuthorized()使用任何服务器端函数返回 true 但尝试调用时失败
var dataChart1 = new gapi.analytics.googleCharts.DataChart(queryJson);
dataChart1.execute();
返回 401 “Invalid Credentials”,服务器端查询返回值就好了,所以我认为用户权限不是问题
注意:使用与第二个相同的代码(使用 json 字符串生成凭证而不强制转换为 ServiceAccountCredential)我可以从 API 服务器端获取数据
cred = gCred.CreateScoped(scopes);
using (var reportingService = new AnalyticsReportingService(new BaseClientService.Initializer
{
HttpClientInitializer = cred
}))
...
var getReportsRequest = new GetReportsRequest
{
ReportRequests = new List<ReportRequest> { reportRequest }
};
var batchRequest = reportingService.Reports.BatchGet(getReportsRequest);
var response = batchRequest.Execute(); //This returns a response object with all the data I need
解决方案
如果有人有同样的问题:
您需要使用GoogleCredential.GetApplicationDefault()来创建 Credential 对象,在分析的情况下,您应该得到类似这样的东西
var credential = GoogleCredential.GetApplicationDefault().CreateScoped(AnalyticsReportingService.Scope.AnalyticsReadonly);
这将从 Windows 上的环境变量中获取 json 文件,因此您需要将GOOGLE_APPLICATION_CREDENTIALS与 json 的路径设置为系统变量。
初始化服务并设置服务变量
using (var reportingService = new AnalyticsReportingService(new BaseClientService.Initializer { HttpClientInitializer = credential }))
{
var serviceCredential = cred.UnderlyingCredential as ServiceAccountCredential;
}
推荐阅读
- powershell - 在 powershell 中构建自定义对象(添加成员)
- javascript - 相对于鼠标坐标缩放画布
- ms-access - 将 access mde 从 32 位转换为 64 位
- c# - 实体框架核心包含不偶尔工作
- javascript - 是否可以使用 Microsoft 的 Graph API 从组织的 One Drive 帐户创建可共享的嵌入链接?
- karate - 在 url 中传递变量 - 空手道
- javascript - RabbitMq 与 reactJS
- postgresql - 是什么决定了将大查询粘贴到 psql 中的限制?
- android - 如何为自定义吐司布局设置主题?
- python - 在 Windows 中终止使用 shell=True 启动的后台进程