5

ドキュメントには、いくつかの言語で Analytics API の使用を実装するためのチュートリアルが含まれているのではないかと思っていました。

今PHPでアクセストークンを保存して維持する方法を示しています.JSが何らかの形でローカルストレージにそれを維持していると思いますが、ユーザーがアクセスするたびに認証することを望まないので、私の計画は保存することです.データベースにアクセスしてトークンを更新し、すべてのポップアッププロセスを実行するのではなく、クライアント側に適用するだけです。

チュートリアルによると、これ:

 gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: false}, result);

アクセストークンを返すポップアップを起動しますが、データベースからトークンを送信することに興味があることをもう一度言います。

どうすればそれができますか?

gapi.auth.setToken(token)Core Reporting API を呼び出すことができる方法はありますか?

4

2 に答える 2

11

GoogleのPHPクライアントライブラリを使用して認証を行うPHPを既に作成した後、これを使用するソリューションを探してここに到着しました。あなたが言及したように、保存されたトークンを共有し、再認証やポップアップのトリガーなしでjavascriptを使用できるようにしたかった(.init(callback)メソッドを使用してこれに対する解決策があるかもしれません。最後にドキュメント/リンクを参照してください)。

gapi.auth.setToken(token) メソッドはありますか

あなたが言及した正確なsetToken(token)機能があり、PHPで以前に生成された認証トークンを共有することさえできます。まだ確信が持てないのは、それを行うべきかどうかです:)

私は PHP を使用して初期認証を行っていますが、おそらく JavaScript クライアントでは、この例と同じ方法でsetToken()保存したものを呼び出すことができます。getToken()CORS (末尾のリンクを参照) のように、API 認証のドキュメントで言及されているように、これにはより良いアプローチがあるかもしれませんが、これらのいずれもまだ調査する機会がありませんでしたが、質問に答える例を挙げることができます。同じ動作を必要とする他の人に役立つかもしれません

私が最初に見つけたのは、Google 開発者の Dan Holevoet のブログ投稿で、いくつかのサンプル JS コードが掲載されていました。

http://googleappsdeveloper.blogspot.com.au/2011/12/using-new-js-library-to-unlock-power-of.html

JavaScriptで直接APIに問い合わせたり、動的にリストをロードしたりできるのは素晴らしいのですが、もちろんこれで気になったのはclientidなどをjsに保存することでした。

// Snippet from Dan's post
var clientId = 'YOUR_CLIENT_ID';
var apiKey = 'YOUR_API_KEY';
var scopes = 'https://www.googleapis.com/auth/calendar';

function handleClientLoad() {
    gapi.client.setApiKey(apiKey);
    window.setTimeout(checkAuth,1);
    checkAuth();
}

しかし、ダンによると、同じ質問への回答:

apiKey は、API コンソールで宣言する必要がある指定されたリファラーと組み合わせて使用​​されます。承認されていないリファラーからキーが送信された場合、キーは機能しません。他のユーザーが自分のリクエストにあなたの apiKey を使用しないように、承認済みリファラー リストをできるだけ制限する必要があります。

さて、私の例はカレンダー API の場合ですが、他の API との一貫性も十分にあるようです。

注: このスニペットは概念実証のみを目的としており、おそらく本番環境では使用しないでください。言及されたリファラー保護により、このようなことをしても問題ないと思いますが、さらに検討する必要があります。非表示の入力、AJAX 呼び出しなどによって実行できます。しかし、最終的には、それらはすべて JavaScript で表示されます。

コンセプトをテストするために私が行ったことは次のとおりです。

  • コールバックと同じスクリプト/URL を使用して、PHP クライアント ライブラリ経由で認証します (これらのコールバックについては [API コンソール][2] を参照してください)。
  • 認証が成功すると、コールバックで、ページ内のグローバル javascript 変数を格納された PHP 認証トークンに設定します。
  • ページが読み込まれたら、最初のクリック イベントで JavaScript を使用する (またはドキュメントの準備ができている場合でも)、呼び出しauthMe()てトークンを設定します。
  • その後、通常どおり続行し、最初の PHP 認証プロセスでスコープを指定したすべての JavaScript API メソッドを呼び出します (この場合はmakeApiCall()) 。

そのようです:

php コールバック ルーチンでは、まだ認証されているかどうかに関係なく (コールバック URL が同じスクリプトであると仮定して)、この var をグローバルにします。

<script type="text/javascript">
    // A place to stick PHP's auth token once the auth dance is done
    var dodgey_global_access_token = {};
</script>

ここで、php コールバック ルーチンで、認証済みであることを確認し、呼び出された (後で使用するために IE が認証トークンをどこかに保存している) か、少なくとも意味のあるものを持っていることを確認します。$_SESSION['token'] = $client->getAccessToken();$client->getAccessToken()

<script type="text/javascript">
// Set the js var via PHP here.. Yeck... Note json encode in php and parse in jquery
dodgey_global_access_token = $.parseJSON (<?php  echo json_encode ($client->getAccessToken() ); ?>);
// dodgey_global_access_token now contains the auth token structure

// Removed auth-related functions in Dan's code - we'll already have a token

// Dan's orig function to list events in 'primary' calendar
function makeApiCall() {
  gapi.client.load('calendar', 'v3', function() {
    var request = gapi.client.calendar.events.list({
      'calendarId': 'primary'
    });

    request.execute(function(resp) {
      for (var i = 0; i < resp.items.length; i++) {
        var li = document.createElement('li');
        li.appendChild(document.createTextNode(resp.items[i].summary));
        document.getElementById('events').appendChild(li);
      }
    });
  });
}

// My function to setToken with the token injected from PHP authentication
function authMe () {
    // Stuff the token into the gapi object
    gapi.auth.setToken( dodgey_global_access_token );

    // Now call the original 'makeAPICall' function now that we're 'authenticated'
    makeApiCall();  
}
</script>

注:この例では、JSON をすばやく解析するために jquery を使用しました。プロジェクトで既に使用していますが、そうでない場合は、別のライブラリを見つける必要があります。

関連/有用なドキュメント:

// Sorry, as a new poster I can only post 2 hyperlinks, 
// so embedding this in code snippet
// 
//    http://code.google.com/p/google-api-javascript-client/wiki/ReferenceDocs#gapi
//    http://code.google.com/p/google-api-javascript-client/wiki/Authentication
//    http://code.google.com/p/google-api-javascript-client/issues/detail?id=22
//    http://code.google.com/p/google-api-javascript-client/wiki/CORS
//    https://code.google.com/apis/console

何か不明な点があればお知らせください。実際のサンプルをデモに投稿できます。

于 2013-01-02T03:10:44.943 に答える