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

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

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

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

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

認可コードを取得する

  1. 認可用URLを以下の画面で確認します。
    Top > アプリ管理 > アプリ詳細 「一般設定」タブ
  2. 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'
    
    1. リクエストレスポンスからアクセストークンを取得する
      リクエストが成功すると以下のようなレスポンスが戻ります。レスポンスの中からアクセストークン、リフレッシュトークンを取得します。

      
      {
        "access_token": "${access_token}",
        "token_type": "bearer",
        "expires_in": 86400,
        "refresh_token": "${refresh_token}",
        "scope": "read write"
      }
      
    2. リフレッシュトークンを用いてアクセストークンを取得する
      初回は認可コードからアクセストークンを取得しましたが、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リクエストを行いましょう。