要請元 TA が PDS にあるデータのアクセス権限を変更するためのプロトコル。 アクセス制御も参照のこと。
- 要請元 TA から PDS に、変更内容を通知する。
- PDS から要請元 TA に、変更コードを発行する。
- 要請元 TA から PDS に、変更コードと共にユーザーをリダイレクトさせる。
- PDS とユーザー間で、合意を形成する。
- PDS から要請元 TA に、結果と共にユーザーをリダイレクトさせる。
+--------+ +--------+
| | | |
| |------------(1) request----------->| |
| | | |
| |<-----------(2) code---------------| |
| | | |
| TA | +--------+ | PDS |
| |--->| |----(3) code-------->| |
| | | | | |
| | | User |<---(4) agreement--->| |
| | | | | |
| |<---| |<---(5) result-------| |
| | +--------+ | |
+--------+ +--------+
本プロトコルでは、途中、TA 間連携プロトコルとユーザー認証プロトコルを利用する。
要請元 TA から PDS への変更内容の通知は TA 間連携で行われ、PDS とユーザー間で合意を形成する前にユーザー認証が行われる。
要請元 TA は、全ての変更対象に対して、その処理において一意のタグをつけなければならない。
要請元 TA から PDS の変更要請エンドポイントに、TA 間連携プロトコルの付加情報と共にリクエストを送る。
PDS は変更要請エンドポイントを TLS で提供しなければならない。
変更要請リクエストは、以下の最上位要素を含む JSON オブジェクトである。 アカウントタグは TA 間連携プロトコルで付けたものと同じでなければならない。
chmod
- 必須。
変更対象タグから変更対象へのマップ。
変更対象は以下の要素を含むオブジェクト。
owner_tag
- 必須。 対象データを所有するアカウントのアカウントタグ。
ta
- 必須。 対象データの領域を割り当てられた TA の ID。
path
- 必須。 対象データのパス。 ディレクトリを指す場合はサブツリー全体の権限を変更することを意味する。
accessor
- 任意。
アクセス元。
アクセス主体のアカウントタグからアクセス元 TA の ID の配列へのマップ。
無指定の場合、処理の主体と要請元 TA のみが指定されているとみなす。
また、特殊な値として、
*
で全てのアカウント、全ての TA を指定できる。
- 任意。
アクセス元。
アクセス主体のアカウントタグからアクセス元 TA の ID の配列へのマップ。
無指定の場合、処理の主体と要請元 TA のみが指定されているとみなす。
また、特殊な値として、
mod
- 必須。
変更する権限。
[+-=]
<アクセス権限>。+r
等。
- 必須。
変更する権限。
essential
- 任意。 変更が拒否された場合に他の変更を破棄するかどうか。 無指定の場合、偽(他の変更は適用する)。
check_exist
- 任意。 対象のデータが存在しない場合に失敗するかどうか。 無指定の場合、偽(失敗しない)。
- 必須。
変更対象タグから変更対象へのマップ。
変更対象は以下の要素を含むオブジェクト。
redirect_uri
- 必須。 PDS から要請元 TA にユーザーをリダイレクトさせる際の要請元 TA 配下のエンドポイント。
state
- 任意。 PDS から要請元 TA にユーザーをリダイレクトさせる際にそのまま付加されるパラメータ。
display
- OpenID Connect Core 1.0 Section 3.1.2.1 の
display
と同じもの。
- OpenID Connect Core 1.0 Section 3.1.2.1 の
ui_locales
- OpenID Connect Core 1.0 Section 3.1.2.1 の
ui_locales
と同じもの。
- OpenID Connect Core 1.0 Section 3.1.2.1 の
以下は accessor
の例。
{
"self": [
"*"
],
"observer": [
"https://reader.example.org"
],
"*": [
"https://recruit.example.org"
]
}
POST /access-control/ta HTTP/1.1
Host: pds.example.org
Content-Type: application/json
{
"chmod": {
"profile": {
"owner_tag": "self",
"ta": "https://writer.example.org",
"path": "/profile",
"mod": "+r",
"essential": true
},
"diary": {
"owner_tag": "self",
"ta": "https://writer.example.org",
"path": "/diary",
"mod": "+r"
}
},
"redirect_uri": "https://reader.example.org/return/chmod",
"state": "SiuR29g1Iu"
}
TA 間連携プロトコルの付加情報は省いている。
PDS は変更要請リクエストを以下のように検証しなければならない。
--f--> は失敗時のエラーレスポンスの error
の値を示す。
- TA 間連携プロトコルの処理要請リクエストに則っていることを検証する。
- --f-->
invalid_request
- --f-->
redirect_uri
が要請元 TA の配下であることを確認する。- --f-->
invalid_request
- --f-->
owner_tag
およびaccesser
に現れるアカウントタグが TA 間連携プロトコルで定義されていることを確認する。- --f-->
invalid_request
- --f-->
accesser
に現れる TA が存在することを確認する。- --f-->
invalid_request
- --f-->
check_exist
が真の場合、対象データが存在することを確認する。- --f-->
not_exist
- --f-->
また、全ての変更対象が非明示的に適用または転送で合意できる場合、error
を already_done
にしてエラーレスポンスを返しても良い。
その場合は、以下の最上位要素も返さなければならない。
applied
- 非明示的に適用で合意した変更対象があった場合は必須。 そうでなければ任意。 適用された変更対象全ての変更対象タグからなる配列。
forwarded
- 非明示的に転送で合意した変更対象があった場合は必須。 そうでなければ任意。 転送された変更対象全ての変更対象タグからなる配列。
リクエストに問題が無ければ、PDS から要請元 TA にレスポンスを返す。
変更要請レスポンスは、以下の最上位要素を含む JSON オブジェクトである。
code
- 必須。 変更コード。
HTTP/1.1 200 OK
Content-Type: application/json
{
"code": "SS2EVIbmR7X1IHiHzMInTINxGYi-OY"
}
要請元 TA から PDS の合意エンドポイントへ、パラメータを付加してユーザーをリダイレクトさせる。
PDS は合意エンドポイントを TLS で提供しなければならない。
リダイレクトに際し、以下のパラメータを付加する。
code
- 必須。 変更コード。
HTTP/1.1 302 Found
Location: https://pds.example.org/access-control/user?
code=SS2EVIbmR7X1IHiHzMInTINxGYi-OY
ヘッダ値の改行とインデントは表示の都合による。
PDS は以下のようにリダイレクトパラメータを検証しなければならない。
--f--> は失敗時のエラーレスポンスの error
の値を示す。
code
を含むことを確認する。- 失敗した場合、ユーザーにエラーを表示する。
code
の指す変更コードが有効であることを確認する。- --f-->
invalid_grant
- --f-->
変更対象に対する合意をユーザーから取得する。
本仕様では、データアクセス権限を変更する権限の保持者について規定しない。
データの所有者が変更権限の保持者になるのが自然だが、それ以外のユーザーにも管理者として変更権限を与えるかもしれない。 現実の親子関係を持つ保護者ユーザーが子供ユーザーの変更権限を全面的に引き受ける形態も考えられる。
変更処理の主体が変更権限を持たない場合に備え、PDS は権限変更要求を保存し、後で変更権限の保持者から合意を得る仕組みを持たなければならない。 ただし、本仕様では、その詳細は規定しない。
全ての変更対象に対して、ユーザーから以下のいずれかの合意を得なければならない。
- 適用
- 要求された変更を行う。 元から変更された状態だった場合、非明示的に適用で合意したとみなしても良い。 そうでなく、かつ、変更処理の主体に変更権限が無い場合、適用で合意してはならない。
- 転送
- 変更処理の主体と要請元 TA からの要求として変更対象を保存する。 既に同じ内容が保存されている場合、非明示的に転送で合意したとみなしても良い。 変更処理の主体に変更権限がある場合、転送で合意してはならない。
- 拒否
- 適用も転送もしない。
PDS はユーザーに対して、非明示的には合意できない変更対象全てと可能な合意の種類を明示しなければならない。 本仕様では、これ以上の具体的な合意の方法は規定しない。
適用で合意した場合、速やかに権限を変更しなければならない。
変更対象の範囲が重複する場合、範囲が広いものから順に変更した状態にしなければならない。
例えば、/profile サブツリーの変更を行った後に /profile/career の変更を行う。
また、変更要請リクエストで指定されなかったアクセス元のアクセス権限に変更を加えてはならない。
*
は *
であり、他のアクセス元のアクセス権限を変えてはならない。
転送で合意した場合、実際に権限変更要求を保存するかどうかは PDS の裁量とする。 適切なスパム防止策を施すことを推奨する。
拒否で合意した場合、適用や転送を行ってはならない。
ユーザーから必要な同意が得られたら、PDS から要請元 TA へ、パラメータを付加してユーザーを変更要請リクエストの redirect_uri
へリダイレクトさせる。
リダイレクトに際し、以下のパラメータを付加する。
applied
- 適用で合意した変更対象があった場合は必須。 そうでなければ任意。 適用された変更対象全ての変更対象タグからなる JSON 配列。
forwarded
- 転送で合意した変更対象があった場合は必須。 そうでなければ任意。 転送された変更対象全ての変更対象タグからなる JSON 配列。
denied
- 拒否で合意した変更対象があった場合は必須。 そうでなければ任意。 拒否された変更対象全ての変更対象タグからなる JSON 配列。
state
- 変更要請リクエストに
state
が含まれていた場合は必須。 そうでなければ無し。 変更要請リクエストのstate
の値そのまま。
- 変更要請リクエストに
HTTP/1.1 302 Found
Location: https://reader.example.org/return/chmod?applied=%5B%22profile%22%5D
&denied=%5B%22diary%22%5D&state=SiuR29g1Iu
ヘッダ値の改行とインデントは表示の都合による。
変更要請リクエストに対するエラーは OAuth 2.0 Section 5.2 の形式で返す。 合意中のエラーは OAuth 2.0 Section 4.1.2.1 の形式で、主に要請元 TA にリダイレクトして返す。
error
の値として以下を追加する。
already_done
- 既に変更が適用または転送されている。
not_exist
- 対象のデータが存在しない。