freee APIのアクセストークンを取得する

Print Friendly and PDFページを印刷
対象プラン
  法人プラン   ✓ ライト   ✓ ビジネス   ✓ エンタープライズ  
  個人プラン   ✓ スターター   ✓ スタンダード   ✓ プレミアム  

【注意】本ページはソフトウェア開発者向けのページです

freee APIへのアプリケーションの登録、その後のアクセストークン取得までの流れをご紹介します(OAuth2に対応)。簡単な検証方法・サンプルコードも記載しています。

最新のAPI仕様はこちらで公開しています。(検証用のfreeeアカウントについてはこちら

freee API

 

目次

  1. OAuth 2について
  2. freee APIへアプリケーションを登録する(未登録の場合)
  3. 連携アプリのアクセストークンを取得する
    1. アクセストークンの取得方法
    2. Chromeアドオンを用いた簡単な確認方法
    3. エンドユーザーの体験について
  4. サンプルコード
    1. PHP
    2. VBA
    3. Google Apps Script(GAS)

 

OAuth 2について

OAuth 2.0認証は、サードパーティアプリに対してhttpサービスへのアクセスを付与するフレームワークです。アクセストークンを用いて、保護されたリソースにアクセスできます。

 

freee APIへアプリケーションを登録する(未登録の場合)

未登録である場合は、freee APIを利用するアプリケーションをfreeeに登録します(無料)。登録により、アプリケーションのIDとSecretが発行されます。

【注意】このアプリケーションの登録はシステム開発者が行う作業であり、エンドユーザーが行う作業ではありません。開発者が発行したApp IDとSecret、認証用URLをエンドユーザーが用いることとなります。

開発者のアカウントで会計freeeにログインし、https://secure.freee.co.jp/oauth/applications にアクセスし、「+新しいアプリケーションを登録」をクリックします。
 

アプリケーション名、コールバックURIを入力し保存します。(入力内容は登録後にも編集できます)
※ ローカル環境でのテスト時には、コールバックURIに「urn:ietf:wg:oauth:2.0:oob」をご利用ください。

 

アプリケーションが登録され、IDとSecret、認証用URL(エンドユーザーが認証時にアクセスするURL)が表示されます。


※ 以後、アプリケーションの一覧から、登録したアプリケーション名をクリックすると、この画面を確認できます。

 

連携アプリのアクセストークンを取得する

アクセストークンの取得方法

アクセストークンを取得するためには、「Webアプリ認証用URL」(https://secure.freee.co.jp/oauth/authorize?client_id=${お客様のApp ID}&redirect_uri=${お客様のコールバックURI}&response_type=code)にて認証コード(Authorization code)を取得し、それを用いたhttpリクエストを送る必要があります。認証コードの有効期間は10分です。

※ 「Webアプリ認証用URL」へのアクセス時にログインする場合は、Googleアカウント等のsocial ログインではなく、freeeアカウントのメールアドレス・パスワードでログインする必要があります。


redirect_uriに「urn:ietf:wg:oauth:2.0:oob」を指定している場合、「Webアプリ認証用URL」へそのままブラウザでアクセスしても認証コード(Authorization code)を確認できます。

「許可する」をクリックすると、認証コードが表示されます。(有効期間:10分)

 

コンソール上からcurlコマンドを使ってアクセストークンを取得する例は下記のようになります。

curl -i -X POST \
-H "Content-Type:application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "client_id=${お客様のApp ID}" \
-d "client_secret=${お客様のSecret}" \
-d "code=${先ほどのauthorization code}" \
-d "redirect_uri=${連携アプリのコールバックURI}" \
'https://api.freee.co.jp/oauth/token'


成功すると、レスポンスとして 下記のようにアクセストークン、リフレッシュトークンが得られます。有効期限は、アクセストークンについては24時間、リフレッシュトークンでは無期限となっています。使用する際は必要に応じてrefresh、revokeしてください。

{ 
"access_token": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", 
"token_type": "bearer", 
"expires_in": 86400,
"refresh_token": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "scope": "read write" }

refreshする例は下記のようになります。

curl -i -X POST \
-H "Content-Type:application/x-www-form-urlencoded" \
-d "grant_type=refresh_token" \
-d "client_id=${お客様のApp ID}" \
-d "client_secret=${お客様のSecret}" \
-d "refresh_token=${前回取得したrefresh_token}" \
'https://api.freee.co.jp/oauth/token'

 


それぞれのAPIは、取得したaccess tokenを添えて利用したいAPIへアクセスすることで利用できます。
例えば、Bearer Headerに添付してcurlコマンドを実行する例は下記のようになります

curl -H "Authorization: Bearer ${取得したaccess token}" "https://api.freee.co.jp/api/1/xxx.json"


※ アクセストークンを用いたGET・POST等のリクエスト送信の詳細については、こちらのページで取り扱います。

 

Chromeアドオンを用いた簡単な確認方法

コンソールからのコマンドライン操作をせずにhttpリクエストを送る簡単な方法として、Chromeアドオンを用いる方法があります。検証時に便利に活用できるためご紹介します。
DHC - Restlet Clientを導入し、REQUESTS画面から下記のように入力してsendします。 

項目 入力内容
エンドポイント api.freee.co.jp/oauth/token
Header 「Content-Type」、「application/x-www-form-urlencoded」
grant_type 「authorization_code」
client_id 取得したApp ID
client_secret 取得した Sacred
code 取得した 認証コード(Authorization code)
redirect_uri コールバックURI


※ 右上の「Code」をクリックするとコードを確認できます


成功すると、レスポンスが画面に表示されます。

※ このREQUESTSはDHC - Restlet Clientへ保存しておくこともできます。また、これと同様の方法で、refresh等も行うことができます。

エンドユーザーの体験について

一般的には次のような流れとなり、ユーザーがfreeeへログインし「許可する」をクリックするだけで完了します。

  1. エンドユーザーが認証用URLに誘導される(その際、freeeへのログインが要求される)
  2. エンドユーザーが認証用URLにて許可の操作を行う
  3. 設定していたリダイレクトURIによって元のアプリに戻る(同時に認証コードを連携アプリへ渡す)

 

サンプルコード

※動作保証対象外

PHP

「Webアプリ認証用URL」からアクセストークンのエンドポイントへリダイレクトし、curlでリクエスト送信、レスポンスボディのアクセストークンを取得するまでのテストコードです。index.php及びcallback.phpから成ります。 APP_ID、CALLBACK_URL、SECRETについてはお客様の環境のものに置き換えて用いてください。

index.php

<?php
//連携アプリ情報
define('APP_ID', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
define('CALLBACK_URL', 'http://localhost:XXXX/callback.php'); 

// 認証ページにリダイレクト 
$params = array( 
'client_id' => APP_ID, 
'redirect_uri' => CALLBACK_URL, 
'response_type' => 'code', ); 
header("Location: " . 'https://secure.freee.co.jp/oauth/authorize/'. '?' . http_build_query($params));

callback.php

<?php 
//連携アプリ情報
define('APP_ID', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
define('SECRET', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
define('CALLBACK_URL', 'http://localhost:XXXX/callback.php'); 

//POSTデータ 
$params = http_build_query( 
array( 
'grant_type' => 'authorization_code', 
'client_id' => APP_ID, 
'client_secret' => SECRET, 
'code' => $_GET['code'], //認証用URLで取得したコード 
'redirect_uri' => CALLBACK_URL, )); 
$headers = array( "Content-type: application/x-www-form-urlencoded" ); 

//POSTリクエスト送信 
$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, 'https://api.freee.co.jp/oauth/token'); 
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $params); 
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl, CURLOPT_HEADER, true); 

//アクセストークンの取得
$response = curl_exec($curl); 
$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE); 
$header = substr($response, 0, $header_size); 
$body = substr($response, $header_size); 
$result = json_decode($body, true); 

$access_token = $result['access_token']; 
print_r($access_token); //テスト用に表示

 

VBA

取得した認証コードを用いてVBAでリクエスト送信、レスポンスボディのアクセストークンを取得するまでのテストコードです。 APP_ID、CALLBACK_URL、SECRET、AUTH_CODEについてはお客様の環境のものに置き換えて用いてください。

'URLエンコード用ファンクション
Public Function UrlEncode(mySource As Variant) As String
 Dim objSC As Object
 Set objSC = CreateObject("ScriptControl")
 objSC.Language = "JScript"
 UrlEncode = objSC.CodeObject.encodeURIComponent(mySource)
 Set objSC = Nothing
End Function
----------------------------------------------------------
'連携アプリ情報
Dim APP_ID: APP_ID = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Dim SECRET: SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Dim CALLBACK_URL: CALLBACK_URL = "XXXXXXXXXXXXXXXXXXXXXXXX"
Dim AUTH_CODE: AUTH_CODE = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 

'リクエスト先URLとリクエストボディ
Dim url_api: url_api = "https://api.freee.co.jp/oauth/token"
Dim request_body: request_body = "grant_type=authorization_code" & "&client_id=" & APP_ID & "&client_secret=" & SECRET & "&code=" & AUTH_CODE & "&redirect_uri=" & UrlEncode(CALLBACK_URL)
 
'レスポンスとトークンを格納する変数を宣言
Dim js As String
Dim AccessToken As String
Dim RefreshToken As String

'tokenのPOSTリクエストを送信
 With CreateObject("MSXML2.XMLHTTP")
 .Open "POST", url_api, False
 .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
 .send request_body
 js = .responseText
 End With

'レスポンスからアクセストークン、リフレッシュトークンを取得
js = "(" & js & ")"
With CreateObject("ScriptControl")
 .Language = "JScript"
 AccessToken = .CodeObject.eval(js).access_token
 RefreshToken = .CodeObject.eval(js).refresh_token
End With

 

Google Apps Script(GAS)

GASでAPI認証からアクセストークンの取得するまでのテストコードです。 APP_ID、SECRET、CALLBACK_URLについてはお客様の環境のものに置き換えて用いてください。 ※freeeにアプリ登録をする際のCALLBACK_URLには「https://script.google.com/macros/d/{スクリプト ID}/usercallback」を用いてください ※OAuth2認証用に外部のライブラリを参照しています

/*
***********************************************************************************
参照ライブラリ
title               |OAuth2
project_key  |1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF
***********************************************************************************
*/

//連携アプリ情報(Googleスプレッドシートサンプルファイル)
var APP_ID = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

// 認証のエンドポイントとなるダイアログ
function alertAuth() {
  var service = getService();
  var authorizationUrl = service.getAuthorizationUrl();
  var template = HtmlService.createTemplate('認証. ');
  template.authorizationUrl = authorizationUrl;
  var page = template.evaluate();
  SpreadsheetApp.getUi().showModalDialog(page, "認証が必要です");
}

//freeeAPIのサービスを取得
function getService() {
  return OAuth2.createService('freee')
      .setAuthorizationBaseUrl('https://secure.freee.co.jp/oauth/authorize')
      .setTokenUrl('https://api.freee.co.jp/oauth/token')
      .setClientId(APP_ID)
      .setClientSecret(SECRET)
      .setCallbackFunction('authCallback')
      .setPropertyStore(PropertiesService.getUserProperties())
}

//認証コールバック(アクセストークンの取得)
function authCallback(request) {
  var service = getService();
  var isAuthorized = service.handleCallback(request);
  var access_token = service.getAccessToken();

  if (isAuthorized) {
    return HtmlService.createHtmlOutput('認証に成功しました。タブを閉じてください。');
  } else {
    return HtmlService.createHtmlOutput('認証に失敗しました。タブを閉じてください。');
  }
}