[69] [DFN[[RUBYB[アクセストークン]@en[access token]]]]は、 [[OAuth]] において[[資源鯖]]上の[[資源]]にアクセスするための[[トークン]]です。

* 仕様書

[REFS[
- [1] [CITE@en[RFC 5849 - The OAuth 1.0 Protocol]] ([TIME[2014-12-28 14:19:21 +09:00]] 版) <http://tools.ietf.org/html/rfc5849#section-1.1>
- [3] [CITE@en[RFC 5849 - The OAuth 1.0 Protocol]] ([TIME[2014-12-28 14:19:21 +09:00]] 版) <http://tools.ietf.org/html/rfc5849#section-2>
- [7] [CITE@en[RFC 5849 - The OAuth 1.0 Protocol]] ([TIME[2014-12-28 14:19:21 +09:00]] 版) <http://tools.ietf.org/html/rfc5849#section-2.3>
- [23] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-1.4>
- [33] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-3.1.1>
- [57] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-4.2.1>
- [71] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-5.1>
- [6] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-10.3>
- [16] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-10.8>
- [17] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-10.10>
- [18] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#appendix-A.12>
- [34] [CITE@en[RFC 6750 - The OAuth 2.0 Authorization Framework: Bearer Token Usage]] ([TIME[2015-02-11 06:22:47 +09:00]] 版) <http://tools.ietf.org/html/rfc6750#section-2>
- [36] [CITE@en[RFC 7009 - OAuth 2.0 Token Revocation]] ([TIME[2014-12-21 18:10:21 +09:00]] 版) <http://tools.ietf.org/html/rfc7009#section-2.1>
- [42] [CITE@en[RFC 6819 - OAuth 2.0 Threat Model and Security Considerations]] ([TIME[2015-02-10 06:43:00 +09:00]] 版) <http://tools.ietf.org/html/rfc6819#section-4.4.1.11>
]REFS]

* アクセストークンの種類

[70] 
[[アクセストークン]]は[[プロトコル]]によって何種類か違いがあります。

[72] 
例えば [[OAuth2]] の [CODE[Bearer]] [[認証方式]]では、
[[持参人トークン]]
([[ベアラートークン]])
と呼ばれる種類のものを使います。

* OAuth 1.0 トークン credentials

[21] [DFN[[RUBYB[トークン]@en[token]]]]は、
[[鯖]]が発行する固有の識別子であり、
[[認証された要求]]と[[クライアント]]が[[認可]]を要求している、または取得した[[資源所有者]]とを関連付けるため[[クライアント]]が使うものです [SRC[>>1]]。
[[OAuth 1.0]] で用いられる [[credentials]] の一種で、仕様書中ではしばしば[DFN[[RUBYB[[[トークンcredentials]]]@en[token credentials]]]]とも呼ばれています。

[22] [[トークンcredentials]]は、
[DFN[[RUBYB[[[トークン識別子]]]@en[token identifier]]]]と[DFN[[RUBYB[[[トークン共有秘密]]]@en[token shared-secret]]]]で構成されます。

;; [2] 元はそれぞれ [DFN[[[access token]]]] および [DFN[[[access token secret]]]]
と呼んでいました [SRC[>>1]]。

;; [29] [[トークン識別子]]は[[認証された要求]]に直接含めて送信されますが、
[[トークン共有秘密]]は直接は含まれません。[[トークン識別子]]は公開されても問題は無いはずですが、
通常その必要がないので[[鯖]]と[[クライアント]]の間でだけ共有されます。
[[トークン共有秘密]]は[[鯖]]と[[クライアント]]の間で秘密にする必要があります。

;; [31] 厳密性を必要としない場面では、[[アクセストークン]]と[[アクセストークン秘密]]をまとめて「[[アクセストークン]]」と呼ぶこともあります。

[66] [[Evernote]] では[[トークン共有秘密]]は常に[[空文字列]]です [SRC[>>65]]。

[REFS[
- [65] [CITE@en[認証 - Evernote Developers]] ([TIME[2015-03-06 09:30:38 +09:00]] 版) <https://dev.evernote.com/intl/jp/doc/articles/authentication.php>
]REFS]

