データベースに保存したトークンを安全に取り出す方法について

2,494 views
Skip to first unread message

imai

unread,
May 22, 2012, 1:13:53 AM5/22/12
to google-app...@googlegroups.com
Google APIのPHPクライアントでカレンダーAPIにアクセスしようとしています。
OAuth2認証をしています。
ユーザーはGoogle Apps for Businessのアカウントでアプリケーションにアクセスします。

毎回ユーザーに認可させたくないので、取得したAccess TokenとRefresh Tokenを
データベースに保存しておいて、次回以降はデータベースから取り出したトークンを
利用しようと思っています。

データベースに保存することはできましたが、では、ユーザーがアプリケーションに
アクセスした時に、どのレコードのトークンを取得すればよいか、どうやって判定す
れば安全か?という点で悩んでいます。

セッションIDをクライアント端末に保存しておけば良いのかもしれませんが、端末を
複数人で共用している場合、たとえGoogle Appsからログアウトしても、他人のア
カウントでAPIアクセスできてしまうのではないかと思われます。

そこで、Google App Engineのget_current_userのようなものがあれば、ログインし
ているアカウントのIDとセットでトークンを保存し、取り出す際も、ログインしてい
るアカウントのIDで問い合わせれば、問題は解決するのですが、ログイン情報を取得
する方法が見つかりません。

質問は以下の2点です。
1.Google APIでログイン情報を取得する方法はあるのでしょうか?
2.ログインアカウント情報をキーにする以外で他に良い方法はございますでしょうか?

よろしくお願い致します。

Shinichi Ogawa

unread,
May 22, 2012, 1:24:36 AM5/22/12
to google-app...@googlegroups.com
imaiさん

Calendar Data APIの利用承認を求める際のスコープに
https://www.googleapis.com/auth/userinfo.profile
を追加して、取得したトークンを使って
https://www.googleapis.com/oauth2/v2/userinfo
へアクセスすれば、Calendar Data APIを利用承認したユーザのIDが取得できます。

その値とセットにしてトークンを保存するのはどうでしょうか。

2012/5/22 imai <bonkb...@gmail.com>:

imai

unread,
May 22, 2012, 4:27:32 AM5/22/12
to google-app...@googlegroups.com
shin1ogawaさん

ご回答ありがとうございます。

その値とセットにしてトークンを保存するのはどうでしょうか。 

次回ユーザーが再度アプリケーションにアクセスした際に、ログインIDを取得するには、
再度認可が必要だと理解しておりますが、認識違いでしょうか。

ユーザーに認可を求めないために、トークンを保存するとしても、データベースから
そのトークンを取り出すキーは、やはりセッションIDのようなものになるのでしょうか。

以上よろしくお願い致します。



2012年5月22日火曜日 14時24分36秒 UTC+9 shin1ogawa:
2012年5月22日火曜日 14時24分36秒 UTC+9 shin1ogawa:

Shinichi Ogawa

unread,
May 22, 2012, 4:41:22 AM5/22/12
to google-app...@googlegroups.com
imaiさん

認証(Googleや独自アプリ等)→Calendarの利用を認可→トークン取得…
ではないのですね?

アプリケーションが認証を持たないならサーバ側へのトークンの保存は無理ですが、
approval_prompt=auto を指定して毎回アクセストークンを取得してはどうでしょうか?
クライアント側のローカルストレージやクッキーにトークンを保持することもできますが、
安全とは思えません。

2012/5/22 imai <bonkb...@gmail.com>:

imai

unread,
May 22, 2012, 5:36:17 AM5/22/12
to google-app...@googlegroups.com
shin1ogawaさん

approval_prompt=autoというオプションがあったのですね。一度認可すれば、そのアカウントについては以後自動承認され、access tokenが毎回発行される、ということでしょうか。

いま試せる環境にいないのですが、のちほど試してみます。

ありがとうございます!

imai

unread,
May 24, 2012, 3:15:20 AM5/24/12
to google-app...@googlegroups.com
shin1ogawaさん

すいません、approval_prompt=autoを指定した場合の挙動について、確認させて下さい。

以下のサンプルコードに、$client->setApprovalPrompt('auto');を追加しました。
http://code.google.com/p/google-api-php-client/source/browse/trunk/examples/calendar/simple.php

1. 初回アクセス時はもちろん、認可画面へのリンク(Connect Me!)が表示されるので、クリックして
認可画面に遷移します。

2. 認可画面でアプリケーションからのアクセスを許可します。

3. リダイレクト先ページでカレンダー情報が表示されていることを確認します。

4. 次に、別のブラウザでGoogleにログインしてから、アプリケーションにアクセスします。

5. 再度認可画面へのリンクが表示されるので、クリックします。

6. (5)のリンクをクリックすると、再び認可確認画面が表示されてしまいます。

(5)の認可画面のURLには、approval_prompt=autoパラメータがついています。
(6)でクリックした際に、認可画面がスキップされて、アクセストークン付きでリダイレクト
されるのがapproval_prompt=autoの挙動かと思っていましたが、そうではないのですね。

では、approval_prompt=autoによって、何が自動化されるのでしょうか?

2012年5月22日火曜日 17時41分22秒 UTC+9 shin1ogawa:
Reply all
Reply to author
Forward
0 new messages