Second Life Login API Strawman/ja

このページは現在非推奨です。 wikiの透明性と議論の為に維持されています。ログインプロトコルは現在SL Open Gridプロトコルドキュメントの一部であり、それらを参照すべきです。
= Second Life Login API試案 =
進行中の事柄です。AWGによる同様の試案も併せて見ましょう。
プロトコル上でフィードバックを要求することの、AWGと併せての最初の打ち合わせ：Feedback Chat-log, 19 Feb 2008
== はじめに ==
このページは認証フローと現在のログインプロトコルを結合しようとする試みと、追加する付加的なプロトコルをログインする方法に応じて変更する試みです。最終的には追加形成している個々のリージョンドメイン間のログインを許可するプロトコルを公開することです。
== 要約 ==
# *ビューアはログインサービスに証明書を送ります。#ログインWebサービス
# ログインサービスは認証の調整と実在しているかの確認を行ないます。
#* エージェントストアからエージェントのデータを問い合わせます。
#* エージェントホストを検出し、送信するエージェントが既にオンラインで存在するか確認します。
#* 成立するエージェントホストに、基本機能を与えます。
# *ビューアは受け取った基本機能経由のログインに必要な機能を要求します。#基本機能
# *(予定)ビューアはlong-poll経由のメッセージに対するエージェントホストをポールします。メッセージ機能に対するポール
# *(予定)ビューアはインワールドにいない状態でインスタントメッセージを送信できます。インスタントメッセージ機能
# *ビューアはレガシーログイン機能を呼び出します。#レガシーログイン機能
#* 初期化データがログインによって返されます。
#* エージェントの存在を設定します。
#* 転送位置をリージョンドメインに要求し、アバターをrezするリージョンを探索します。
#* セッションとリージョンホストを設置し、クライアントに(リージョンドメイン)基本機能を引き戻します。
# *ビューアがリージョン基本機能を呼び出します。
== 定義付け ==
=== 基本機能 ===
現在のログイン基本機能は、あなたがログインしているシミュレータに付随する機能です。新しいプロトコルのために提案されているエージェントの基本機能と混同されるべきではありません。
=== エージェントの基本機能 ===
これはエージェントドメインの一部のエージェントホストに付随して新しく導入された機能です。
これは以前言及された基本機能とは異なり、リージョンドメインの一部のSimホストと関連します。
== 表記法 ==
このページ上では、以下の表記法が用いられています。:
:"--" のあとに続くテキストは、行末までコメントであることを示す、ala C++ スタイルのコメントです。
:< 内側に記述された、適切なstringに置換されうる値を意味します >
:< 縦バーによって区切られるのは | 選択肢のリストを意味します >
:"..." ピリオドの連続は、類似する値が続く未知のリストを意味します。
:"<int>" integer値を意味します。
:"<uuid>" UUID値を意味し、例えば、'c5853f4c-855f-4013-ce92-aabc59f1b9d8'のようなものです。
:残りの構文には（かなり大雑把な）Pythonのデータ構造体が追従します。
::{ <一つ、あるいはそれ以上のkeyの設計か集合体を意味します>:<値の組> } -- コンマによって区切られます。
::{ コンマで区切られた,要素の配列を,意味します }
::'（シングルクオーテーション） は引用符付きのstringを意味しますが、例えばLSLにて""がstringを意味し、かつ"はシングルクオーテーションの代わりに用いられべきなように、特定の'は推進されるでしょう。
::特定の実装であろうにも関わらず、+は2つの部品を結合することを意味し、例えば+は文字列を結合することに使い道があります。
== ログインWebサービス ==
クライアント --> パブリックログインサーバ: "これは私の信用証明で、求められる任意のエージェントの同一性です"
Second Life Login Server: https://login.agni.secondlife.com/app/login/
ログインは標準のhttp/1.1 POSTと、POSTの全パラメータの省略時書式と、RESPONSEは"content-type" = "application/xml"のように、そして実際のxml形式はLinden LabのXML-LLSD 形式でのテキストシリアライゼーションになるでしょう。将来の形式はhttp/1.1 Content Negotiationを用いて取り決められるでしょう。
=== 必須パラメータ ===
 { 'credential': { 'type': 'agent',
 'first_name': <first>,
 'last_name': <last>,
 'password': '$1$' + <passwd_md5> } }