* OAuth 2.0 アクセストークン

[24] [DFN[[RUBYB[[[アクセストークン]]]@en[access token]]]]は、
[[被保護資源]]へのアクセスに使う[[credentials]] であり、
[[クライアント]]に発行された[[認可]] ([[資源所有者]]が[[承諾]]したアクセスの範囲 ([[scope]])
や期間) を表す[[文字列]]です [SRC[>>23]]。

[25] 通常この[[文字列]]は[[クライアント]]には[[不透明]]なものです [SRC[>>23]]。
[[アクセストークン]]は[[認可]]情報を取得するために使う識別子でも構いませんし、
それ自体に[[認可]]情報 (と検証するための[[署名]]) を含んでいても構いません [SRC[>>23]]。

;; [30] [[OAuth 1.0]] [[アクセストークン]]は[[識別子]]と[[共有秘密]]の2つの値の組でしたが、
[[OAuth 2.0]] [[アクセストークン]]は1つの値です。

[20] [[アクセストークン]]を構成する[[文字]]は、[CODE(URI)@en[[[access_token]]]]
[[引数]]の構文より、1つ以上の[[印字可能ASCII文字]]に制限されます。

;; [[アクセストークン型]]によっては更に制限があります。

;; [44] [[アクセストークン型]]によっては[[アクセストークン]]自体の他に、
いくつかの追加の[[引数]]を使うことがあります。[[アクセストークン型]]を参照。

[60] [[アクセストークン]]の長さは、 [[OAuth]] 仕様上制限がありません。
[[クライアント]]は[[アクセストークン]]の長さに仮定を置くべきではありません。
[[認可鯖]]は、[[アクセストークン]]の長さを明文化する[['''べきです''']]。
[SRC[>>58, >>71]]

[15] [[認可鯖]]は、[[アクセストークン]]を推測できないようにしなければ[['''なりません''']] [SRC[>>6, >>17]]。
攻撃者が推測できる確率は 2[SUP[-128]] [[以下]]で[['''なければならず''']]、
2[SUP[-160]] [[以下]]である[['''べきです''']] [SRC[>>17]]。

[41] 攻撃者が[[認可鯖]]に[[認可符号]]を発行させる操作を大量に実行して[[認可符号]]を枯渇させるような[[DoS攻撃]]があり得ますから、
[[利用者]]ごとに発行数を制限するなど、対策を講じるべきです [SRC[>>42]]。

[26] [[クライアント]]が[[アクセストークン]]を使う際に、その他の[[認証]]の
[[credentials]] が必要であっても構いません (が、 [[OAuth]] の仕様の範囲外です)
[SRC[>>23]]。

;; [27] 例えば [[OAuth]] とは別に[[基本認証]]の [[credentials]] が必要かもしれません。

[11] [[アクセストークン]]は、転送や蓄積において[[機密]]を保持しなければ[['''ならず''']]、
[[認可鯖]]、適用対象の[[資源鯖]]、発行先の[[クライアント]]のみの間で共有しなければ[['''なりません''']]
[SRC[>>6]]。

;; [14] [[暗示的承諾型]]では[[資源所有者]]に[[アクセストークン]]が転送されるため、
この要件を完全には満たせません。

[28] [[アクセストークン]]は、[[認可承諾]]フローにより、
あるいは[[更新トークン]]を使って取得できます。

[4] [[アクセストークン]]には、種別 ([[トークン型]]) があり、それによって[[被保護資源]]にアクセスする際の[[認証]]方式が異なります。

[12] [[アクセストークン]]は、[[HTTPS]] [[サーバー認証]]のもとでしか転送しては[['''なりません''']]
[SRC[>>6, >>16]]。

;; [13] [[アクセストークン]]は[[認可エンドポイント]]や[[トークンエンドポイント]]で用いられますが、そこでは [[TLS]] が要求されています。
[[リダイレクトURL]]では [[TLS]] が原則とされていますが、[[平文]]も限定的に認められており、
その場合は >>12 を満たせません。

* アクセストークンの要求

