見出し画像

開発日記(2024/05/01)JWT(Jason Web Token)に署名してApp Store Conect APIからインストール情報を取得するぞ

人生で日記的なものが3日続いたことはなかったのですが、なんと3日目です。まあ日記というか作業メモなんですけどね。

書くことから始めよう。というなるべく最初の作業に取り掛かるハードルを下げるということが効果的だなという実感があることと、最近はこの辺りの進捗をパートナーに雑談しても「いいからやれ」としか言われなくなってしまったので、文字通り壁に話かけることしかできなくなってしまったことが継続できている成功要因でしょうか。まあGWが関の山でしょう。

さて、タイトルのとおり、今日は「JWT(Jason Web Token)に署名してApp Store Conect APIからインストール情報を取得」にフォーカスして頑張りたいと思います。できるかなあ・・・(今は11:12です。AMは8時には起床したはずなのに何をしていたのだろう・・・)

おさらいですが、まずJWTに署名するステップは下記です。

  1. Create the JWT header. //ヘッダーを作って

  2. Create the JWT payload. //ペイロードを作って

  3. Sign the JWT. //JWTに署名

ヘッダーは下記。実質固定値ですね。

headers = {
"alg": "ES256",
"kid": "ここには昨日取得したキーIDを入れます",
"typ": "JWT",
}

ペイロードは下記。予約語以外は何書いてもいいらしい。作成日と有効期限をUNIX時間で書かなくてはならないとのこと。ここを毎回更新するプログラムが必要。今は一旦2024/05/01/12:00と2024/05/01/12:20で設定。

payload = {
    "iss": "ここは昨日取得したIssuer IDを入れます",
    "iat": 1714543500,
    "exp": 1714544500,
    "aud": "appstoreconnect-v1",
    "scope": [
        "GET /v1/apps?filter[platform]=IOS"
    ]
}

とりあえずCurlで実行して挙動を確認してみよう。ということで、下記を参考にしました。

(勉強にはなったのだけど、後から思えばこんなちまちましたステップは踏まずに何かしらのライブラリで実行してしまうべきだった・・・)

Base64でエンコード、Base64 URLに変換、ドットで結合、秘密鍵で署名を作成、署名とドットで結合、ASCにリクエストを送信。これを何度も繰り返すことに・・・これがうまくいかず、17時半までかかる。。(詳細割愛)

結局、なんらかのライブラリが必要ということで、node.jsに挑戦することに。

わ〜環境構築だいすき〜・・・

無事にインストール完了。

うわ、パス通すのどっちだっけ・・・ってなって両方やる

このあとOpenSSLだったりjsonwebtokenだったりをインストール。GPT先生に教えを乞いながら下記のコードで無事にレスポンスが返ってくる。

const jwt = require('jsonwebtoken');
const fs = require('fs');

// シークレットキー(秘密鍵)
const secretKey = fs.readFileSync('ダウンロードした秘密鍵.p8'); // 秘密鍵ファイルのパスを指定

// ヘッダー情報
const header = {
    "alg": "ES256", // 使用するアルゴリズム
    "kid": "自分のKey ID",// 使用するキー情報
    "typ": "JWT" // トークンのタイプ
  };

// ペイロード情報
const payload = {
    "iss": "ここは昨日取得したIssuer IDを入れます",
    "iat": Math.floor(Date.now() / 1000), // トークンの発行日時(現在時刻)
    "exp": Math.floor(Date.now() / 1000 + 20 * 60), // トークンの有効期限(現在時刻)
    "aud": 'appstoreconnect-v1',
};

// JWTの生成
const token = jwt.sign(payload, secretKey, { algorithm: 'ES256', header });

console.log(token);
21時を過ぎる・・・

結局ハマりポイントはES256だって書いてあるのにHS256で署名してた時間と秘密鍵までBase64 URLにエンコードしてたあたりかな・・・まあもっと早くNode.jsで署名する方向に切り替えてればよかったよね。どうせ最後はサーバー側で実行しなくちゃいけないのだから・・・

本当はレスポンスでダウンロード数を取り出すところまでやりたかったけど、気が滅入るので一回明日はLINEbot側の準備をしようかな。GWも折り返しですね・・・つかれた・・・次回は・・・(予定)

LINEbotってそんな簡単に作れるんですか?


ご覧いただきありがとうございます。とても嬉しいです。