0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Data APIについて

Posted at

1) 入口(ベース URL とバージョン確認)

  • 典型例:https://{host}/mt/mt-data-api.cgi/v6/...(設置パスは環境により異なる)
  • 稼働&APIバージョン確認は /version(ここだけはバージョン接尾辞なしでOK):
    例)GET /mt-data-api.cgi/version(Data API の apiVersion / endpointVersion が返る) (Movable Type)

2) 認証(v6)

最短手順:アクセストークンを取得 → 以後ヘッダー送信

  1. セッション&アクセストークン発行(ログイン相当)

    POST /mt-data-api.cgi/v6/authentication
    Content-Type: application/x-www-form-urlencoded
    
    username=<サインイン名>&password=<Webサービス用PW>&clientId=<任意の文字列>
    

    成功すると accessToken / sessionId / expiresIn が返る。以降のAPIは
    X-MT-Authorization: MTAuth accessToken=<TOKEN> を付与。(Movable Type)

  2. ブラウザでログイン画面経由(リダイレクト型)

    GET /mt-data-api.cgi/v6/authorization?clientId=...&redirectUrl=https://...
    

    サインイン成功で redirectUrl#_login に遷移。(Movable Type)

  3. トークンの追加発行 / 失効

    • 追加発行:POST /v6/tokenX-MT-Authorization: MTAuth sessionId=... でも可)
    • 無効化:DELETE /v6/token(トークン失効)や DELETE /v6/authentication(ログアウト相当) (Movable Type)

注:Webサービス用パスワードを使う運用・用語は Data API 共通の前提(v系で共通)。(MovableType.org)


3) 主要リソース(よく使うもの)

  • サイトGET /v6/sites/v6/sites/{site_id} ほか
  • コンテンツタイプGET /v6/sites/{site_id}/contentTypes
  • コンテンツデータ
    一覧 GET /v6/sites/{site_id}/contentTypes/{ct_id}/data?limit=&offset=&sortBy=&sortOrder=
    取得 GET /v6/sites/{site_id}/contentTypes/{ct_id}/data/{cd_id}
    作成 POST、更新 PUT、削除 DELETE も対応(権限要)。(Movable Type)

一覧系でよく使う共通クエリ:limit / offset / sortBy / sortOrder / fields / includeIds / excludeIds など(v系で共通仕様)。(Movable Type)


4) 検索(v6)

4-1. Data API の /search(記事/ページ+条件)

GET /mt-data-api.cgi/v6/search
  ?search=foo AND bar
  &blog_id={site_id}
  &limit=20&offset=0
  &SearchSortBy=created_on
  &SearchResultDisplay=descend

search はブール検索。category:"看護師"author:xxx などのフィルタ構文あり。(Movable Type)

4-2. コンテンツデータを Data API で検索

GET /mt-data-api.cgi/v6/search
  ?search=看護師 AND 奈良
  &blog_id={site_id}
  &cdSearch=1
  &limit=20&offset=0

cdSearch=1 を付けると検索対象がコンテンツデータになる(重複ヒットの既知問題は 7.9.9 で修正済み)。(MovableType.org)

4-3. mt-cdsearch.cgi との使い分け

  • mt-cdsearch.cgi … 公開サイト向け“コンテンツデータ専用”検索 CGI。
    SearchContentTypes(対象CT指定)、content_field(検索対象フィールド限定)などが使えてフォーム実装が簡単。(Movable Type)
  • Data API /v6/search … JS/外部サービス連携で使いやすいREST。複合条件+APIレスポンスを扱いたいときに。(MovableType.org)

5) CORS(フロント直叩き時の必須設定)

フロント(ドメインA)→ MT(ドメインB)で fetch/axios するなら、サーバ側で DataAPICORSAllowOrigin を設定(mt-config.cgi)。例:

DataAPICORSAllowOrigin http://localhost:5173, https://www.example.com

許可オリジン以外からはブラウザが弾く。(MovableType.org)


6) 403/404 の“あるある”(v6でも同様)

  • 403 Forbidden:アクセストークン未付与/失効、権限不足。X-MT-Authorization を再確認。(Movable Type)
  • 404 Not Found:パスやバージョン違い(例:実装が v6 なのに /v7/... を叩いた等)、IDの取り違え。まず /version で実装確認。(Movable Type)

7) そのまま動くサンプル

7-1. curl(トークン取得→一覧)

# (A) ログイン(トークン取得)
curl -s -X POST \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "username=USER&password=WEBAPI_PASS&clientId=myapp" \
  https://{host}/mt/mt-data-api.cgi/v6/authentication

