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

アプリケーションの作成の次のステップ

ここでは「アプリケーションを作成する」で取得したClient ID/Secretを用いて、アクセストークンを取得する手順を紹介します。

freeeではOauth2.0を採用しており、この仕組みにより、アプリケーション利用者はfreeeのIDとパスワードをアプリケーションに教えることなくログイン、アプリケーションを利用することができます。

freeeではAuthorization Code Grantを推奨しています。アクセストークン取得は以下の手順にて行います。

  • ユーザーの同意を得て認可コードを取得する
  • 認可コードとclient id, client secretを利用してアクセストークンを取得する
    • あわせてリフレッシュトークンも取得できる
    • 有効期限が切れそう、切れたら)リフレッシュトークンを用いてアクセストークンを取得する
      • 認可コードの変わりにリフレッシュトークンを利用してアクセストークンの有効期限を延長できる
  • 取得している有効なアクセストークンでリソースサーバーにアクセスして必要なデータを取得する
Authorization Code Flowでのアクセストークン取得

以下で詳細なステップを見ていきましょう。

3.認可コードを取得する

認可用URLはアプリケーション利用者にアクセス権や対象のなる事業所の確認と許可を得るためのURLで、アプリケーションは認可コードを取得するためのきっかけとなる画面です。freeeアプリストアのアプリ管理画面で確認します。

Top > アプリ管理 > アプリ詳細 「基本設定」タブ

    1. コールバックURLを指定します。コールバックURLは認可コードやアクセストークンを取得できた際に情報をアプリケーションに渡す場として機能、設定します。
      1. ローカル環境 でテストなどを行う場合は`urn:ietf:wg:oauth:2.0:oob` に設定し、認可用URLにアクセスします。
      2. アプリケーションを配置しているサーバがローカル環境ではなく、例えばSpreadsheetなどの場合は必要な値を入れます。
    2. 変更して下書き保存を行うと認可用URLが変わります。

 ブラウザで認可コード取得する場合

テストを行う、フローを理解する目的の場合は、ブラウザで認可コードの取得ができます。

    1. アプリケーション利用者(freee user, リソースオーナー)が認可用URLにアクセスし、freeeのid, passwordでログインをすると、以下の画面となるので、アクセス権とアクセスする事業所を確認したのちに、アプリケーションにアクセスを許可する意思として「許可する」をクリックします。
    2. 認可コードが表示されます。

アプリケーションからredirect_uriを利用して認可コードを取得する場合

実際に業務で利用する、してもらうアプリケーションを実装する場合は以下の流れで取得します。(ログイン操作、確認についてはブラウザを利用します)

  1. 利用者がアプリケーションにアクセスしたタイミングでアクセストークンの取得ができていない場合に、アプリケーションからリダイレクトを行うことで認証用URLにアクセスするように導きます。これにより、利用者は認可エンドポイントへアクセスすることになり、上記のブラウザでアクセスする場合と同じ画面(アクセス権、アクセスする事業所)を表示することができます。
    • URLで表現すると、以下のようになります。コールバックURLはエンコードして入れます。

https://accounts.secure.freee.co.jp/public_api/authorize?response_type=code&client_id={アプリのclient_id}&redirect_uri={アプリのコールバックURL}

    • リクエストヘッダには以下を指定します。
      • Content-Type:application/x-www-form-unlencoded 
    • リクエストが成功し、利用者がログインしてアクセス権とアクセスする事業所を確認を行い許可するを押下すると、認可コードが発行されます。この時、redirect_url に指定された値によって、認可コードのレスポンス先が変わります。

  1. コールバックURLで指定した場に認可コードがレスポンスとして戻ります

HTTP/1.1 302 found Location: {アプリのコールバックURL}?code={認可コード}

4.アクセストークンを取得する

    1. Access Token URLにリクエストを送信する。
      これまでに取得したClient ID、Secret、認可コード、コールバックURL(エンコードしたもの)の4点から、アクセストークンを取得します。

       

      curl -i -X POST \
       -H "Content-Type:application/x-www-form-urlencoded" \
       -d "grant_type=authorization_code" \
       -d "client_id=アプリのClient ID" \
       -d "client_secret=アプリのClient Secret" \
       -d "code=取得した認可コード" \
       -d "redirect_uri=アプリのencodedコールバックURL" \
       'https://accounts.secure.freee.co.jp/public_api/token'
      
    2.  リクエストレスポンスからアクセストークンを取得する
      • リクエストが成功すると以下のようなレスポンスが戻ります。レスポンスの中からアクセストークン、リフレッシュトークンを取得します。
      • 取得できたアクセストークンの有効期限は24時間です。
  1.  