あるいは (予定)
 { 'credential': { 'type': 'account',
 'account_name': <IBM>,
 'password': '$1$' + <passwd_md5> } }
あるいは (予定)
 { 'credential': { 'type': 'openid',
 'url': <URL> } }
あるいは (予定)
 { 'credential': { 'type': 'agent',
 'first_name': <first>,
 'last_name': <last>}}
いずれかの信頼性のあるシステムによる調査を行う必要があるでしょう。
== 任意パラメータ ==
任意で、どのアカウント内に証明書の記録が必要なのかを指定します。
 { 'credential': { 'type': 'agent',
 'first_name': <first>,
 'last_name': <last>,
 'password': '$1$' + <passwd_md5> },
 'first_name': <first>,
 'last_name': <last> }
=== 応答 ===
応答コード : 応答内容
200 : 認証に成功しました。
 { 'agent seed-capability' : <url> -- エージェントドメイン基本機能] }
4xx : この証明書が一つ以上のアカウントとリンクしていた場合、そして任意パラメータにアカウントが指定されていない場合、応答はアカウントの一式の一覧から選ぶことになるでしょう。
 { 'reason': 'select account', -- 認証に失敗した理由
 'accounts' : [ { 'first_name' : <first>, 'last_name' : <last> },
 { 'first_name' : <first>, 'last_name' : <last> },
 ... ] }
4xx : 情報が不足していたため、認証に失敗しました。
 { 'reason': <'tos'|'critical'|'more info'>, -- 認証に失敗した理由
 'redirect' : <url> } -- 開始するための情報を取得するために訪れるURL
ほかの理由:
 * エージェントがありません
 * 信頼性のない認証と信用情報です
 * エージェントが有効ではありません（禁止されています）
5xx : サーバにアクセスできません。
 { 'reason': 'generic' }
== 基本機能 ==
クライアント -> エージェントホスト (機能補足経由): "私はXを補足したい"
* このサービスはクライアントに要求されたエージェントドメインの機能に名づけられたサポートです。
=== 必須パラメータ ===
任意の機能で名づけられた構成図
 { 'caps': {<capability name> : { 'enabled' : <'true' | 'false'> },
 <capability name> : { 'enabled' : <'true' | 'false'> },
 ... }
 }
 <- 成功しました。Xを補足できます。
 -あるいは-
 <- ブー、Xを取得できません。
=== 応答 ===
機能の構成図をURLに機能付けます:
 { 'caps': {<capability name> : <url>, <capability name> : <url>, ... }}
=== 例:基本ログイン機能 ===
POST データ:
 { 'establish_presence' : { 'enabled' : 'true' },
 'inventory' : { 'enabled' : 'true' },
 'non_existent_cap' : { 'enabled' : 'false' },
 'be_in_world' : { 'enabled' : 'true' } }
応答値:
 { 'establish_presence' : <cap GO>, 'inventory' : <cap I>, 'be_in_world' : <cap CTR> }
== Rezアバター機能 ==
これは将来多くのリージョンドメインで提案されるであろうプロトコルです。
Rezアバターエージェントホストサービス
 {'region_url': <r_url>, 'position': [x, y, z]}
->
 {'session_id': <s_id>, 'secure_session_id': <ssid>, 'circuit_code': <cc>,
 'seed_cap': <s_cap>, 'ip_address': <ip_address>, 'udp_port': <udp_port>, 'look_at': [lx, ly, lz]}
