Claudia Partner™DocsAPI・MCP 共通ドキュメント0.7.0-experimental

接続する

service として接続する

serviceは、人の操作なしに動く処理(バッチや連携など)が、基盤に接続するための方式です。利用者がログインする方式(利用者として接続する)とは、別の方式です。

serviceは、組織の管理者の承認を受けて、動きます。承認された、表、列、操作、期限の範囲だけで動き、それを超えることはできません。

登場するもの

全体の流れ

  1. あなたが、申請の内容(公開鍵を含む)を決めます。組織の管理者が、serviceの利用を申請します。
  2. 組織の管理者が、申請を承認し、使える状態(provision)にします。
  3. あなたのサーバー処理が、秘密鍵で署名した要求を、認証サービスに送り、トークンを受け取ります。
  4. 初めて使うときに、有効化(activate)を行います。
  5. トークンを付けて、許可された操作を呼びます。

前提

この手順は、managed方式のserviceを対象にします。申請、承認、provisionには、MFAを完了した管理者(manage_accessとservice_administratorの両方を持つ利用者)が必要です。申請者と承認者を分ける仕組みは、強制されません。業務の運用で分ける場合は、別に決めてください。利用者のJWTは、serviceのactivate、metadata、query、batch、importには使えません。各経路には、専用のservice JWTを使います。

申請から利用まで

  1. 申請する(組織の管理者。申請の内容は、あなたが決めて、管理者に渡します)。 POST /v2/service-clientsに、Idempotency-Key(UUID)を付けて、app_id、purpose、expires_at、rpm、jwk、scopesを送ります。期限は最大90日、rpm(1分あたりのリクエストの上限)は1〜120です。scopesには、表、schema_version、読む列、書く列、操作、行を明示します。createを許可するときは、custodianも設定します。本文の例は、下の「申請の本文の例」にあります。
  2. 承認する(組織の管理者)。 返ったclient idとversionを使い、POST /v2/service-clients/{clientId}/approveに{"version":現在の版}を送ります。
  3. provisionする(組織の管理者)。 最新のversionで、/provisionを実行します。readyの状態と、接続の情報(issuer、token_endpoint、audience、auth_method)を取得します。
  4. トークンを取得する(あなたのサーバー処理)。 次のJWT(署名付きの要求)を、登録した鍵で署名し、token_endpointへ送ります。JWTの本体は、記録も表示もしません。issとsub、およびフォームのclient_idには、応答のclient_id(文字列)を使います。2〜3の、パスの{clientId}には、応答のid(UUID)を使います。2つは別の値です。
json{"iss":"<CLIENT_ID>","sub":"<CLIENT_ID>","aud":"<TOKEN_ENDPOINT>","iat":<現在のUnix秒>,"exp":<現在のUnix秒+30>,"jti":"<一回限りのUUID>"}
httpPOST <token_endpoint> HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Accept: application/json

grant_type=client_credentials&client_id=<CLIENT_ID>&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&client_assertion=<SIGNED_JWT>
  1. activateする(あなたのサーバー処理)。 provisionが返すaudienceは、取得するアクセストークンの宛先(API)で、JWTのaud(token_endpoint)とは別の値です。JWTのヘッダーのkidは、登録した公開鍵のkidと一致させます(RS256)。 access_tokenで、POST /v2/service/activateに{}を送ります。serviceのaccess_tokenの有効期間は、最大300秒です。更新は、新しいjtiで、client_credentialsを取得し直します。利用者用のリフレッシュトークンは、使いません。
  2. 使う(あなたのサーバー処理)。 許可されたPOST /v2/service/tables/{collection}/queryを実行します。

期待する結果: 許可された操作が、200で成功します。GET /v1/meは、人の利用者の専用なので、拒否されます。利用環境の認証の入口によって、401(TOKEN_INVALID)または403のどちらかになります。実際のHTTPとcodeを記録してください。「人として接続できた」ことを、成功の条件にしないでください。

申請の本文の例

json{
  "app_id": "work-time-reader",
  "purpose": "ケースごとの作業時間の集計。金額は読まない",
  "expires_at": "<現在から90日以内のUTCの日時>",
  "rpm": 60,
  "jwk": {"kty":"RSA","n":"<生成したRSA公開鍵のbase64urlの値>","e":"AQAB","kid":"work-time-reader-key-1","alg":"RS256","use":"sig"},
  "scopes": [{
    "collection": "work_log", "schema_version": 1,
    "read": ["department","duration","case_number"],
    "write": [], "operations": ["query"],
    "rows": {"kind":"match","values":{"department":"production"}}
  }]
}

