株式会社スマレジの開発部でスマレジのサーバサイドを作っています

スマレジプラットフォームAPIのアクセストークンをGASで再取得する

2020-07-26 追記

本記事は、ベータ版の認証方法のため、現在の認証方法とは異なります。 最新のアクセストークンの取得は↓をご覧下さい!

masa2019.hatenablog.com

こんばんは!株式会社スマレジ、開発部のmasaです。

新型コロナウイルスによる自粛ムードも少しずつ和らいできていますね。
スマレジでも、営業再開の対応がひと段落してきて、少しずつではありますが、
以前と同じ活気あふれる職場に戻りつつあります。

その一方で、自粛期間に培ったリモートワークのノウハウはしっかり活かして、
効率的なお仕事ができればいいなと思います。

さて、今日はプラットフォームAPIの認証編です。

アクセストークン取得の自動化

前回postmanを使って、プラットフォームAPIの呼び出しまでを紹介したときに、
アクセストークンとリフレッシュトークンを認証コードから取得する方法をご紹介しました。

masa2019.hatenablog.com

しかし、プラットフォームAPIはOAuth2.0に準拠しているため、アクセストークンは一定時間たつと失効し、
再取得する必要があります。(プラットフォームAPIのアクセストークンの有効期間は取得してから1時間)

そこで、今回は再取得する処理をGASで実装していきます。

用意するもの

  • Basic認証用コード
    • 前回のブログを実施された方は、「4. 認証用コードを取得する」でアクセストークンを取得した際の、リクエストのHeadersAuthorizationという項目がコレです
  • 取得済みの有効なリフレッシュトーク
    • 前回のブログを実施された方は、「4. 認証用コードを取得する」でアクセストークンを取得した際の、レスポンスのBodyrefresh_tokenという項目がコレです

      注意点

      基本的に今後の開発はGASそのものではなく、claspとTypeScriptを用いたものになるため、起債するソースは特に断りがない場合はTypeScriptになります。 方法はググると色々出てきます。このブログでも一度紹介した際は↓を参考にしました。

medium.com

スプレッドシートを用意する

本来ならAPIのアクセス履歴をDB等に持っておくのですが、今回は簡単モードでシートにアクセストークンとリフレッシュトークンをどんどん追加していく形にします。
わかりやすさ重視でこの構成にしていますが、アクセス情報を平文のままスプレッドシートに書くことはトークン漏出のリスクがあるため、セキュリティ的に非常に危険です!あくまでお試しでご利用ください。また、ソースの利用は自己責任でお願いいたします。
claspでスプレッドシートを作成したら、シートに↓の画像のように、リフレッシュトークンを書いておきます。

f:id:masa2019:20200614215655p:plain
シートにリフレッシュトークンを設定しておく

ソースを用意する

/**
 * アクセストークンを取得する。
 * ※ この関数はわかりやすさ重視のため認証用コードをソースに直書きしているため、セキュリティ的に非常に危険です!
 * ※ あくまで参考程度でお試しください。
 *
 * throw Error 取得失敗時
 */
function refreshAccessToken(){

    let sheet = SpreadsheetApp.getActiveSheet();
    const refreshTokens = sheet.getRange('A:A').getValues();
    const lastRow = refreshTokens.filter(String).length;  //空白を除き、配列の数を取得
    let refreshToken = sheet.getRange(lastRow, 1).getValue();

    //header情報
    const headers = {
        'Authorization' : 'ここにBasic認証用コードを貼る。頭の「Basic+半角スペース」も忘れずに',
        'Content-Type' : 'application/x-www-form-urlencoded'
    };

    const payload = {
        'grant_type' : 'refresh_token',
        'refresh_token' : refreshToken
    };

    // urlfetchappのオプション情報
    const options: any = {
        'method' : 'post',
        'headers' : headers,     // header情報を追加
        'payload' : payload      // トークンを設定
    };
    const url = 'https://id.smaregi.dev/authorize/token';

    try {
        //外部へアクセスさせる
        let resStr = UrlFetchApp.fetch(url, options).getContentText();
        if (resStr.length === 0) {
            throw new Error("受信データがありませんでした。");
        }
        let resJson = JSON.parse(resStr);
        Logger.log(resStr);
        sheet.getRange(lastRow + 1, 1).setValue(resJson.refresh_token);
        sheet.getRange(lastRow + 1, 2).setValue(resJson.access_token);
    } catch(e) {
        Browser.msgBox("エラー:" + e);
    }
}

実行すると・・・

f:id:masa2019:20200614215535p:plain

実行すると上記の画像のように、トークンが下へ下へと追加されていきます。 一番下が有効なトークンになります。