web-dev-qa-db-ja.com

GoogleサービスアカウントのアクセストークンのJavaScriptを取得する方法

リーダーシップがサイトの使用状況を表示できるように、サイトの分析ダッシュボードを設定しようとしています。結果を表示するためにGoogleアカウントを持っている必要も、個人を追加する必要もありません。

サービスアカウントとOAuth2アクセスを設定しました。私が見つけるすべてのチュートリアルは次のようなコードを示しています:

gapi.analytics.auth.authorize({
  clientid: 'Service account client ID',
  serverAuth: {
      access_token: 'XXXXXXXXXXXXXXXXX'
}

そして、すべてのドキュメントは「...アクセストークンを受け取ったら...」について語っていますが、実際にそれを取得する方法を述べているものはありません!証明書のフィンガープリント、公開鍵のフィンガープリントが表示されます。また、JSONキーとP12キーを生成する方法も示しています。アクセストークンの生成方法がわかりません。

誰かがこれを行う方法を説明できますか?

私は this を見つけました。それは私がキーファイルを必要とし、それが悪い考えであることを説明していますが、実際にそれを行う方法を述べていません。

this も見つかりました。しかし、Node.jsについて何も知らないので、それが1つの可能なルートにすぎないことを期待していますか?

17
Rothrock

ついに動作しました! JWTのkjurのjsjws純粋なJavaScript実装を使用します。トークンを要求するJWTを生成するための基礎として、 このデモ を使用しました。手順は次のとおりです

Google Developers Consoleでサービスアカウントを作成しました。そのための手順は次のとおりです

Google APIコンソールで、サービスアカウントを認証情報に追加しました。次に、新しいJSONキーを生成しました。これにより、プレーンテキスト形式の私の秘密キーが得られます。

次に、HTTP/RESTを使用して承認されたAPI呼び出しを行う方法について、Googleからのこれらの指示に従いました。

これは必須のヘッダー情報です。

var pHeader = {"alg":"RS256","typ":"JWT"}
var sHeader = JSON.stringify(pHeader);

そして、クレームセットはこのようなものです。 (これは、上記のKJUR JWTライブラリーによって提供される構文を使用しています。)

var pClaim = {};
pClaim.aud = "https://www.googleapis.com/oauth2/v3/token";
pClaim.scope = "https://www.googleapis.com/auth/analytics.readonly";
pClaim.iss = "<[email protected]";
pClaim.exp = KJUR.jws.IntDate.get("now + 1hour");
pClaim.iat = KJUR.jws.IntDate.get("now");

var sClaim = JSON.stringify(pClaim);

物議を醸しているビットは、クライアント側のコードに私の秘密鍵を入れています。この使用法については、それほど悪くはありません(私は思いません)。最初に、サイトは企業ファイアウォールの背後にあるので、だれが「ハッキング」するのでしょうか。次に、誰かが取得した場合でも、サービスアカウントの唯一の認証は分析データを表示することです。これが私のダッシュボードの目的は、ページにアクセスした誰もが分析データを表示できるようにすることです。ここでは秘密鍵を投稿しませんが、基本的にはそうです。

var key = "-----BEGIN PRIVATE KEY-----\nMIIC....\n-----END PRIVATE KEY-----\n";`enter code here`

次に、署名付きJWTを生成しました

 var sJWS = KJUR.jws.JWS.sign(null, sHeader, sClaim, key);

その後、XMLHttpRequestを使用してgoogle APIを呼び出しました。リクエストでFormDataを使用しようとしましたが、うまくいきませんでした。だから古い(古い)学校

var XHR = new XMLHttpRequest();
var urlEncodedData = "";
var urlEncodedDataPairs = [];

urlEncodedDataPairs.Push(encodeURIComponent("grant_type") + '=' + encodeURIComponent("urn:ietf:params:oauth:grant-type:jwt-bearer"));
urlEncodedDataPairs.Push(encodeURIComponent("assertion") + '=' + encodeURIComponent(sJWS));
urlEncodedData = urlEncodedDataPairs.join('&').replace(/%20/g, '+');

// We define what will happen if the data are successfully sent
XHR.addEventListener('load', function(event) {
    var response = JSON.parse(XHR.responseText);
    token = response["access_token"]
});

// We define what will happen in case of error
XHR.addEventListener('error', function(event) {
    console.log('Oops! Something went wrong.');
});

XHR.open('POST', 'https://www.googleapis.com/oauth2/v3/token');
XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
XHR.send(urlEncodedData)

その後、アクセストークンを取得し、埋め込みAPIの使用について これらのチュートリアル に従いますが、次のように承認します。

gapi.analytics.auth.authorize({
    serverAuth: {
        access_token: token
    }
});

他のユーザーと同じように、サービスアカウントにコンテンツを表示する権限を与える必要があることを忘れないでください。そしてもちろん、サービスアカウントが読み取り専用以外の操作を許可されている場合、それは本当に悪い考えです。

私が遭遇するタイミングとトークンの期限切れに関してもおそらく問題があるでしょうが、これまでのところとても良いです。

25
Rothrock

Node.js用の公式(およびアルファ版)Google APIを使用してトークンを生成できます。サービスアカウントがある場合に役立ちます。

サーバー上:

npm install -S googleapis

ES6:

import google from 'googleapis'
import googleServiceAccountKey from '/path/to/private/google-service-account-private-key.json' // see docs on how to generate a service account

const googleJWTClient = new google.auth.JWT(
  googleServiceAccountKey.client_email,
  null,
  googleServiceAccountKey.private_key,
  ['https://www.googleapis.com/auth/analytics.readonly'], // You may need to specify scopes other than analytics
  null,
)

googleJWTClient.authorize((error, access_token) => {
   if (error) {
      return console.error("Couldn't get access token", e)
   }
   // ... access_token ready to use to fetch data and return to client
   // even serve access_token back to client for use in `gapi.analytics.auth.authorize`
})
5
hwrod