freee APIのアクセストークンの有効時間は24時間ですが、
リフレッシュトークンを使うことで
アクセストークンを更新することができます。
関連記事
アクセストークンを取得したい
リフレッシュトークンを使いたい
ログインユーザの情報を取得してみる
勤怠打刻してみる
この記事でやること
アクセストークンはGETやPOSTを行う際に必要なものですが、
有効時間が切れると使えなくなります。
そのとき手動でリフレッシュトークンを使って更新するのも1つの手ですが、
そのひと手間を自動化したい。
ここでは、GASのPropertiesServiceを利用して、
トークン情報を保存・更新して、
アクセストークンを自動更新できる仕組みを作ってみます。
1つのファイルにすべてのコードを書いても動きますが、
以下4つのファイルに分けて書きました。
- コード.gs
- Client ID, Client Secretを貼り付けるだけ
- main.gs
- freeeAPIでやりたいこと
- 例としてログインユーザの情報を取得してみるの処理を書いています
- lib.gs
- ライブラリとして外部に置いてしまってもいい関数たち
- tokens.gs
- 取得したトークンをスクリプトプロパティに入れるための関数たち
各自で変更する箇所は3箇所
- Client ID
- Client Secret
- main.gsのpath (他のpathを試す場合に変更する)
Client ID, Client Secretを入力するファイル
コード.gs
var client_id = 'アプリストアのClient IDを貼り付けます'; var client_secret = 'アプリストアのClient Secretを貼り付けます'; |
GET, POST, PUT, DELETEなどを実行する関数を書くファイル
(今回はGETの処理を書いています)
main.gsvar HrBaseUrl = 'https://api.freee.co.jp/hr/api/v1';
function getUsersMe() {
var path = '/users/me';
var endpoint = HrBaseUrl + path;
refreshTokens();
var access_token = getScriptProperties('access_token');
var response = runMethod('get', endpoint, access_token);
Logger.log(response);
}
|
ライブラリにできそうな関数をまとめたファイル
lib.gs//アクセストークン、リフレッシュトークン取得時に使うurl
var token_url = 'https://accounts.secure.freee.co.jp/public_api/token';
/************************************
認可コードを利用してトークン情報を取得して返す(初回のみ使用する)
次回からはリフレッシュトークンを使ってトークン情報を更新できる
************************************/
function getAccessToken(obj, e) {
var code = e['parameter']['code'];
var payload = {
'grant_type': 'authorization_code',
'client_id': obj['client_id'],
'client_secret': obj['client_secret'],
'code': code,
'redirect_uri': obj['redirect_uri']
}
var response = UrlFetchApp.fetch(token_url, getOptions(payload));
return response;
}
/************************************
refresh_tokenを使って更新したトークン情報を返す
************************************/
function runRefresh(obj, refresh_token) {
var payload = {
'grant_type': 'refresh_token',
'client_id': obj['client_id'],
'client_secret': obj['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;
}
/************************************
渡されたmethodで実行する
************************************/
function runMethod(method, url, access_token, payload) {
var options = {
'method': method,
'contentType': 'application/json',
'headers': { 'Authorization': 'Bearer ' + access_token },
'payload': payload,
'muteHttpExceptions': true
}
var response = UrlFetchApp.fetch(url, options);
return response;
}
|
アクセストークン, リフレッシュトークンを取得して更新する関数を書くファイル
tokens.gs/************************************
アクセストークン、リフレッシュトークン取得時に使うオブジェクト
************************************/
var appInfo = {
'client_id': client_id,
'client_secret': client_secret,
'redirect_uri': ScriptApp.getService().getUrl()// ウェブアプリのURL
}
/************************************
Web認証用URLを開いたときに動く処理
************************************/
function doGet(e) {
var response = getAccessToken(appInfo, e);
setScriptProperties(JSON.parse(response));
return ContentService.createTextOutput(response);// ブラウザに表示する
}
/************************************
リフレッシュトークンを使ってトークン情報を更新してスクリプトプロパティを上書きする
************************************/
function refreshTokens() {
var response = runRefresh(appInfo, getScriptProperties('refresh_token'))
setScriptProperties(JSON.parse(response));
}
/************************************
PropertiesService
************************************/
function setScriptProperties(jobj) {// スクリプトのプロパティに値を保存する
PropertiesService.getScriptProperties().setProperties(jobj);
}
function getScriptProperties(key) {// スクリプトのプロパティから値を取得する
return PropertiesService.getScriptProperties().getProperty(key);
}
|