2024/5/14

Postman で認証が必要なMTのエンドポイントをまとめて認証する #movabletype

普段、APIの動作確認をするときとかに Postman をよく使う。

Postman API Platform
https://www.postman.com/ 

MTAppjQuery の問い合わせで DataAPI の確認したり、 Craft CMS の GraphQL の確認したり。
他のサービスの API 叩いてみたりするときに使っている。

DataAPI の認証をまとめてやる

MT の DataAPI を使う場合は認証が必要なエンドポイントとかがあって、そういうときは Authentication のエンドポイントで認証して、受け取った accessToken をつかってあれこれ処理をする

Movable Type Data API v6
https://movabletype.github.io/mt-docs-data-api-reference/v6.html#tag/Authentication/paths/~1authentication/post 

Collection の設定の中に「認証情報」「変数」の設定をするのとは別に、「Scripts」のところで 「Pre-request」「Post-response」の設定があった。
この Pre-request の設定をしておけば Collection 配下のリクエストとかで認証情報を使ってやれるような気がしたので試してみた。

最初少し試してみたけど、 ChatGPT に聞いた方が早そうだったので聞いてみた。

ChatGPT が教えてくれたコードがこんな感じ

pm.sendRequest({
    url: pm.environment.get("base_url") + '/v4/authentication',
    method: 'POST',
    header: {
        'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: {
        mode: 'urlencoded',
        urlencoded: [
            {key: "username", value: pm.environment.get("username"), type: "text"},
            {key: "password", value: pm.environment.get("password"), type: "text"},
            {key: "__mode", value: "authenticate", type: "text"}
        ]
    }
}, function (err, res) {
    if (err) {
        console.log(err);
    } else {
        var authToken = res.json().accessToken;
        pm.environment.set("authToken", authToken);
        console.log('Authentication token saved: ', authToken);
    }
});

変数の設定・取得が environment を使う形になっていたのだけど、変数の設定は Collection の方でやっていたので書き換える

url: pm.environment.get("base_url") + '/v4/authentication',
↓↓↓
url: pm.collectionVariables.get("base_url") + '/v6/authentication',

ついでに v6 にしておく。

Postman の変数関係

Store and reuse values using variables | Postman Learning Center
https://learning.postman.com/docs/sending-requests/variables/variables/ 

あとは ClientID を渡しておく

body: {
        mode: 'urlencoded',
        urlencoded: [
            {key: "username", value: pm.environment.get("username"), type: "text"},
            {key: "password", value: pm.environment.get("password"), type: "text"},
            {key: "__mode", value: "authenticate", type: "text"}
        ]
    }

↓↓↓

    body: {
        mode: 'urlencoded',
        urlencoded: [
            {key: "username", value: pm.collectionVariables.get("username"), type: "text"},
            {key: "password", value: pm.collectionVariables.get("password"), type: "text"},
            {key: "clientId", value: pm.collectionVariables.get("clientId"), type: "text"}
        ]
    }

===

pm.environment.set("authToken", authToken);
↓↓↓
pm.collectionVariables.set("authToken", authToken);

__mode は要らなかった。

これで例えば認証が必要なエンドポイントを叩く時に「Headers」に accessToken を渡しておく。

X-MT-Authorization : MTAuth accessToken={{authToken}}

これでテンプレートの情報とかを取得出来た。

ChatGPT は「Authorization」タブのタイプ「Bearer Token」に保存すると教えてくれたのだけど、「Authorization」タブで保存するならタイプは「API Key」に保存するような気がする。

とりあえず API Key に保存する形で問題無かった。

Collections 単位で認証する

この「Authorization」自体も Collection の方で済ませてしまえば、配下のものは認証も通過して使う事ができた。

Request の方の「Authorization」の設定

Request の方の「Headers」の設定は無効状態

Collection の方で設定してるから毎回認証が走りそう。
その辺は Token が有効かどうかとかで判断するとか入れてもいいのかも知れない。


普通にエディタとかでやる方がいい人はにっくさんや高橋さんの記事が参考になりそう