# => {"accessToken":"...","sessionId":"...","expiresIn":...}

# (B) コンテンツデータ一覧(公開分のみ/未公開含むには権限+トークン)
curl -s \
  -H "X-MT-Authorization: MTAuth accessToken=YOUR_TOKEN" \
  "https://{host}/mt/mt-data-api.cgi/v6/sites/{site_id}/contentTypes/{ct_id}/data?limit=20&offset=0"

(エンドポイントとパラメータ仕様は v6 リファレンスに準拠) (Movable Type)

7-2. fetch(v6 + CORS 済みサーバ前提)

const token = '...'; // /v6/authentication の accessToken
const url = '/mt/mt-data-api.cgi/v6/search'
  + '?cdSearch=1&blog_id=2&limit=20'
  + '&search=' + encodeURIComponent('看護師 AND 奈良');

fetch(url, { headers: { 'X-MT-Authorization': 'MTAuth accessToken=' + token } })
  .then(r => r.json())
  .then(data => console.log(data.items, data.totalResults));

(CORS は DataAPICORSAllowOrigin で許可する) (MovableType.org)


8) 実例メモ

  • /version → /v6/ の順で確認し、環境の実装バージョンに合わせて叩く。(Movable Type)
  • 検索の安定化limit/offset の他、SearchSortBy(例 created_on)や SearchResultDisplayascend/descend)を使う。(Movable Type)
  • 検索の重複ヒットを踏んだら MT 本体のバージョン確認(7.9.9 で修正)。(MovableType.org)

**ブラウザからそのまま開ける “GET系” エンドポイントURL(v6)**を用途別にまとめました。
(※トークンなしで開くと「公開データのみ」や「エラー」になる点に注意。認証が要る操作は curl/JS などでヘッダー付与が必要です)


0) 前提(置き換え用)

  • {host}:例 www.example.com
  • {site_id}:サイトID(ブログID)
  • {ct_id}:コンテンツタイプID
  • {cd_id}:コンテンツデータID

すべて以下のように置き換えてください:

https://{host}/mt/mt-data-api.cgi/v6/...

1) 稼働確認

APIバージョン確認(認証不要)

https://{host}/mt/mt-data-api.cgi/version

→ apiVersion / endpointVersion が JSON で返ります。


2) 認証(ブラウザ経由のリダイレクト方式)

ログイン画面→戻り先にリダイレクト(認証フローの開始)

https://{host}/mt/mt-data-api.cgi/v6/authorization
  ?clientId=myapp
  &redirectUrl=https%3A%2F%2F{host}%2Fafter-login.html
  • 認証成功後に redirectUrl へ遷移します(#_login が付く挙動の環境もあり)。
  • 以降のAPI呼び出しは通常、JSからトークンヘッダーを付けて行います(ブラウザのURL直叩きではヘッダーを付けられません)。

3) サイト・コンテンツタイプの取得(一覧系)

サイト一覧(公開情報の範囲で)

https://{host}/mt/mt-data-api.cgi/v6/sites?limit=50&offset=0

コンテンツタイプ一覧(サイト配下)

https://{host}/mt/mt-data-api.cgi/v6/sites/{site_id}/contentTypes?limit=50&offset=0

特定コンテンツタイプの詳細

https://{host}/mt/mt-data-api.cgi/v6/sites/{site_id}/contentTypes/{ct_id}

(フィールド定義などの確認に便利)


4) コンテンツデータ(CD)の取得(閲覧系)

一覧(CD)

https://{host}/mt/mt-data-api.cgi/v6/sites/{site_id}/contentTypes/{ct_id}/data
  ?limit=20&offset=0
  &sortBy=modified_on&sortOrder=descend

1件取得(CD)

https://{host}/mt/mt-data-api.cgi/v6/sites/{site_id}/contentTypes/{ct_id}/data/{cd_id}

注:未公開のCDやドラフトを見たい場合は、通常は認証+権限が必要(ブラウザURL直叩きだけでは不可)。


5) 検索(Data API /search)

5-1. 記事/ページなど(全文検索)

https://{host}/mt/mt-data-api.cgi/v6/search
  ?blog_id={site_id}
  &search=%E7%9C%8B%E8%AD%B7%E5%B8%AB%20AND%20%E5%A5%88%E8%89%AF
  &limit=20&offset=0
  &SearchSortBy=created_on
  &SearchResultDisplay=descend
  • search= はURLエンコード必須(上例は「看護師 AND 奈良」)。
  • category/author などのフィルタ構文も使用可。

