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