[8] [[OAuth 1.0]] では、[[クライアント]]は[[鯖]]に[[トークン要求]]を送信することで、
[[トークンcredentials]] ([[アクセストークン]]と[[アクセストークン秘密]])
を取得できます。

[9] [[OAuth 2.0]] では、[[クライアント]]は[[鯖]]の[[トークンエンドポイント]]に要求を送信することで、
[[アクセストークン]]を取得できます。
([[暗示的承諾]]では、[[認可エンドポイント]]から取得できます。)

[45] [[Twitter]] は通常の [[OAuth]] フローとは別に、設定ページから
[[access token]], [[access token secret]] の組を発行する方法を用意しています [SRC[>>46, >>47]]。

[49] [[Slack]] は [[API]] の説明ページで[[アクセストークン]]を提供しています
[SRC[>>48]]。

[54] [[GitHub]] や [[Qiita]] [SRC[>>53]] などでは設定ページから[[アクセストークン]]を発行できます。

[68] 認可フローを実装せずに設定ページからしか取得できないらしきものもあります [SRC[>>67]]。

[58] [[Flickr]] は古い独自認証 API を使って [[OAuth 1.0]] [[access token]]/[[access token secret]]
を取得する [[API]] [SRC[>>56]] を用意しています。

[64] [[Dropbox]] は [[OAuth 1.0]] を使って [[OAuth 2.0]] [[アクセストークン]]を取得する
[[API]] [SRC[>>63]] を用意しています。

[51] [[GitHub]] などは[[アクセストークン]]を発行する [[API]] も提供しています [SRC[>>50, >>52, >>61, >>62]]。 [[GitHub]] の場合は[[基本認証]]を使ったりします。
[[Bitly]] の場合は[[トークンエンドポイント]]を共有しており、
「OAuth Basic Authentication Flow」などとも称しているものの
[[OAuth]] とは異なる方法で[[基本認証]]を使った[[アクセストークン]]取得
[[API]] を提供しています [SRC[>>55]]。
[[Heroku]] は独自の[[APIトークン]]を[[基本認証]]の[[合言葉]]として使って
([[利用者名]]は[[空文字列]]。) [[アクセストークン]]を取得する [[API]]
を提供しており、 [[OAuth]] で発行されたものと違って無期限になります [SRC[>>61]]。

[REFS[
- [56] [CITE@en-us[Flickr Services: Flickr API: flickr.auth.oauth.getAccessToken]] ([TIME[2015-03-06 01:26:26 +09:00]] 版) <https://www.flickr.com/services/api/flickr.auth.oauth.getAccessToken.html>
- [46] [CITE[Single-user OAuth with Examples | Twitter Developers]] ([TIME[2015-03-05 11:19:22 +09:00]] 版) <https://dev.twitter.com/oauth/overview/single-user>
- [47] [CITE[Tokens from dev.twitter.com | Twitter Developers]] ([TIME[2015-03-05 11:24:17 +09:00]] 版) <https://dev.twitter.com/oauth/overview/application-owner-access-tokens>
- [48] [CITE@en[Slack Web API | Slack]] ([[Slack]] 著, [TIME[2015-03-05 16:12:13 +09:00]] 版) <https://api.slack.com/web>
- [50] [CITE@en[Authorizations | GitHub API]] ([TIME[2015-03-05 18:02:01 +09:00]] 版) <https://developer.github.com/v3/oauth_authorizations/>
- [52] [CITE[Qiita API v2ドキュメント - Qiita:Developer]] ([TIME[2015-03-05 19:06:56 +09:00]] 版) <https://qiita.com/api/v2/docs#アクセストークン-1>
- [53] [CITE[Qiita API v2ドキュメント - Qiita:Developer]] ([TIME[2015-03-05 19:04:27 +09:00]] 版) <https://qiita.com/api/v2/docs#%E8%AA%8D%E8%A8%BC%E8%AA%8D%E5%8F%AF>
- [55] [CITE[Bitly API Documentation]] ([TIME[2014-11-01 00:33:47 +09:00]] 版) <http://dev.bitly.com/authentication.html>
- [61] [CITE@en[OAuth | Heroku Dev Center]] ([TIME[2015-03-06 08:05:59 +09:00]] 版) <https://devcenter.heroku.com/articles/oauth#direct-authorization>
- [62] [CITE@en[Platform API Reference | Heroku Dev Center]] ([TIME[2015-03-06 08:20:36 +09:00]] 版) <https://devcenter.heroku.com/articles/platform-api-reference#oauth-authorization-create>
- [63] [CITE@en[Dropbox - Core API - endpoint reference]] ([TIME[2015-03-06 09:07:10 +09:00]] 版) <https://www.dropbox.com/developers/core/docs>
- [67] [CITE@en[StatusPage.io - Documentation - API Authentication]] ([[]] 著, [TIME[2014-08-28 18:57:27 +09:00]] 版) <http://doers.statuspage.io/api/authentication/>
]REFS]