5-2. コンテンツデータを検索(cdSearch=1)

https://{host}/mt/mt-data-api.cgi/v6/search
  ?blog_id={site_id}
  &cdSearch=1
  &search=%E7%9C%8B%E8%AD%B7%E5%B8%AB%20AND%20%E5%A5%88%E8%89%AF
  &limit=20&offset=0
  • CDを対象に全文検索します。
  • 項目単位で厳密に絞りたい場合は、後述の mt-cdsearch.cgi の方がフォーム実装しやすいことが多いです。

6)(参考)mt-cdsearch.cgi(コンテンツデータ専用CGI)

特定のコンテンツタイプを対象に検索

https://{host}/mt/mt-cdsearch.cgi
  ?site_id={site_id}
  &SearchContentTypes={ct_id}
  &q=%E7%9C%8B%E8%AD%B7%E5%B8%AB%20AND%20%E5%A5%88%E8%89%AF
  &limit=20&offset=0

検索対象フィールド(ID)を限定

https://{host}/mt/mt-cdsearch.cgi
  ?site_id={site_id}
  &SearchContentTypes={ct_id}
  &content_field=16,33,34
  &q=%E7%9C%8B%E8%AD%B7%E5%B8%AB
  &limit=20
  • content_fieldフィールドID のカンマ区切り。
  • 厳密に「どのフィールドを検索するか」指定したいときに有用です。
  • 公開サイトの検索フォームから直で叩きやすいのが利点。

7) URLエンコードのヒント

  • 半角スペース%20

  • 全角文字(日本語)もエンコード必須。

  • AND, OR, () などを入れる場合も、全体を encodeURIComponent(...) で包むのが安全。

    • 例:search= の値は JS なら

      const q = encodeURIComponent('看護師 AND 奈良');
      

8) 403/404で詰まったら

  • 403(Forbidden):未認証、または権限不足。公開範囲外はトークン必須。
  • 404(Not Found):パス/ID/バージョン違い。まず .../version で実装を確認。
  • CORS:フロントJSから別ドメインの Data API を叩くときは mt-config.cgi
    DataAPICORSAllowOrigin にオリジン(例:https://www.example.com)を登録。

**Movable Type Data API v6 の「認証」**だけを、そのまま使える形で整理します。
(前提:MTの管理側で「Webサービス用パスワード」を発行済・必要な権限ロールが付与済み)


1) 認証の全体像(v6)

  • 認証は大きく 2パターン

    1. API直叩き(パスワード型)/v6/authentication にユーザー名+Webサービス用PWを投げて accessToken を取得
    2. ブラウザ認証(リダイレクト型)/v6/authorization?redirectUrl=... でMTのログイン画面→同意→戻り先へ。戻ってから API を呼ぶ
  • 以後の API 呼び出しは、HTTPヘッダに
    X-MT-Authorization: MTAuth accessToken=<アクセストークン> を付与

  • トークンは一定時間で失効。必要に応じて /v6/token(再発行)や /v6/authentication の呼び直しで更新

  • フロントから直接叩くならCORS(mt-config.cgi の DataAPICORSAllowOrigin)設定が必要


2) 最短レシピ(API直叩き)

2-1. アクセストークン取得(ログイン)

POST /mt/mt-data-api.cgi/v6/authentication
Content-Type: application/x-www-form-urlencoded

username=<サインイン名>&password=<Webサービス用PW>&clientId=<任意の文字列>

レスポンス例

{
  "accessToken": "xxxxxxxx",
  "sessionId": "yyyyyyyy",
  "expiresIn": 3600,
  "user": { "id": 1, "displayName": "Admin" }
}
  • accessToken … API呼び出し時に使う
  • sessionId … 追加トークンの発行など一部操作で使う場合がある
  • expiresIn … 秒数。切れたら再取得

2-2. 認証付きでAPIを叩く

GET /mt/mt-data-api.cgi/v6/sites/1/contentTypes/3/data?limit=20
X-MT-Authorization: MTAuth accessToken=xxxxxxxx

2-3. トークンの再発行・失効

  • 追加発行(ローテーション運用向け)

    POST /mt/mt-data-api.cgi/v6/token
    X-MT-Authorization: MTAuth sessionId=yyyyyyyy
    
  • トークンを明示的に失効

    DELETE /mt/mt-data-api.cgi/v6/token
    X-MT-Authorization: MTAuth accessToken=xxxxxxxx
    
  • サインアウト(サーバ側セッション終了)

    DELETE /mt/mt-data-api.cgi/v6/authentication
    

