/
372.txt
99 lines (76 loc) · 6.72 KB
/
372.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
[4] [DFN[[RUBYB[[[資源所有者]]]@en[resource owner]]]]は、[[OAuth 1.0]]
によってアクセスされる対象となる[[資源]]の所有者である[[利用者]]です。
[[Webアプリケーション]]の [[Web API]] においては、アクセスされる対象の権限を有する
(人間) [[利用者]]を意味しています。
* 仕様書
[REFS[
- [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.2>'''
- [21] [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.15>
]REFS]
* 意味
[FIG(quote)[
[FIGCAPTION[
[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>
]FIGCAPTION]
>
: resource owner:
An entity capable of accessing and controlling protected
resources by using credentials to authenticate with the server.
]FIG]
* 用語
[2] [[資源所有者]]のことを[DFN[[RUBYB[利用者]@en[user]]]]ともいいました [SRC[>>1]]。
* 資源所有者認可
[5] [[クライアント]]は[[鯖]]に[[トークンcredentials]]を要求するに先立ち、
[[鯖]]に対してアクセス要求を[RUBYB[[[認可]]]@en[authorize]]するよう[[利用者]]に求めなければ[['''なりません''']] [SRC[>>3]]。
この手順を[DFN[[RUBYB[[[資源所有者認可]]]@en[resource owner authorization]]]]といいます。
[6] [[クライアント]]は、何らかの方法で[[鯖]]が[[広告]]した[[資源所有者認可]]の[[エンドポイント]]の
[[URL]] を次の通り編集しつつ[[要求URL]] としなければ[['''なりません''']]。
[[クライアント]]はその[[要求URL]]を[[HTTPリダイレクト]]その他の方法で[[資源所有者]]の[[利用者エージェント]]にアクセスさせます。
この時使う[[要求メソッド]]は [CODE(HTTP)@en[[[GET]]]] でなければ[['''なりません''']]。 [SRC[>>3]]
[7] [[鯖]]はその [[URL]] の [[query]] に [CODE(URI)@en[[[oauth_token]]]] [[引数]]を追加します。
[CODE(URI)@en[[[oauth_token]]]] [[引数]]は、[[一時credentials要求]]で[[鯖]]から[[クライアント]]に提供された[[一時credentials]]の[[識別子]]
([CODE(HTTP)@en[[[oauth_token]]]] [[引数]]の値) とします。
ただし、[[鯖]]は[[資源所有者]]に他の方法で[[一時credentials]]の識別子を示させる方法を用意しているなら、
この[[引数]]を省略可能にできます。 [SRC[>>3]]
[8] [[鯖]]は、その他の[[引数]]も規定しても構いません [SRC[>>3]]。
[9] [[資源所有者認可]]で[[保安輸送路]]を使うか否かは[[鯖]]に任されていて、
[[OAuth]] としては規定されていません [SRC[>>3]]。
[10] [[鯖]]はまず[[要求所有者]]の [[identity]] を[RUBYB[検証]@en[verify]]しなければ[['''なりません''']]。
その後認可要求をどう処理するかは[[鯖]]に委ねられています。 [SRC[>>3]]
[11] 要求されたアクセスを[[認可]]するかどうか[[鯖]]が[[資源所有者]]に尋ねるときには、
[[一時credentials]]と[[クライアント]]の [[identity]]
との関連付けに基づき、アクセスを要求している[[クライアント]]についての情報を表示する[['''べきです''']]。
表示に際しては、その情報が[RUBYB[検証]@en[verify]]されたものかどうか示す[['''べきです''']]。
[SRC[>>3]]
;; [16] 一般的には、[[鯖]]はまず[[資源所有者]]がその[[Webアプリケーション]]における[[アカウント]]で[[ログイン]]状態にあるか
([[Cookie認証]]等で) 確認し、必要なら[[ログイン]]処理を行います。
次に[[一時credentials]]から調べた [[OAuth]] [[クライアント]]についての登録情報や、
(あれば) その[[Webアプリケーション]]における可能な操作の範囲 (いわゆる [[scope]])
など判断に必要な情報を表示し、[[資源所有者]]に対して[[認可]]するか否かの選択を求めます。
([[ログイン]]していない場合、[[ログイン]]と[[認可]]を同時に確認する実装もあります。)
;; [18] 既に一部の [[scope]] について[[認可]]していて、更に追加の [[scope]]
の[[認可]]を求められている場合に差分だけ表示して確認を求める実装もあります。
また新たに要求された [[scope]] をすべて[[認可]]済みの時に、
確認を省略して直ちに [[HTTPリダイレクト]]する実装もあります [SRC[>>21]]。
ただしその場合は[[セキュリティー]]的に問題ないか、[[鯖]]も[[資源所有者]]側の実装者も十分検討する必要があります。
特に[[クライアントcredentials]]が流出している場合には、
[[資源所有者]]が気づかないうちに[[トークンcredentials]]を与えてしまうことになるので危険です
[SRC[>>21]]。無確認で[[リダイレクト]]するのは特定の限定された [[scope]]
のみとするなど、配慮が必要です [SRC[>>21]]。
;; [19] この確認画面は[[クリックジャッキング]]対策が必要かもしれません。
また[[Webブラウザー]]以外で表示したり、[[アドレスバー]]を隠したりするのは[[フィッシング]]の疑いを拭い去れないため、避けるべきと考えられています。
[12] [[鯖]]は、[[資源所有者]]が[[認可]]するか判断したら、
[[資源所有者]]を [CODE(URI)@en[[[oauth_callback]]]] その他の手段で指定された[[コールバック]]
[[URL]]があれば、そこに[[リダイレクト]]します。 [SRC[>>3]]
[13] [[コールバック]] [[URL]] の [[query]] には次の[[引数]]を追加しなければ[['''なりません''']] [SRC[>>3]]。
既に [[query]] があるなら、末尾に追加しなければ[['''なりません''']] [SRC[>>3]]。
[FIG(list)[
- [14] [CODE(URI)@en[[[oauth_token]]]] には、[[クライアント]]から受信した[[一時credentials]]の[[識別子]]を指定します [SRC[>>3]]。
- [15] [CODE(URI)@en[[[oauth_verifier]]]] には、[RUBYB[[[検証符号]]]@en[verification code]]を指定します [SRC[>>3]]。
]FIG]
;; [20] [[コールバック]] [[URL]] は不適切な値が指定されるかもしれません。
[CODE(URI)@en[[[oauth_callback]]]] を参照してください。
[17] [[鯖]]は、[[クライアント]]が[[コールバック]] [[URL]] が提供しなかった場合には、
[[検証符号]]を表示し、[[資源所有者]]に対して手動で[[クライアント]]に入力するよう指示する[['''べきです''']] [SRC[>>3]]。