/
434.txt
112 lines (79 loc) · 7.55 KB
/
434.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
[26] [DFN[[RUBYB[更新トークン]@en[refresh token]]]]は、
[[アクセストークン]]を取得するために使うことができる[[トークン]] ([[credentials]]) です。
[[認可鯖]]が[[アクセストークン]]の[[寿命]]を短めに設定している場合に、
[[クライアント]]が[[認可鯖]]から新しい[[アクセストークン]]を取得するために使うことができます。
* 仕様書
[REFS[
- [1] [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.5>
- [9] [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>
- [11] [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>
- [14] [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>
- [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-10.4>
- [27] [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>
- [28] [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>
- [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#appendix-A.17>
- [33] [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>
]REFS]
* 意味
[2] [DFN[[RUBYB[更新トークン]@en[refresh token]]]]は、
[[アクセストークン]]を得るために使う [[credentials]] です [SRC[>>1]]。
[[更新トークン]]は、[[資源所有者]]の[[クライアント]]への[[認可承諾]]を表す[[文字列]]です [SRC[>>1]]。
;; [7] 通常はこの[[文字列]]は[[クライアント]]には[[不透明]]です [SRC[>>1]]。
[4] [[クライアント]]は現在の[[アクセストークン]]が[[非妥当]]や[[満期]]になって新しい[[アクセストークン]]を得たい時や、
同じかより狭い[[適用範囲]] ([[scope]]) の[[アクセストークン]]を追加で取得したい時に使います [SRC[>>1]]。
;; [5] [[アクセストークン]]は、[[資源所有者]]が[[認可]]した[[寿命]]や許可よりも短く狭いものかもしれません [SRC[>>1]]。
[3] [[更新トークン]]は、[[認可鯖]]が[[クライアント]]に発行します [SRC[>>1]]。
[[認可鯖]]は[[Webアプリケーション]]や[[ネイティブアプリケーション]]の[[クライアント]]に[[更新トークン]]を発行して構いません [SRC[>>20]]。
[25] [[認可鯖]]は、[[更新トークン]]を推測できないようにしなければ[['''なりません''']] [SRC[>>20, >>28]]。
攻撃者が推測できる確率は 2[SUP[-128]] [[以下]]で[['''なければならず''']]、
2[SUP[-160]] [[以下]]である[['''べきです''']] [SRC[>>28]]。
[16] [[認可鯖]]は、各[[更新トークン]]について次の情報を保持しています。
[FIG(list members short)[
- 発行先の[[クライアント]] [SRC[>>20]]
- 承諾した[[資源所有者]]
- [[資源所有者]]が承諾した[[適用範囲]]
- [[寿命]] ([[満期]]となる[[時刻]])
]FIG]
[21] [[更新トークン]]は転送や蓄積に当たり[[機密]]性を保持しなければ[['''ならず''']]、
[[認可鯖]]と発行先の[[クライアント]]の間でのみ共有しなければ[['''なりません''']] [SRC[>>20]]。
[22] [[更新トークン]]は [[HTTPS]] [[サーバー認証]]のもとでのみ転送しなければ[['''なりません''']]
[SRC[>>20, >>27]]。
[23] [[認可鯖]]は[[クライアント]]の [[identity]] を[[認証]]できるなら、
[[更新トークン]]と[[クライアント]]の対応が正しいか[RUBYB[検証]@en[verify]]しなければ[['''なりません''']]。
[[クライアント認証]]が不可能な時は、その他の方法で乱用を防止する[['''べきです''']]。 [SRC[>>20]]
[EG[
[24] 例えば[[更新トークン]]を使うたびに新しい[[更新トークン]]を発行することにします。
古い[[更新トークン]]は無効化しつつも[[認可鯖]]に保存しておきます。
[[更新トークン]]が漏れて攻撃に使われたとすると、正当な[[クライアント]]と攻撃者の両方が同じ[[更新トークン]]を使おうとすることになるので、
[[認可鯖]]は攻撃に気づくことができます。 [SRC[>>20]]
]EG]
[17] [[更新トークン]]は[[寿命]]に到達する前に取り消し ([[revoke]]) されることがあります。
* 構文
[31] [CODE(URI)@en[[[refresh_token]]]] [[引数]]の構文上の制約により、
1つ以上の[[印字可能ASCII文字]]で構成される必要があります。
[12] [[更新トークン]]の長さは、 [[OAuth]] 仕様としては制限を設けていません。
[[鯖]]は、発行する[[更新トークン]]の長さを明文化する[['''べきです''']]。 [SRC[>>11]]
* 文脈
[6] [[更新トークン]]を発行するかどうかは、[[認可鯖]]が決めることができます [SRC[>>1]]。
発行する場合には、[[トークンエンドポイント]]による[[アクセストークン]]の発行時に[[更新トークン]]を含めます [SRC[>>1, >>11]]。
;; 具体的な発行方法は、[[トークンエンドポイント]]を参照。
;; [8] [[更新トークン]]は[[認可鯖]]でのみ使うもので、[[アクセストークン]]のように[[資源鯖]]に送ることはありません
[SRC[>>1]]。
[10] [[暗示的承諾型]]フローでの[[認可エンドポイント]]でのアクセスでは[[認可鯖]]は[[更新トークン]]を発行しては[['''なりません''']] [SRC[>>9]]。
[18] [[更新トークン]]は、[[トークンエンドポイント]]で[[アクセストークン]]を取得するために使うことができます。
;; [[トークンエンドポイント]]を参照。
* [CODE@en[refresh_token]] 引数
[13] [[トークンエンドポイント]]の[[アクセストークン]]を含む [[JSON]] [[応答]]の
[DFN[[CODE@en[[[refresh_token]]]]]] [[引数]] [SRC[>>11]] には、
[[認可鯖]]が発行した[[更新トークン]]を指定して[[クライアント]]に通知できます。
[19] [[トークンエンドポイント]]で[[更新トークン]]から[[アクセストークン]]を得る要求における
[DFN[[CODE(URI)@en[[[refresh_token]]]]]] [[引数]] [SRC[>>14]] は、
[[クライアント]]が保持している[[更新トークン]]を指定するものです。
[30] 値は、1文字以上の[[印字可能ASCII文字]]の列です [SRC[>>29]]。
* [CODE(URI)@en[grant_type=refresh_token]]
[15] [[トークンエンドポイント]]の [CODE(URI)@en[[[grant_type]]]] [[引数]]の値
[DFN[[CODE(URI)@en[[[refresh_token]]]]]] [SRC[>>14]] は、
[[更新トークン]]から[[アクセストークン]]を取得しようと試みていることを表します。
* [CODE(URI)@en[token_type_hint=access_token]]
[32] [CODE(URI)@en[[[token_type_hint]]]] [[引数]]の値
[DFN[[CODE(URI)@en[[[access_token]]]]]] は、[[アクセストークン]]を表します [SRC[>>33]]。