{
  "access_token": "アクセストークンの文字列",
  "token_type": "bearer",
  "expires_in": 86400,
  "refresh_token": "リフレッシュトークンの文字列",
  "scope": "read write"
}

リフレッシュトークンを用いてアクセストークンを取得する

初回は認可コードからアクセストークンを取得しましたが、2回目以降は認可コードの代わりに(2)で取得したリフレッシュトークンを用いてアクセストークンを取得します。リフレッシュトークンには有効期限はありません。

curl -i -X POST \
 -H "Content-Type:application/x-www-form-urlencoded" \
 -d "grant_type=refresh_token" \
 -d "client_id=あなたのClient ID" \
 -d "client_secret=あなたのClient Secret" \
 -d "refresh_token=取得したrefresh_token" \
 -d "redirect_uri=あなたのencodedコールバックURL" \
 'https://accounts.secure.freee.co.jp/public_api/token'

サンプルコード

Java

import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.JsonNode;
import com.mashape.unirest.http.Unirest;

//変数を書き換えて利用します。
String client_id = { あなたのclient_id }
String client_secret ={ あなたのClient Secret };
String redirect_uri = { あなたのencodedコールバックURL }
String code = { 取得した認可コード }
String token_url = "https://accounts.secure.freee.co.jp/public_api/token";
String access_token;
String refresh_token;

//アクセストークンを取得する。
HttpResponse response = Unirest.post(token_url)
.header("Content-Type", "application/json")
.field("grant_type", authorization_code)
.field("redirect_uri", redirect_uri)
.field("client_id", client_id)
.field("client_secret", client_secret)
.field("code", code)
.asJson();

if (response.getStatus() != 200) {
  throw new HttpException(response.getStatusText());
}

//リクエストレスポンスからアクセストークンを取得する。
response = response.getBody();
JSONArray jsonArray = response.getArray();
JSONObject jsonObject = jsonArray.getJSONObject();
access_token = jsonObject.getString("access_token");
refresh_token = jsonObject.getString("refresh_token");

//リフレッシュトークンを用いてアクセストークンを取得する。
HttpResponse response = Unirest.post(token_url)
.header("Content-Type", "application/x-www-form-urlencoded")
.body("grant_type=" + refresh_token + "&
  redirect_uri=" + redirect_uri + "&
  client_id=" + client_id + "&
  client_secret=" + client_secret + "&
  refresh_token=" + refresh_token)
.asJson();

Node.js

var request = require("request");

//変数を書き換えて利用します。
var token_url = "https://accounts.secure.freee.co.jp/public_api/token";
var redirect_uri = "あなたのencoedコールバックURL";
var client_id = "あなたのClient ID";
var client_secret = "あなたのClient Secret";
var code = "取得した認可コード";
var access_token = null;
var refresh_token = null;

//アクセストークンを取得する。
var options = {
  method: 'POST',
  url: token_url,
  headers: {
    'cache-control': 'no-cache',
    'Content-Type': 'application/json'
  },
  form: {
    grant_type: "authorization_code",
    redirect_uri: redirect_uri,
    client_id: client_id,
    client_secret: client_secret,
    code: code
  },
  json: true
};

request(options, function (error, response, body) {
  if (error) throw new Error(error);
  console.log(body);
  //リクエストレスポンスからアクセストークンを取得する。
  var response = body;
  access_token = response.access_token;
  refresh_token = response.refresh_token;
});

//リフレッシュトークンを用いてアクセストークンを取得する。
var options = {
  method: 'POST',
  url: token_url,
  headers: {
    'cache-control': 'no-cache',
    'Content-Type': 'application/x-www-form-urlencoded'
  },
  form: {
    grant_type: "refresh_token",
    redirect_uri: redirect_uri,
    client_id: client_id,
    client_secret: client_secret,
    refresh_token: refresh_token
  },
  json: true
};

request(options, function (error, response, body) {
  if (error) throw new Error(error);
  //リクエストレスポンスからアクセストークンを取得する。
  var response = body;
  access_token = response.access_token;
  refresh_token = response.refresh_token;
});

以上でアクセストークンの取得は完了です。

続いて、アクセストークンを用いてAPIのGET/POSTリクエストを行いましょう。