Specification GotAPI - TakayukiHoshi1984/DeviceConnect-Docs GitHub Wiki
標準化団体 OMA (Open Mobile Alliance) にて Generic Open Terminal API Frameworkとして標準化された各サービス(デバイス)を操作するためのAPI仕様になります。
詳しくは、GotAPIの資料を参照してください。
GotAPI Interface は、標準化したAPIを定義し、各サービスの発見、操作などを行う機能を提供します。
Device Connectシステムでは、GotAPI Interface が定義している以下のAPIを実装しています。
- Availability API
- Authorization API
- ServiceDiscovery API
- ServiceInformation API
GotAPI Serverが使用可能状態にあるかの確認を行う機能を提供します。
GET /gotapi/availability HTTP/1.1
Host: localhost:4035
Origin: http://app.example.com
{
"result":0
}
GotAPI Auth Serverにユーザ認可を求める機能を提供します。
ユーザに認可された場合にアクセストークンを取得することができます。
Availability、Authorization 以外のAPIにアクセスする場合には、このAPIで取得したアクセストークンを一緒に送らないとアクセスすることができません。
クライアントIDを生成する機能を提供します。
GET /gotapi/authorization/grant HTTP/1.1
Host: localhost:4035
Origin: http://app.example.com
{
"result":0,
"clientId": "0123456789",
"errorCode": 0,
"errorMessage": "" ,
"hmac": "0123.....xyz"
}
Grantで生成したクライアントIDを元に、アクセストークンを生成する機能を提供します。
このAPIが呼び出された時点でユーザに認可を求めます。
ユーザ認可された場合には、アクセストークンを生成し返却します。
また、ユーザ認可されなかった場合にはアクセストークンを生成せずに、エラーを返却します。
GET /gotapi/authorization/accesstoken?clientId=0123456789&scope=notification,vibration&applicationName=Smart%20Watch&20Controller HTTP/1.1
Host: localhost:4035
Origin: http://app.example.com
{
"result": 0,
"accessToken": "9876543210",
"errorCode": 0,
"errorMessage": "" ,
"hmac": "0123.....xyz"
}
このAPIが呼び出された時点で、Device Connect Managerは、ユーザに使用の認可を求めるダイアログを表示します。
また、一定時間ユーザから認可を得られなかった場合もエラーを返却します。
GotAPI Serverに接続されているサービス(デバイス)一覧を取得する機能を提供します。
例) ServiceDiscoveryでサービスを検索します。
GET /gotapi/servicediscovery?accessToken=xxxxx HTTP/1.1
Host: localhost:4035
Origin: www.example.com
{
"product":"Device Connect Manager",
"version":"x.x",
"result":0,
"services":[
{
"id":"device1.localhost.deviceconnect.org",
"name":"Service1",
"type":"Bluetooth",
"online":true,
"config":""
},
{
"id":"device2.localhost.deviceconnect.org",
"name":"Service2",
"type":"WiFi",
"online":false,
"config":""
}
]
}
GotAPI Serverからサービス(デバイス)の詳細な情報を取得する機能を提供します。
例) ServiceDiscoveryで発見したサービスのidを指定して詳細な情報を取得します。
GET /gotapi/serviceinformation?accessToken=xxxxx&serviceId=device1.localhost.deviceconnect.org HTTP/1.1
Host: localhost:4035
Origin: www.example.com
{
"product":"Device Connect Manager",
"version":"x.x",
"result":0,
"connect":{
"wifi":true
},
"supports":[
"system",
"battery",
"vibration"
],
"supportApis": [
"battery" : {
// ...省略...
},
"vibration" : {
// ...省略...
}
]
}
Device Connect Managerでは、拡張機能として、supportApisにSwagger2.0で定義されたAPIの情報を格納します。
GotAPIでは、以下のようなセキュリティを定義しています。
OMA GotAPI v1.1 の規定に従い、アプリケーションは、リクエストにOriginヘッダを付加する必要があります。
GotAPIのセキュリティ機能であるアプリケーション認可機能や許可リスト機能は、Originヘッダの情報を元に処理されます。
また、HTMLアプリケーションとNativeアプリケーションでは、付加するヘッダが異なります。
- HTMLアプリケーションの場合
RFC6454上で定義されるOriginをOriginヘッダに指定します。
GET /gotapi/availability HTTP/1.1
Host: 127.0.0.1:4035
Origin: http://xxx.example.com/
ブラウザ上で動作させると思いますので、自動的に付加されるので、開発者はあまり気にする必要はありません。
- Nativeアプリケーションの場合
X-GotAPI-OriginヘッダにNativeアプリケーションの識別子(Androidの場合はパッケージ名等)を指定します。
GET /gotapi/availability HTTP/1.1
Host: 127.0.0.1:4035
X-GotAPI-Origin: com.example.android.app
なお、Device Connect Managerでは、両方のヘッダが指定された場合は、Originヘッダを優先して使用します。
本機能はDevice Connect Managerの設定画面で有効/無効を切り替えることができます。
本機能を無効にした場合は、Originが不要になるためにアプリケーション認可機能や許可リスト機能も同時に無効になります。
ユーザが認可していないアプリケーションからのアクセスをブロックする機能です。
アプリケーションは、初めてGotAPI Serverにアクセスする際、ユーザからの認可とともに、アクセストークンを取得する必要があります。
アクセストークンは、Authorization APIで取得します。
アクセストークン無しでデバイスにアクセスしようとした場合、GotAPI Serverはアプリケーションに対してエラーを返却します。
WebSocketをGotAPI Serverに接続しようとした場合にも、同様にアクセストークンが必要になります。
アクセストークン無しでWebSoketを接続しようとした場合に、GotAPI Serverは{"result":1}
を通知してWebSocketを切断します。
なお、本機能はDevice Connect Managerの設定画面で有効/無効を切り替えることができます。
無効にされた場合には、アクセストークンの有無は無視します。
許可リストに含まれないアプリケーションからのアクセスを禁止する機能です。
また、ユーザに対してアプリケーションの許可リスト管理機能及びUIと本機能の有効/無効を操作するUIを提供します。
これによりユーザ操作によって切り替え可能にします。
本機能が有効になっている場合、アプリケーションから受信したリクエストメッセージのOriginヘッダをチェックし、Originが許可リストに含まれていない場合、エラーを返却します。
アプリケーション側でGotAPI Serverの正当性を検証する機能を提供します。
アプリケーション側で、GotAPI Serverの正当性を検証できるように、アプリケーションからのリクエストへの応答にHMACを付加します。
本機能の使用・不使用はアプリケーション側に委ねられています。
HMACを生成するためのキーをGotAPI Serverに送信するためにURLスキームを使用します。
以下のようにURLスキームのパラメータにキーを含めることで送信します。
- 例) Android(Chrome)
<a href="intent://#Intent;scheme=gotapi;package=com.example.gotapi;S.origin=app.example.jp;S.key=0123456789;;end">Invoke the GotAPI Server</a>
GotAPI Serverでは、受け取ったキーを保持し、アプリケーションからのリクエストに付加されているnonceからHMACを計算してレスポンスに返却します。
アプリケーションでは、キーとnonceからHMACを生成して、GotAPI Serverから返却されたHMACと比較して正当性を確認します。
ただし、アプリケーションがnonceをリクエストに付加していない場合には、HMACの処理は行われません。