Rezアバターエージェントホストサービスは、クライアントに代わってRezアバターリージョンホストサービスを呼び出します。
Rezアバターリージョンホストサービス
 {'avatar_id': <a_id>, ..., 'position': [x, y, z]}
->
 {'seed_cap': <s_cap>, 'ip_address': <ip_address>, 'udp_port': <upd port>, 'circuit_code': <cc>, 'session_id': <s_id>, 'secure_session_id': <ssid>, 'look_at': [lx, ly, lz]}
or
 403 Forbidden
== レガシーログイン機能 ==
これは現存するSimに接続するためのものです。
* ビューア -> エージェントホスト (補足しているLindenLab経由): "レガシーログインプロトコルを使ってログインしたい"
=== 必須パラメータ ===
 { 'start': <"first" | "last" | <uri> >,
 "channel": <channel>,
 "version": <client version>,
 "platform": <"Lin" | "Mac" | "Win">
 "mac": <MAC Address>,
 "options": <array of strings>,
 "id0": <uuid>,
 "agree_to_tos": <"true" | "false" | "">,
 "read_critical": <"true" | "false" | "">,
 "viewer_digest": <uuid>,
 "options" : [array of strings] }
start リージョンドメインに対する信頼性を確認し、このリージョンにログインしようと試みます。満員か利用できない場合、あるいはエージェントが許可されていない場合は、ほかを選択するリージョンドメインサービスを呼び出します。"First"はホーム位置を意味します。ホームが満員の場合は前回の終了位置を試みます。前回の終了位置が満員の場合はホームが設定され、グリッドはホームを試みます。どちらも不可能な場合は、リージョンドメインはログインできるリージョンを探すでしょう。
channel はクライアント名です。サードパーティ製クライアントから分化した公式ビューアまで使われます。 
options 任意パラメータを参照しましょう。
id0 コンピュータを一意的と確認するために使われる（Windowsでの最初のハードドライブのシリアルナンバーに基づく）ハードウェアハッシュです。
viewer_digest 実行できるビューアのMD5ハッシュで、channelは公式Second Lifeビューアが設定されるときのみ関連します。
=== 任意パラメータ ===
"options"キーは任意のオプションの配列を指します。0またはそれ以上のstringが配列内に任意の順番で現れるでしょう。:
 { 'options' : <"inventory-root" | "inventory-skeleton" | "inventory-lib-root" |
 "inventory-lib-owner" | "inventory-skel-lib" | "gestures" | "event_categories" |
 "event_notifications" | "classified_categories" | "buddy_list" | "ui-config" | 
 "login-flags" | "global-textures">* }
