EDIT:最初这个问题问我如何仅使用我的 API 密钥通过 Google Analytics API 进行身份验证。作为弗拉特科指出 https://stackoverflow.com/a/13834210/697449,这是不可能的。现在我只专注于让 OAuth2 正常工作。当我有机会时,我会尝试 vlatko 的建议并更新问题。同时,如果您认为我遗漏了任何内容,请随时提供答案。
原问题:
我正在尝试向 Google Analytics API 发出请求。我正走过你好分析 https://developers.google.com/analytics/solutions/articles/hello-analytics-api教程尝试复制这些步骤。无论我尝试什么,我似乎都无法成功进行身份验证。
该教程说如下:
打开您创建的名为HelloAnalyticsApi.java
并添加
以下方法:
private static Analytics initializeAnalytics() throws Exception {
// Authorization.
Credential credential = OAuth2Native.authorize(
HTTP_TRANSPORT, JSON_FACTORY, new LocalServerReceiver(),
Arrays.asList(AnalyticsScopes.ANALYTICS_READONLY));
// Set up and return Google Analytics API client.
return Analytics.builder(HTTP_TRANSPORT, JSON_FACTORY)
.setApplicationName("Google-Analytics-Hello-Analytics-API-Sample")
.setHttpRequestInitializer(credential)
.build();
}
当用户遇到此脚本时,应用程序将尝试
打开默认浏览器并将用户导航到托管在的 URL
google.com。此时会提示用户登录并
授予应用程序访问其数据的权限。一旦授予,
应用程序将尝试从浏览器窗口读取代码,然后
关上窗户。
不同之处在于,我尝试使用 servlet 应用程序来执行此操作,并且我希望通过 API 密钥(而不是 OAuth 2.0 客户端 ID)使用简单的 API 访问。我知道建议使用 OAuth 2.0,但我只需要访问我拥有的数据,并希望简化技术要求。我做出这个决定的依据是这一页 https://developers.google.com/console/help/#WhatIsKey,其中说:
API 密钥是您使用控制台生成的唯一密钥。什么时候
您的应用程序需要调用此项目中启用的 API,
应用程序将此密钥作为key={API_key}
范围。使用此密钥不需要任何用户操作或
同意,不授予访问任何帐户信息的权限,并且不
用于授权。
如果您只是调用不需要用户数据的API,例如
Google Custom Search API,那么 API 密钥可能更简单
实施。但是,如果您的应用程序已经使用 OAuth 2.0
访问令牌,那么也无需生成 API 密钥。在
事实上,如果 OAuth 2.0 访问令牌是 Google 会忽略传递的 API 密钥
已经关联到相应的项目。
我找不到仅使用 API 密钥进行身份验证流程的许多代码示例 - 我发现的大多数内容都显示使用客户端 ID 和下载的 .p12 文件,例如GoogleCredential http://javadoc.google-api-java-client.googlecode.com/hg/1.12.0-beta/com/google/api/client/googleapis/auth/oauth2/GoogleCredential.htmljavadoc。我能找到的一个示例应用程序是 Google 的书籍样本 http://code.google.com/p/google-api-java-client/source/browse/books-cmdline-sample/src/main/java/com/google/api/services/samples/books/cmdline/BooksSample.java?repo=samples应用程序。不管怎样,这就是我尝试过的(模仿教程中的第一个请求,它从管理 API 获取帐户列表):
Analytics analytics =
new Analytics.Builder(httpTransport, jsonFactory, null)
.setApplicationName("Dev API Access")
.build();
Management.Accounts.List list =
analytics.management().accounts().list().setKey(apiKey);
Accounts accounts = list.execute();
其中“Dev API Access”是我的 API 控制台仪表板中的“名称”字段。 API 密钥是仅限于我的 IP 地址的服务器密钥。此操作失败并出现以下响应:
401 Unauthorized
{
"code": 401,
"errors": [
{
"domain": "global",
"location": "Authorization",
"locationType": "header",
"message": "Login Required",
"reason": "required"
}
],
"message": "Login Required"
}
我也尝试过这个:
Analytics analytics =
new Analytics.Builder(httpTransport, jsonFactory, null)
.setApplicationName("Dev API Access")
.setGoogleClientRequestInitializer(new AnalyticsRequestInitializer(apiKey))
.build();
Management.Accounts.List list = analytics.management().accounts().list();
Accounts accounts = list.execute();
这显示了相同的错误。我在这里做错了什么?分析调用是否需要 OAuth2?如果是这样,为什么在 Books Sample 应用程序中只使用 API 密钥就可以工作?
继续,我继续尝试 OAuth2 - 我创建了一个客户端 ID 并下载了 .p12 私钥文件。但我也无法让它发挥作用。这是我尝试过的:
Credential credential =
new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(serviceAccountId)
.setServiceAccountScopes(AnalyticsScopes.ANALYTICS_READONLY)
.setServiceAccountPrivateKeyFromP12File(new File(p12FilePath))
.setServiceAccountUser(serviceAccountUser)
.build();
Analytics analytics =
new Analytics.Builder(httpTransport, jsonFactory, credential)
.setApplicationName("Dev API Access")
.build();
Management.Accounts.List list = analytics.management().accounts().list();
Accounts accounts = list.execute();
Where serviceAccountId
是拥有该项目的 Google 帐户的电子邮件地址,并且serviceAccountUser
是生成的客户端 ID 上列出的电子邮件地址。失败并出现以下情况:
400 Bad Request
{
"error": "invalid_grant"
}
“无效授权”是什么意思,以及如何成功进行身份验证(最好没有 OAuth2)?