Java ライブラリとサービス アカウントを使用して GA からデータを取得しようとしています。必要なすべての設定を行いました。Cloud コンソールで Analytics API をアクティブ化し、サービス アカウントを生成し、秘密鍵を取得し、GA ユーザー管理で読み取り権限を持つ生成された開発者の電子メールを追加します。
私のローカル実装では、これはうまくいきます。しかし、サーバー側から同じコードを実行しようとすると、「401 Unauthorized Login Required」というステータスが表示されます。どちらの実装も、Java 5 ランタイム、Google API サービス Java ライブラリ バージョン 1.17.0 rev75 を使用します。
認証情報定義を含むコード スニペット:
HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
JsonFactory JSON_FACTORY = new JacksonFactory();
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("xxx@developer.gserviceaccount.com")
.setServiceAccountScopes(Arrays.asList(AnalyticsScopes.ANALYTICS_READONLY))
.setServiceAccountPrivateKeyFromP12File(new File("privatekey.p12"))
.build();
Analytics オブジェクトとクエリ ビルダー:
Analytics analytics = new Analytics.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName("MyApp")
.build();
Get apiQuery = analytics.data().ga().get("ga:123", "2013-12-09","2013-12-09", "ga:visits");
HttpResponse response = apiQuery.executeUnparsed();
トラフィックを比較するために httpLogger を追加しました。ローカルとサーバーの実行の場合、承認フローは同じであり、アクセストークンの取得に問題はありません。
ローカルで実行すると、ステータス 200 の応答を受け取りました。
CONFIG: -------------- RESPONSE --------------
HTTP/1.1 200 OK
Alternate-Protocol: 443:quic
ETag: "xxxx"
Date: Mon, 30 Dec 2013 13:12:32 GMT
Content-Type: application/json; charset=UTF-8
X-Content-Type-Options: nosniff
Cache-Control: private, max-age=0, must-revalidate, no-transform
Content-Length: 1728
Content-Encoding: gzip
X-XSS-Protection: 1; mode=block
Expires: Mon, 30 Dec 2013 13:12:32 GMT
X-Frame-Options: SAMEORIGIN
Server: GSE
{JSON BODY}
しかし、サーバーを実行すると、ステータス 401 の応答を受け取りました。
CONFIG: -------------- RESPONSE --------------
401 Unauthorized
date: Mon, 30 Dec 2013 13:17:32 GMT
alternate-protocol: 443:quic
server: GSE
www-authenticate: Bearer realm="https://www.google.com/accounts/AuthSubRequest"
transfer-encoding: chunked
expires: Mon, 30 Dec 2013 13:17:32 GMT
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
content-type: application/json; charset=UTF-8
cache-control: private, max-age=0
{"error":{"errors":[{"domain":"global","reason":"required","message":"Login Required","locationType":"header","location":"Authorization"}],"code":401,"message":"Login Required"}}
誰でも私を助けることができますか?私が知っていることはすべて本当にチェックしましたが、運がありません。
編集 ドメイン全体の権限のサービス アカウントへの委任が Google アナリティクス API に関連しているかどうかは誰にもわかりませんか?
よろしく、セルゲイ。