3) ブラウザ認証フロー(リダイレクト型)

用途:SPA/フロントアプリで、ユーザーにMTログイン画面で認証してもらう

  1. 認証開始(ユーザーをMTへリダイレクト)
GET /mt/mt-data-api.cgi/v6/authorization
  ?clientId=myapp
  &redirectUrl=https%3A%2F%2Fwww.example.com%2Fafter-login.html
  1. 認証成功 → redirectUrl へ戻る(実装により #_login フラグが付く場合あり)

  2. 戻り先で、必要なら /v6/authentication を呼んで accessToken を取得
    (※リダイレクトだけではトークンが自動で手に入らない構成も多い。画面戻り後に「ログイン済み/セッションあり」状態を使ってトークンを取り直す、という実装にしておくと安全)


4) フロントJSの基本形(fetch)

// ① 起動時:まだトークンがなければ /v6/authorization へ誘導するUIを出す or
//   サーバ側で /v6/authentication を代理実行してトークンを返すエンドポイントを用意する

async function loginAndGetToken(username, webServicePassword) {
  const params = new URLSearchParams({
    username,
    password: webServicePassword,
    clientId: 'myapp'
  });
  const res = await fetch('/mt/mt-data-api.cgi/v6/authentication', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: params
  });
  const json = await res.json();
  return json.accessToken; // これをメモリに保持(localStorageは避けるのが無難)
}

async function getContentData(token, siteId, ctId) {
  const url = `/mt/mt-data-api.cgi/v6/sites/${siteId}/contentTypes/${ctId}/data?limit=20&offset=0`;
  const res = await fetch(url, {
    headers: { 'X-MT-Authorization': 'MTAuth accessToken=' + token }
  });
  if (res.status === 401 || res.status === 403) {
    // 期限切れや権限不足。トークン更新 or 再ログイン
  }
  return await res.json();
}

セキュリティ観点では、トークンをブラウザの永続ストレージ(localStorage等)に保存しない方が安全です(XSS対策)。可能なら自前バックエンドを挟み、サーバ側でトークンを保持→フロントからは自サーバへ叩く“BFFパターン”が堅いです。


5) CORS(クロスオリジン)

  • 別ドメイン/ポートのフロントから Data API を直接叩く場合は、mt-config.cgi

    DataAPICORSAllowOrigin https://www.example.com, http://localhost:5173
    

    のように許可オリジンを設定

  • これがないと、正しいトークンでもブラウザが事前検証(Preflight)でブロックします


6) よくあるエラーと対処

  • 401/403

    • X-MT-Authorization ヘッダがない/不正、トークン期限切れ、権限不足
    • Webサービス用パスワードの誤り(通常パスワードと別物)
    • 対象データが未公開で、閲覧権限がない
  • 404

    • /v6/...バージョン違いやパス/IDの間違い
    • まず .../version で稼働バージョンを確認
  • CORSエラー

    • DataAPICORSAllowOrigin 未設定/一致していない
    • 開発中は http://localhost:<port> を必ず許可に入れる

7) 運用のコツ(安全&安定)

  • 最小権限:運用ユーザーに必要最小限のロールを割り当てる
  • トークン寿命に備えるexpiresIn を見て自動更新の仕組みを用意する
  • BFF構成:可能なら自前バックエンドでトークン隠蔽。フロントは自サーバだけを叩く
  • ログと監視:401/403/404の頻度、CORS失敗をサーバアクセスログで把握
  • HTTPS必須:トークンは平文なのでTLSで保護(本番は常時HTTPS)

8) cURL ひな型

# 1) ログイン(トークン取得)
curl -s -X POST \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "username=USER&password=WEBAPI_PASS&clientId=myapp" \
  https://{host}/mt/mt-data-api.cgi/v6/authentication

# => {"accessToken":"...","sessionId":"...","expiresIn":...}

# 2) 認証付きGET
curl -s \
  -H "X-MT-Authorization: MTAuth accessToken=YOUR_TOKEN" \
  "https://{host}/mt/mt-data-api.cgi/v6/sites/{site_id}/contentTypes/{ct_id}/data?limit=20"

# 3) トークン失効
curl -s -X DELETE \
  -H "X-MT-Authorization: MTAuth accessToken=YOUR_TOKEN" \
  https://{host}/mt/mt-data-api.cgi/v6/token

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?