* 仕様書

[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-4.8>
- [3] '''[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.3>'''
- [15] [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.1.1>
- [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-4.2.1>
- [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-4.2.2>
- [19] [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.3.2>
- [20] [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.4.2>
- [21] [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>
- [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-6>
- [25] [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>
- [29] [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.7>
- [32] [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>
- [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#appendix-A.4>
- [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-3>
- [37] [CITE@en[Final: OpenID Connect Core 1.0 incorporating errata set 1]] ([TIME[2014-11-09 04:00:29 +09:00]] 版) <http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims>
- [42] [CITE@en[Final: OpenID Connect Core 1.0 incorporating errata set 1]] ([TIME[2014-11-09 04:00:29 +09:00]] 版) <http://openid.net/specs/openid-connect-core-1_0.html#OfflineAccess>
]REFS]

* OAuth 1.0 における scope

[2] [[OAuth 1.0]] は [[scope]] のような仕組みが必要なことがよくあるとしつつも、
その方式の標準化には踏み込んでいません [SRC[>>1]]。

[4] 各[[鯖]]は、それぞれの方法で [[scope]] の指定を認めていました。
[[scope]] の概念を持たない[[鯖]]もありました。

* OAuth 2.0 における scope

[14] [DFN[[[scope]]]] ([[適用範囲]]) は、[[アクセストークン]]によって[[資源所有者]]がアクセスすることを[[クライアント]]から認められている[[資源]]や操作の範囲を表すものです。
短い [[ASCII]] 文字列によって表されます。

[36] [CODE(HTTP)@en[[[scope]]]] の値は[[プログラム]]的に利用されることを想定しており、
[[末端利用者]]に表示することは想定していません [SRC[>>34]]。

** 構文

[7] [CODE(URI)@en[[[scope]]]] [[引数]]の値は、
[CODE[[[U+0020]]]] で区切った[[認可鯖]]定義の[[文字列]]のリストです [SRC[>>3, >>33, >>34]]。
[[文字列]]の順序は意味を持ちません [SRC[>>3, >>34]]。

[FIG(railroad)[
= 文字列
= *
== [CODE(char)[[[U+0020]]]]
== 文字列
]FIG]

[9] 各[[文字列]]は、[[印字可能ASCII文字]]のうち、 [CODE[[[U+0020]]]]、
[CODE[[[U+0022]]]]、[CODE[[[U+005C]]]] を除いたもので構成される1[[文字]]以上の列です
[SRC[>>3, >>33, >>34]]。

[REFS[
- [10] <http://chars.suikawiki.org/set/%24rfc6749:scope-token-char>
]REFS]

[53] [[URL]] が用いられることがよくありますが、そうしなければならないわけではありません。

-*-*-

[8] 複数の[[文字列]]の指定は、それぞれの適用範囲を足していくことを表します [SRC[>>3]]。

** 文脈

*** クライアントによる指定

[5] [[OAuth 2.0]] [[クライアント]]は、[[認可エンドポイント]]
([[認証符号]]、[[暗示的承諾型]]) と[[トークンエンドポイント]]
([[資源所有者合言葉credentials]]、[[クライアントcredentials]]) で[[要求]]の
[CODE(URI)@en[[[scope]]]] [[引数]]によってアクセス要求の[RUBYB[適用範囲]@en[scope]]を指定することができます [SRC[>>3, >>15, >>16, >>19, >>20]]。

[24] [[クライアント]]は、[[トークンエンドポイント]]で[[更新トークン]]から[[アクセストークン]]を得る[[要求]]で
[CODE(URI)@en[[[scope]]]] [[引数]]によって取得したい[[アクセストークン]]の[[適用範囲]]を指定することができます。
ただし、元々[[資源所有者]]に[[承諾]]された[[適用範囲]]以外を指定してはなりません。
またこの[[引数]]省略すると、元々[[資源所有者]]に[[承諾]]された[[適用範囲]]を表します。
[SRC[>>23]]

[26] [[クライアント]]は、必要な最小の[[適用範囲]]を求める[['''べきです''']] [SRC[>>25]]。

*** 認可鯖による指定

[6] [[認可鯖]]は、発行した[[アクセストークン]]の適用範囲を[[クライアント]]に知らせるために[[応答]]で
[CODE(URI)@en[[[scope]]]] [[引数]]を指定します [SRC[>>3]]。

[18] [[認可鯖]]は、[[アクセストークン]]を求められた[[認可エンドポイント]]から[[リダイレクト]]される[[リダイレクトURL]]の[[素片識別子]]の
[CODE(URI)@en[[[scope]]]] [[引数]]によって[[アクセストークン]]の[[適用範囲]]を指定できます。
[[クライアント]]の要求と異なる[[適用範囲]]である場合には、
[CODE(URI)@en[[[scope]]]] [[引数]]を指定しなければ[['''なりません''']]。 [SRC[>>17]]

[22] [[認可鯖]]は、[[トークンエンドポイント]]からの[[アクセストークン]]を含む
[[JSON]] [[応答]]の
[CODE@en[[[scope]]]] [[引数]]によって[[アクセストークン]]の[[適用範囲]]を指定できます。
[[クライアント]]の要求と異なる[[適用範囲]]である場合には、
[CODE@en[[[scope]]]] [[引数]]を指定しなければ[['''なりません''']]。 [SRC[>>21]]

;; [27] [[クライアント]]の要求通りの[[適用範囲]]とする時は、
明示しても省略しても構いません。

*** 資源鯖による指定

[35] [[資源鯖]]は、 [CODE(HTTP)@en[[[WWW-Authenticate:]] [[Bearer]]]] [[ヘッダー]]に
[CODE(HTTP)@en[[[scope]]]] [[引数]]を指定できます [SRC[>>34]]。

** 処理

[11] [[認可鯖]]は、[[認可鯖]]の方針や[[資源所有者]]の指示、
[[クライアント]]の [[identity]] に基づき、
[[クライアント]]に指定された適用範囲の一部または全部を無視して構いません [SRC[>>3, >>25]]。
[[クライアント]]が要求した適用範囲と異なる[[アクセストークン]]を発行する時は、
[[応答]]に [CODE(URI)@en[[[scope]]]] [[引数]]を指定して[[アクセストークン]]の適用範囲を明示しなければ[['''なりません''']] [SRC[>>3]]。

[30] [[資源所有者合言葉credentials]]は特に危険であるとの認識から、
利用可能な[[適用範囲]]をより限定的にすることを検討するべきです [SRC[>>29]]。

[12] [[クライアント]]が[[認可エンドポイント]]への要求で [CODE(URI)@en[[[scope]]]]
[[引数]]を指定しなかった時は、予め定義された既定値として処理するか、
妥当でない適用範囲として失敗にしなければ[['''なりません''']] [SRC[>>3]]。

[13] [[認可鯖]]は適用範囲の要件と既定値を明文化する[['''べきです''']] [SRC[>>3]]。

[28] [[クライアント]]は、[[アクセストークン]]を得た時に [CODE(URI)@en[[[scope]]]]
[[引数]]を確認して、希望した[[適用範囲]]がすべて認められたかどうかを調べる必要があります。
一部しか認められなかったとしても、その理由までは示されないので、
[[クライアントの登録]]の設定を変更するなど[[認可鯖]]依存の方法で[[クライアント]]の開発者が手動で操作しなければならない可能性もあります。

** メモ

[31] [CODE(URI)@en[[[state]]]] [[引数]]の値には、[[クライアント]]や[[資源所有者]]の繊細な情報を[[平文]]で含める[['''べきではありません''']] [SRC[>>32]]。

* OpenID Connect の scope

[38] [[OpenID Connect]] [SRC[>>37]] は [[OAuth 2.0]] の [CODE(HTTP)@en[[[scope]]]]
の値を規定しています。

[39] [CODE(URI)@en[[[openid]]]] が指定されていると、 [[OpenID Connect]]
の実装は [[OpenID Connect]] により当該 [[OAuth]] 要求を処理することになります。

[40] [CODE(URI)@en[[[profile]]]]、[CODE(URI)@en[[[email]]]]、
[CODE(URI)@en[[[address]]]]、[CODE(URI)@en[[[phone]]]] の意味が規定されています [SRC[>>37]]。

[43] [CODE(URI)@en[[[offline_access]]]] の意味が規定されています [SRC[>>42]]。

[41] [[OpenID Connect]] を実装しない場合、これらの値を [[OpenID Connect]]
が規定する意味に従って解釈する義務はありません。しかし [CODE(URI)@en[[[openid]]]]
という値を [[OpenID]] 以外で使用する意味は無いでしょう。またそれ以外の値は将来
[[OpenID Connect]] に対応する可能性があるなら、 [[OpenID Connect]]
と矛盾する意味で使うべきでは無いでしょう。

* メモ

[44] [CITE@ja[Using OAuth 2.0 for Web Server Applications - Google Accounts Authentication and Authorization — Google Developers]]
([TIME[2014-12-05 11:52:25 +09:00]] 版)
<https://developers.google.com/accounts/docs/OAuth2WebServer#incrementalAuth>

[45] [CITE@ja[Cross-client Identity - Google Accounts Authentication and Authorization — Google Developers]]
([TIME[2014-10-24 09:43:45 +09:00]] 版)
<https://developers.google.com/accounts/docs/CrossClientAuth>

[FIG(quote)[
[FIGCAPTION[
[46] [CITE@ja[OAuth 1.0 API Reference - Google Accounts Authentication and Authorization — Google Developers]]
([TIME[2014-12-05 11:52:26 +09:00]] 版)
<https://developers.google.com/accounts/docs/OAuth_ref#Parameters>
]FIGCAPTION]

> (required) URL identifying the service(s) to be accessed. The resulting token enables access to the specified service(s) only. Scopes are defined by each Google service; see the service's documentation for the correct value. To specify more than one scope, list each one separated with a space. This parameter is not defined in the OAuth standards; it is a Google-specific parameter.

]FIG]

[47] [[Google]] は [[OAuth 1.0]] 時代から [CODE(URI)@en[[[scope]]]]
を使っていました [SRC[>>46]]。

[50] [[はてな]]は [[OAuth 1.0]] で [CODE(URI)@en[[[scope]]]] [[引数]]を使っていますが、
[CODE[[[,]]]] 区切りで複数指定できるとしています [SRC[>>48, >>49]]。

[52] [[GitHub]] は [[OAuth 2.0]] [CODE(URI)@en[[[scope]]]] で [CODE[[[,]]]]
区切りとしています。

;; [CODE[[[,]]]] が禁止されているわけではないので、仕様違反ではありません。

[REFS[
- [48] [CITE[Consumer key を取得して OAuth 開発をはじめよう - Hatena Developer Center]] ([TIME[2015-03-05 15:23:31 +09:00]] 版) <http://developer.hatena.ne.jp/ja/documents/auth/apis/oauth/consumer#token>
- [49] [CITE[はてな OAuth scope (許可操作) 一覧 - Hatena Developer Center]] ([TIME[2015-03-05 15:22:47 +09:00]] 版) <http://developer.hatena.ne.jp/ja/documents/auth/apis/oauth/scopes>
- [51] [CITE@en[OAuth | GitHub API]] ([TIME[2015-03-05 18:02:01 +09:00]] 版) <https://developer.github.com/v3/oauth/>
]REFS]