20771
Google Web
Authについての疑問です。Webサービス上でOAuthを使いユーザー認証を行いユーザー情報を取得する仕組みがありますが、Googleサービスから返されるトークンの意味がきちんと理解できていません。

![Google Sign-In for server-side
appsのフロー図](https://developers.google.com/+/images/server_side_code_flow.png)

上記は、[Google Sign-In for server-side
apps](https://developers.google.com/identity/sign-in/web/server-side-
flow?hl=ja)のフロー図を抜粋したものです。  
OAuthの認証は自分でもコードを書いたことがあり、基本的な仕組みは理解しているつもりです。そこからアプリケーション側へ返されるトークン2種類とコードの意味や取り扱いがよくわかりません。

具体的にわからないのは以下の3点です。

  1. access_token、id_token、one-time codeはどういうもので、それぞれはどう違うのか？
  2. 上記の3つの値はどの程度のセキュリティのもとで扱われるべきなのか？例えば、アプリケーション側のサーバーがSSL(https)を使用していない場合（つまり、図中のClient→Serverの通信が暗号化されていない場合）でもこの値をやりとりすることは問題とならないのか？
  3. ログインした後もServerを通じて継続的にAPIを呼びたい場合、上記の3つの値を保存するなどして対応するものなのか？それとも、Client側からServerにリクエストをするたびにどれかの値を渡してあげるものなのか？

項目数が多くなってしまったのですが、一部だけでもご教授いただければ幸いです。よろしくお願い致します。
CC BY-SA 3.0
2015-11-05T15:16:44.177
18442
2016-01-09T03:38:21.373
2015-11-05T15:58:49.617
7229
7229
question
oauth
OAuth認証でのトークンやコードの意味・取り扱い方法は？
『1.access_token、id_token、one-time
codeはどういうもので、それぞれはどう違うのか？』についてわかる範囲(+調べた範囲)で回答させて頂きます。

  * access_token  
OAuth2.0認証後にGoogleのAPIを叩くときに利用します。  
Google APIを叩くときにヘッダーにaccess_tokenを入れておかないとunauthorized errorが発生します。

  * id_token  
JWT(Json Web Token)と呼ばれるデータ形式で、ユーザのユニークな識別子が入っています。  
これは各種サービス間でのID連携するときに利用します。  
例えば、GREEにログインするときにYahoo!アカウントを使ってログインした場合に、ユーザの基本情報(名前やメールアドレス)が自動で入力されていることがあると思います。  
そういった連携を組み込みたい場合に使ったりします。

  * one-time code  
アクセストークンを取得するための一時的なコードです。  
Googleが示している図を見てみると、ClientがGoogle API Serverからaccess_tokenおよびid_tokenを取得しています。  
サービスの仕様的にClientからだけではなく、バックエンドサーバからもaccess_tokenもしくはid_tokenを利用したい場合に、『Clientからバックエンドサーバに送ったone-
time code』を利用して、Google API Serverから改めてaccess_token, id_tokenを取得します。

少しでも参考になれば幸いです。

参考ページ  
[Google アカウントの認証を OpenID から OpenID Connect に移行する方法](http://webos-
goodies.jp/archives/how_to_migrate_from_openid_to_openid_connect.html)  
[OpenID Connect 入門
〜コンシューマーにおけるID連携のトレンド〜](http://www.slideshare.net/kura_lab/openid-connect-id)  
[OAuth 2.0 の Response Type
全パターン](http://oauth.jp/blog/2015/01/06/oauth2-multiple-response-type/)
CC BY-SA 3.0
2015-11-06T05:12:34.423
18461
2015-11-06T05:12:34.423
8968
18442
answer
>   2.
> 上記の3つの値はどの程度のセキュリティのもとで扱われるべきなのか？例えば、アプリケーション側のサーバーがSSL(https)を使用していない場合（つまり、図中のClient→Serverの通信が暗号化されていない場合）でもこの値をやりとりすることは問題とならないのか？
>

access_tokenは、ユーザが認可した保護リソースへのアクセス（=API呼び出し）が実現可能になる「非常に重要な値」です。これが第3者に漏れた＝そのユーザが認可した範囲内で本来保護されていたものが保護されていない状況になる、ということを意味します。そのため、厳重に扱うべき対象になります。アプリ側からGoogle
APIを利用する際にAccessTokenを指定することになりますが、この際にはhttpsが適用されると思うので、盗聴によって攻撃者がAccessTokenを入手することから守られます。これ以外のいかなる状況において「AccessTokenを通信路に流さない（例えhttpsであっても）」つまりGoogle
APIを使う以外の目的でAccessTokenを扱わない、という方針が良いと思います。

id_tokenは、ユーザ認証した結果が含まれているものですね。これに関しても、ユーザ認証時にid_tokenを得て「誰がアクセスしてきたのか」を知ることができた後は、基本的にid_tokenは使わない、とした方が安全かと思います。セッションを維持するためのIDとしてid_tokenを使う、ということも考えられますが、その場合もClientおよびClientとServer間での第3者によるid_token値の奪取ができないことを保証してあげなければなりません。そうでないと、なりすましが可能になってしまいます。

one-timeは、その名の通り、access_tokenとid_tokenを得た後は即捨てて下さい。

>   3.
> ログインした後もServerを通じて継続的にAPIを呼びたい場合、上記の3つの値を保存するなどして対応するものなのか？それとも、Client側からServerにリクエストをするたびにどれかの値を渡してあげるものなのか？
>

ClientとServer間で独自にSession管理を行い、access_token（必要であればid_tokenも）はServer側で認証UserやSessionに紐づけて保持しておいて、Google
APIを使いたいときにaccess_tokenを利用する、っていう感じかと思います。Client側にaccess_tokenは渡さない方が良いです。
CC BY-SA 3.0
2016-01-09T03:38:21.373
20771
2016-01-09T03:38:21.373
531
18442
answer