LANG SELRCT

コードを書く場所

2019年8月20日火曜日

freee APIのトークン情報をスクリプトプロパティに保存して更新したい


Google Apps Scriptのスクリプトのプロパティにトークン情報を保存して、
リフレッシュトークンを使って更新するコードです。


実現したいこと

アクセストークンを取得したい
手順
  1. freeeにアプリを登録して、コード.gs の Client ID と Client Secretに入れる
  2. ウェブアプリとして導入する
  3. そのURLをfreeeのアプリのコールバックURLに入れる
  4. Webアプリ認証用URLをブラウザで開いてアクセス許可する
  5. ブラウザにアクセストークンが表示され、スクリプトのプロパティにも保存される

リフレッシュトークンで更新したい
手順
  1. refreshTokens() を実行する
  2. スクリプトのプロパティのトークン情報が更新される


それぞれ詳しくは以下2つの記事に書きました

初回アクセストークン取得の手順
freee APIでアクセストークンを取得したい

リフレッシュトークンで更新する手順
freee APIでリフレッシュトークンを使いたい



コード.gs
var client_id = 'Client ID';
var client_secret = 'Client Secret';


function doGet(e) {
  var response = getAccessToken(e);
  setScriptProperties(JSON.parse(response));
  return ContentService.createTextOutput(response);// ブラウザに表示する
}

/************************************
リフレッシュトークンを使ってトークン情報を更新してスクリプトプロパティを上書きする
************************************/
function refreshTokens() {
  var response = runRefresh(getScriptProperties('refresh_token'))
  setScriptProperties(JSON.parse(response));
}

/************************************
PropertiesService
************************************/
function setScriptProperties(jobj) {// スクリプトのプロパティに値を保存する
  PropertiesService.getScriptProperties().setProperties(jobj);
}

function getScriptProperties(key) {// スクリプトのプロパティから値を取得する
  return PropertiesService.getScriptProperties().getProperty(key);
}

//アクセストークン、リフレッシュトークン取得時に使うurl
var token_url = 'https://accounts.secure.freee.co.jp/public_api/token';

/************************************
認可コードを利用してトークン情報を取得して返す(初回のみ使用する)
次回からはリフレッシュトークンを使ってトークン情報を更新できる
************************************/
function getAccessToken(e) {
  var code = e['parameter']['code'];
  var payload = {
    'grant_type': 'authorization_code',
    'client_id': client_id,
    'client_secret': client_secret,
    'code': code,
    'redirect_uri': ScriptApp.getService().getUrl()
  }
  var response = UrlFetchApp.fetch(token_url, getOptions(payload));
  return response;
}

/************************************
refresh_tokenを使って更新したトークン情報を返す
************************************/
function runRefresh(refresh_token) {  
  var payload = {
    'grant_type': 'refresh_token',
    'client_id': client_id,
    'client_secret': client_secret,
    'refresh_token': refresh_token
  }
  var response = UrlFetchApp.fetch(token_url, getOptions(payload));
  return response;
}

/************************************
optionsを作って返す
************************************/
function getOptions(payload) {
  var options = {
    'method': 'post',
    'contentType': 'application/x-www-form-urlencoded',
    'payload': payload
  }
  return options;
}



関連記事

アクセストークンを取得したい
リフレッシュトークンを使いたい