これらのオプションから返る情報の解説についてはOptional Responseを参照しましょう。
=== 所要の応答 ===
ログインコーヅから返される有効な（エラーのない）値は、標準のxmlrpc名の値の形式です。これらで最も重要なものは、以下で検討されている"ログイン基本機能"です。(新しいログイン手順のための新しい"基本機能"と混同しないでください）:
 { "last_name" : lastname ,
 "sim_ip" : 64.129.40.58 ,
 "start_location" : last ,
 "seconds_since_epoch" : 1195447316 ,
 "message" : -=- http://blog.secondlife.com -=- Visit the Official Linden Blog for the latest world status updates! ,
 "first_name" : first_name ,
 "circuit_code" : 245160577 ,
 "sim_port" : 13005 ,
 "secure_session_id" : fdb501ca-22f1-4470-b515-2650f54b8117 ,
 "look_at" : [r-0.85717299999999996274,r0.51502899999999995906,r0] ,
 "agent_id" : d5f403c7-7981-425d-a0b5-c65a3d0a4693 ,
 "inventory_host" : inv12-mysql ,
 "region_y" : 244992 ,
 "region_x" : 247808 ,
 "seed_capability" : https://sim2054.agni.lindenlab.com:12043/cap/d373fdc9-d275-e484-3ad2-4a9b231f4e34 ,
 "agent_access" : M ,
 "session_id" : 65a7213a-723a-4fcf-baca-7b247c4b43c5 ,
 "login" : true }
=== 任意の応答 ===
:注意: 全ての返り値は、特に指定がない限りPython 2.5 dictionariesでの"name:value"形式です。
inventory-root エージェントのルートインベントリフォルダのUUIDです。
 {'inventory-root': {'folder_id': <uuid>} } 
inventory-skeleton
:エージェントのインベントリ内フォルダの頭文字一覧です。5つの辞典の配列が返されます。各辞典の要素はname、version、type、UUIDと、それらが含まれているフォルダのUUIDが記載されます。
 {'inventory-skeleton': [{'parent_id': <uuid>, 'version': <int>, 'name': <name>, 'type_default': <int>, 'folder_id': <uuid>}, .... ]}
inventory-lib-root
:ライブラリルートインベントリフォルダのfolder_idです。
 {'inventory-lib-root': <uuid>}
inventory-lib-owner
:inventory libでのオーナのagent_idです。
 {'inventory-lib-owner': {'agent_id': <uuid>}}
inventory-skel-lib
:エージェントのインベントリ内フォルダの頭文字一覧です。5つの要素の辞典の配列が返されます。各辞典はフォルダ名、フォルダUUID、親フォルダのUUID、フォルダの型、フォルダのバージョンです。
 {'inventory-skeleton': [{'parent_id': <uuid>, 'version': <int>, 'name': <name>, 'type_default': <int>, 'folder_id': <uuid>},... ]}
gestures
:アクティブジェスチャのitem_id, asset_idの組の一覧です。 
 {'gestures': [{'item_id': <uuid>, 'asset_id': <uuid>},...]}
event_categories
:異なるイベントカテゴリの一覧で、カテゴリID(数値)をカテゴリ名に解析します。2つの要素の辞典の配列が返されます。各辞典はカテゴリIDとカテゴリ名が記述されます。
 {'event_categories': [{'category_id': <int>, 'category_name': <name>},...]}
event_notifications
:エージェントがまだ見ていない告知イベントの一覧です。event_id、event_name、event_desc、event_date、grid_x、grid_y、x_region、y_regionの8要素の辞典を含んだ配列です。
 {'events': [event_id, event_name,event_desc, event_date, grid_x, grid_y, x_region, y_region ]
 [event_id, event_name,event_desc, event_date, grid_x, grid_y, x_region, y_region ]
 [event_id, event_name,event_desc, event_date, grid_x, grid_y, x_region, y_region ], ....}
classified_categories
:クラシファイドカテゴリの一覧で、カテゴリID(数値)をカテゴリに解析します。カテゴリID、及びカテゴリ名の、2つの要素の辞典の配列が返されます。
 {'event_categories': [{'category_id': <int>, 'category_name': <name>},...]}
 
buddy-list
:権限を付与寄贈しているフレンドの一覧です。フレンドのエージェントID、寄贈した権限、付与された権限の、3要素の辞書の配列が返されます。
 {'buddy-list':[{'buddy_id': <uuid>', 'buddy_rights_given': <int>, 'buddy_rights_has': <int>}, ....]}
 
ui-config
:UI有効/無効状態の一覧です。現在、allow_first_life('Y' or 'N')はティーン用です。
 {'ui-config': {'allow_first_life': if allow first life} }
login-flags
:エージェントの状態に関する幾つかのフラグです。
 {'login-flags': {'stipend_since_login': <'Y'|'N'>, 'ever_logged_in': <'Y'|'N'>, 'gendered': <'Y'|'N'>, 'daylight_savings': <'Y'|'N'>}}
global-textures
:幾つかのグローバルテクスチャのアセットIDです。
 {'global-textures': {'sun_texture_id': <uuid>, 'moon_texture_id': <uuid>, 'cloud_texture_id': <uuid>}}