* アクセストークンの利用

[10] [[アクセストークン]]を利用した[[被保護資源]]へのアクセス方法については、
[[資源鯖]]を参照。

* OAuth 1.0 トークンcredentialsの破棄

[5] [[鯖]]は、 [[token credentials]] が[[クライアント]]に後に、
[[資源所有者]]が[[token credentials]] を取り消し ([[revoke]]) できるようにする[['''べきです''']]
[SRC[>>3]]。

* [CODE(URI)@en[response_type=token]]

[32] [[OAuth 2.0]] [[認可エンドポイント]]の [CODE(URI)@en[[[response_type]]]] [[引数]]の値
[DFN[[CODE(URI)@en[[[token]]]]]] は、[[アクセストークン]]を要求している
([[暗示的承諾型]]である) ことを意味します [SRC[>>33, >>57]]。

* [CODE(URI)@en[access_token]] 引数

[59] [[OAuth 2.0]] [[認可エンドポイント]]からの[[リダイレクトURL]]に追加される[[素片識別子]]の[[引数]]
[DFN[[CODE(URI)@en[[[access_token]]]]]] は、[[アクセストークン]]を表します。
この[[引数]]は[[必須]]です [SRC[>>58]]。

[81] [[OAuth 2.0]] [[トークンエンドポイント]]からの [[JSON]] [[応答]]の[[引数]]
[DFN[[CODE(URI)@en[[[access_token]]]]]] は、[[アクセストークン]]を表します。
この[[引数]]は[[必須]]です [SRC[>>71]]。

[19] この[[引数]]の値は、1文字以上の[[印字可能ASCII文字]]の列です [SRC[>>18]]。

[35] [[資源鯖]]の [CODE(URI)@en[[[access_token]]]] [[引数]] [SRC[>>34]] は、
[[認証]]に使う[[アクセストークン]]を表します。

* [CODE(URI)@en[[[token_type_hint]]=[[access_token]]]]

[37] [CODE(URI)@en[token_type_hint]] [[引数]]の値
[DFN[[CODE(URI)@en[access_token]]]] は、[[アクセストークン]]を表します [SRC[>>36]]。

* セキュリティー

[39] [[クライアント]]は、[[アクセストークン]]を保存した[[ストレージ]]等に攻撃者がアクセスできないか注意する必要があります [SRC[>>38]]。
同じ環境で動作する他の[[プログラム]]から[[ストレージ]]にアクセスできるかもしれません。
動作している端末全体が盗まれることもあるかもしれません [SRC[>>38, >>43]]。

[40] そのような場合の対策という意味でも、[[認可鯖]]は[[資源所有者]]に対して発行済の[[アクセストークン]]を [[revoke]] させられる仕組みを提供するべきでしょう。

[REFS[
- [38] [CITE@en[RFC 6819 - OAuth 2.0 Threat Model and Security Considerations]] ([TIME[2015-02-10 06:43:00 +09:00]] 版) <http://tools.ietf.org/html/rfc6819#section-4.1.3>
- [43] [CITE@en[RFC 6819 - OAuth 2.0 Threat Model and Security Considerations]] ([TIME[2015-02-10 06:43:00 +09:00]] 版) <http://tools.ietf.org/html/rfc6819#section-4.4.2.2>
]REFS]