<…>の箇所は、実際の値に置き換えます。jwkには公開鍵の要素だけを入れます。秘密鍵の要素(d・p・q・dp・dq・qi)を含めると、400で拒否されます。JWKのURLは受け付けません。1つのserviceに許可できる表は、16までです。

metadataと取込の経路

文書対象の固定仕様には、GET /v2/service/tables/{collection}(service.metadata)とPOST /v2/service/tables/{collection}/import(service.import)が追加されています。ともにservice専用で、利用環境の対応版と有効化が必要です。

取込本文はschema_version、expected_actor、operationsに従い、Idempotency-Keyを指定します。権限は現在のservice承認範囲で判定します。通常のbatchや人用importから、本文・認証・上限を流用しないでください。APIリファレンスで現在の型と条件を確認します。これらの追加を、利用中の利用環境で実機確認済みとは扱いません。

世代と再開

初めて使うときは、provisionの後、service専用のアクセストークンで、activateします。rotate(鍵の更新)の後と、suspendからresumeの後も、新しい世代を反映するために、provisionとactivateが必要です。古い世代の資格は、使えません。revokedは、元に戻りません。

権限の範囲(scopes)

rowsは、{"kind":"all","values":{}}で、すべての行です。{"kind":"match","values":{…}}は、指定した列の値が一致する行で、複数の列は、すべての一致(AND)が条件です。任意の条件式では、ありません。custodianは、createした行を保管する責任者の、有効な利用者のUUIDで、createを許可するときに、必要です。実行の主体は、監査の上でも、serviceのままです。利用者になりすますものでは、ありません。

権限の変更

serviceの権限(表、列、操作)は、PUT /v2/service-clients/{clientId}/permissionsで、全置換で更新します。省略した表、列、操作は、許可から外れます。有効なserviceは、同じJWTのままで、次のリクエストから、新しい設定に従います。通常の設定変更で、provisionやactivateを、やり直す必要はありません。

期限を延ばす

serviceの期限(expires_at)は、設定する時点から90日以内です。組織の管理者の管理権限の期限と、利用環境の契約の期限・利用期間の期限も、超えられません。

続けて使うときは、期限が来る前に、組織の管理者がPUT /v2/service-clients/{clientId}/permissionsで、GET /v2/service-clients/{clientId}で得た最新のversionと、新しいexpires_atを送ります。この操作は全置換なので、今のrpmとscopesも、そのまま送ります。有効なserviceは、同じJWTのまま、次のリクエストから新しい期限に従います。provisionやactivateのやり直しは要りません。

鍵の更新(rotate)では、期限は延びません。期限を過ぎると、serviceのリクエストは401(TOKEN_INVALID)で拒否され、鍵の更新(rotate)・provision・resumeの管理の操作も、401(TOKEN_EXPIRED)で拒否されます。

定時の集計・同期

基盤のAPIには、決まった時刻に処理を動かす操作はありません。毎日の集計や、ほかのシステムとの同期は、お客さまのアプリのサーバー(BFF)が、決めた時刻に、serviceとして読み書きします。

使い始める前に

断られるときの答え

場面HTTPcode
許可した範囲(scopes)にない表404NOT_FOUND
行の条件(rows)に合わない行の更新・削除404NOT_FOUND
許可していない操作(例: queryだけを許可した表へのbatch)403FORBIDDEN_ROLE
許可していない列への書き込み403FIELD_NOT_WRITABLE
書いた結果の行が、行の条件から外れる403SCOPE_VIOLATION
provisionの後、activateの前403FORBIDDEN_ROLE
provisionの前、停止(suspend)・失効(revoke)・期限の後、rotateの後の古い世代のトークン401TOKEN_INVALID
許可のschema_versionと、表の今の版が違う409STATE_CONFLICT
行のversionが今の版と違う412VERSION_CONFLICT
1分あたりの上限を超えた429RATE_LIMITED

停止と失効

suspend(一時停止)またはrevoke(失効)の後は、古いJWTが拒否されることを確認します。resume(再開)の後も、古いJWTを再利用しません。状態に応じて、provision、新しいトークンの取得、activateを行います。変更のAPIは、最新のversionを要求します。

次に

許可された範囲での読み書きは、表とデータの更新。通しの手順は、アプリの登録と運用。