スマレジプラットフォームAPIのアクセストークンをGASで再取得する
2020-07-26 追記
本記事は、ベータ版の認証方法のため、現在の認証方法とは異なります。 最新のアクセストークンの取得は↓をご覧下さい!
こんばんは!株式会社スマレジ、開発部のmasaです。
新型コロナウイルスによる自粛ムードも少しずつ和らいできていますね。
スマレジでも、営業再開の対応がひと段落してきて、少しずつではありますが、
以前と同じ活気あふれる職場に戻りつつあります。
その一方で、自粛期間に培ったリモートワークのノウハウはしっかり活かして、
効率的なお仕事ができればいいなと思います。
さて、今日はプラットフォームAPIの認証編です。
アクセストークン取得の自動化
前回postmanを使って、プラットフォームAPIの呼び出しまでを紹介したときに、
アクセストークンとリフレッシュトークンを認証コードから取得する方法をご紹介しました。
しかし、プラットフォームAPIはOAuth2.0に準拠しているため、アクセストークンは一定時間たつと失効し、
再取得する必要があります。(プラットフォームAPIのアクセストークンの有効期間は取得してから1時間)
そこで、今回は再取得する処理をGASで実装していきます。
用意するもの
スプレッドシートを用意する
本来ならAPIのアクセス履歴をDB等に持っておくのですが、今回は簡単モードでシートにアクセストークンとリフレッシュトークンをどんどん追加していく形にします。
わかりやすさ重視でこの構成にしていますが、アクセス情報を平文のままスプレッドシートに書くことはトークン漏出のリスクがあるため、セキュリティ的に非常に危険です!あくまでお試しでご利用ください。また、ソースの利用は自己責任でお願いいたします。
claspでスプレッドシートを作成したら、シートに↓の画像のように、リフレッシュトークンを書いておきます。
ソースを用意する
/** * アクセストークンを取得する。 * ※ この関数はわかりやすさ重視のため認証用コードをソースに直書きしているため、セキュリティ的に非常に危険です! * ※ あくまで参考程度でお試しください。 * * 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); } }
実行すると・・・