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

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

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

freeeではOauth2.0を採用しており、Authorization Code Grantを推奨しています。アクセストークン取得は以下の手順にて行います。

  • 認可コードを取得する
  • アクセストークンを取得する
  • リフレッシュトークンを用いてアクセストークンを取得する(2回目以降)
  • (アプリを公開する場合のみ) ユーザーのアプリ利用手順を理解する

認可コードを取得する

    1. 認可用URLをfreeeアプリストアのアプリ管理画面で確認します。
      Top > アプリ管理 > アプリ詳細 「基本設定」タブ

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

    1. コールバックURLをローカル環境 `urn:ietf:wg:oauth:2.0:oob` に設定し、認可用URLにアクセスします。
    2. 「許可する」をクリックします。
    3. 認可コードが表示されます。

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

    1. Access Token URLにリクエストを送信する。
      これまでに取得したClient ID、Secret、認可コード、encodedコールバック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時間です。

{
  "access_token": "${access_token}",
  "token_type": "bearer",
  "expires_in": 86400,
  "refresh_token": "${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リクエストを行いましょう。