Migrate an API key integration to a private app

ご使用のアカウントで、APIキーの無効化に関するバナーが表示される場合は、次の内容をご確認ください。

  • 開発者APIキーは、標準のHubSpot APIキーとは別のものであり、非推奨になることはありません。開発者APIキーは、Webhook APIサブスクリプションやタイムラインイベントAPIイベントタイプなど、HubSpotアプリに関連する設定を管理するために使用されます。

HubSpot APIキーを使用する内部連携を構築した場合、APIキーは全てのHubSpot CRMデータに対する読み取りアクセス権と書き込みアクセス権の両方を提供しますが、APIキーが侵害された場合にセキュリティーリスクが発生する可能性があります。非公開アプリに移行することにより、連携で必要とされる特定のスコープを認証できます。スコープを認証すると、アクセストークンが生成されます。このトークンは、連携でアカウント内のリクエストや変更を行うことが可能なデータを制限します。

既存のAPIキー連携を非公開アプリに移行するには、次の手順に従います。本番環境で変更する前に、まず開発者テストアカウントサンドボックスアカウントなどのテスト環境を使用することをお勧めします。アプリの移行に関して質問がある場合は、開発者コミュニティー(英語)をご覧ください。 

また、以下のHubSpot開発者向け動画で、APIキー連携を非公開アプリに移行する手順をご確認いただけます(英語)。

このガイドの内容

注:非公開アプリでは、Webhookおよび特定の種類の拡張機能はサポートされません。既存の連携でこれらの機能のいずれかを使用している場合は、代わりにOAuthを使用する公開アプリを作成する必要があります。

新しい非公開アプリを作成する

  • HubSpotアカウントにて、メイン ナビゲーション バーにある設定アイコンをクリックします。
  • 左のサイドバーメニューで、[連携]>[非公開アプリ]の順に進みます。
  • [非公開アプリを作成]をクリックします。
  • [基本情報]タブで、アプリの詳細を設定します。
    • アプリの名前を入力します。
    • プレースホルダーロゴの上にカーソルを合わせると表示されるアップロードアイコンをクリックして、アプリのロゴとして使用する正方形の画像をアップロードします。
    • アプリの説明を入力します。
  • [スコープ]タブをクリックします。
  • 次に、連携で使用しているAPIに基づいて、認証するスコープを選択します。アプリに必要なスコープを見つけるには、次の手順に従います。
    • 既存の連携で使用しているHubSpot APIのリストを作成します。
    • APIリクエストごとに、関連する開発者ドキュメント(コンタクトAPIなど)に移動します。
    • [エンドポイント]タブをクリックし、連携で使用しているエンドポイントまでスクロールします。
    • [必要な条件]セクションで、エンドポイントを使用するために必要なスコープを見つけます。可能な場合は常に、[標準スコープ]に表示されているスコープではなく、[詳細スコープ]に表示されているスコープを選択してください。きめ細かいスコープがない場合は、標準スコープを使用してください。locate-scope-in-endpoints-tab-for-private-app-migration
    • 非公開アプリの設定に戻り、一致するスコープの横にある[読み取り]または[書き込み]チェックボックスをオンにします。[スコープを検索]検索バーを使用してスコープを探すこともできます。select-matching-scope-for-private-app
  • スコープの選択が完了したら、右上の[アプリを作成]をクリックします。アプリの作成後は、いつでもアプリに変更を加えることができます。
  • ダイアログボックスで、アプリのアクセストークンの情報を確認してから、[作成を続行]をクリックします。

非公開アプリを作成したら、そのアクセストークンを使用してAPIリクエストを開始できます。非公開アプリの設定ページの[詳細]タブで、アクセストークンの下の[トークンを表示]をクリックすると、トークンが表示されます。

show-private-app-access-token-migration-guide

連携のAPIリクエストの認証方式を更新する

hapiKeyクエリーパラメーターを使用してAPIリクエストを行う代わりに、リクエストのAuthorizationヘッダーに非公開アプリのアクセストークンを含めます。リクエストを行うときは、Authorizationヘッダーの値をBearer YOUR_ACCESS_TOKENに設定します。特に明記されている場合を除き、この認証方式は、HubSpotのレガシー開発者ドキュメント(英語)に記載されているレガシーAPIを含む、全てのパブリックAPIエンドポイントに対応しています。

リクエストは次のようになります。

axios.get('https://api.hubapi.com/crm/v3/objects/contacts', { headers: { 'Authorization': `Bearer ${YOUR_ACCESS_TOKEN}`, 'Content-Type': 'application/json' } }, (err, data) => { // Handle the API response } );$headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . YOUR_ACCESS_TOKEN, ]; $curl = curl_init(); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_URL, 'https://api.hubapi.com/crm/v3/objects/contacts'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $contacts = curl_exec($curl); curl_close($curl); var_dump($contacts);require 'uri' require 'net/http' require 'openssl' url = URI("https://api.hubapi.com/crm/v3/objects/contacts") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE request = Net::HTTP::Get.new(url) request['content-type'] = 'application/json' token = 'YOUR_ACCESS_TOKEN' request['authorization'] = "Bearer #{token}" response = http.request(request) puts response.read_bodyimport requests url = "https://api.hubapi.com/crm/v3/objects/contacts" headers = { 'content-type': 'application/json', 'authorization': 'Bearer %s' % YOUR_ACCESS_TOKEN } response = requests.request("GET", url, headers=headers) print(response.text)

非公開アプリのアクセストークンはOAuthを基盤として実装されているため、HubSpotのクライアントライブラリーを使用して、アクセストークンによる認証済みの呼び出しを行うこともできます。例えば、Node.jsクライアントライブラリー(英語)を使用する場合は、アプリのアクセストークンを渡すことにより、OAuthクライアントをインスタンス化できます。 

const hubspotClient = new hubspot.Client({ accessToken: YOUR_ACCESS_TOKEN }); $hubSpot = \HubSpot\Factory::createWithAccessToken('access-token'); $response = $hubSpot->crm()->contacts()->basicApi()->getPage();# Load the gem require 'hubspot-api-client' # Setup client client = Hubspot::Client.new(access_token: 'YOUR_ACCESS_TOKEN') # Get contacts contacts = client.crm.contacts.basic_api.get_pagefrom hubspot import HubSpot api_client = HubSpot(access_token='YOUR_ACCESS_TOKEN') api_client.crm.contacts.get_page()

非公開アプリへの移行を完了するには、コードからHubSpot APIキーへの参照を全て削除し、代わりに上記の方法に従って非公開アプリのアクセストークンを使用します。リクエストにトークンをハードコーディングするのではなく、実行するリクエストに応じて、トークンを格納するシークレットを作成します。シークレットを使用すると、サーバーレス関数でトークンを使用するときなどに、トークンが公開されることを防止できます。アクセストークンをシークレットとして格納するには、次の手順に従います。

  • ターミナルで、hs secrets add secretNameを実行します。シークレットの名前は、後で簡単に参照できるように、シンプルなものにすることをお勧めします。
  • アクセストークンをターミナルに貼り付けて、Enterキーを押します。

この時点で、環境変数としてシークレットにアクセスできるようになります。詳しくは、後述のサーバーレス関数の例をご確認ください。

APIキーへの参照が全て削除されたことを確認するには、HubSpotアカウントのコールログをチェックします。

  • HubSpotアカウントで、メイン ナビゲーション バーにある設定アイコンをクリックします。
  • 左のサイドバーで、[連携]>[APIキー]の順に進みます。
  • [コールログ]タブで最近のリクエストをチェックし、非公開アプリのアクセストークンを使用するために以前の参照を全て削除してから、リクエストが実行されていないことを確認します。

check-api-key-call-log-after-migration

マーケティングコンタクトを含む有料のMarketing Hubアカウントをご利用中で、以前にAPIキーを使用して、連携によって作成されたコンタクトをマーケティングコンタクトとして設定している場合は、非公開アプリについても同じ操作を行う必要があります。

  • HubSpotアカウントにて、メイン ナビゲーション バーにある設定アイコンをクリックします。
  • 左のサイドバーで、[連携]>[マーケティングコンタクト]の順に進みます。
  • [接続されたアプリ]の下で、検索バーを使用して非公開アプリを見つけて、[コンタクトをマーケティングコンタクトとして同期するにはオンにします]スイッチをクリックしてオンにします。

set-private-app-contacts-as-marketing-contacts

非公開アプリの設定が完了し、コードのAPIキーへの参照が全て削除されたことを確認したら、キーを無効化できます。

リクエストを検証し、ログを監視する

コードからHubSpot APIキーへの参照を全て削除し、それらを非公開アプリのアクセストークンへの参照に置き換えたら、それ以上のコードの変更は不要です。

開発者テストアカウントまたはサンドボックスアカウントで上記の手順を実施したら、本番アカウントで同じプロセスを再現します。次に、非公開アプリのAPIコールログを監視し、アプリの全てのリクエストが400エラーを返していないことを確認します。

  • HubSpotアカウントにて、メイン ナビゲーション バーにある設定アイコンをクリックします。
  • 左のサイドバーメニューで、[連携]>[非公開アプリ]の順に進みます。
  • 非公開アプリの名前をクリックします。
  • [ログ]タブをクリックします。
  • スコープが不十分なために失敗したAPIリクエストについては、403エラーが表示されます。連携のランタイムログにアクセスする場合は、対応するAPIリクエストに対するレスポンスに、不足しているスコープの詳細を示すエラーメッセージが含まれている必要があります。

403-error-after-private-app-migration

  • 非公開アプリに新しいスコープを含める必要がある場合は、次の手順に従います。
    • [詳細]タブをクリックします。
    • [詳細を編集]をクリックします。
    • ページの最上部にある[スコープ]をクリックします。
    • 不足しているスコープの横のチェックボックスを全てオンにしたら、右上の[変更をコミット]をクリックします。

select-missing-scopes-private-app-migration

非公開アプリの作成と管理、および非公開アプリの制限については、非公開アプリのガイドをご確認ください。

実装の例

以下では、一般的なAPIキーの使用方法と、APIキーを非公開アプリのアクセストークンに移行する方法について詳しく説明します。

サーバーレス関数

サーバーレス関数でAPIキーを使用している場合は、上記と同様に、非公開アプリのアクセストークンを認証に使用できます。関数が実行する必要のあるスコープが非公開アプリに存在することを確認してください。 

非公開アプリのアクセストークンを使用してサーバーレス関数を認証するには、次の手順に従います。

  • 「アクセストークン」カードで、[トークンを表示]をクリックしてアクセストークンを表示します。次に、[コピー]をクリックして、トークンをクリップボードにコピーします。
    show-private-app-access-token-1
  • アクセストークンをコピーした状態のまま、そのトークンを保存するための新しいシークレットを作成します。
    • ターミナルで、hs secrets add secretNameを実行します。シークレットの名前は、後で簡単に参照できるように、シンプルなものにすることをお勧めします。
    • アクセストークンをターミナルに貼り付けて、Enterキーを押します。
  • サーバーレス関数のserverless.jsonファイルで、secrets配列にシークレット名を追加します。
// example serverless.json file { "runtime": "nodejs18.x", "version": "1.0", "secrets": ["secretName"], "endpoints": { "getPrompts": { "method": "GET", "file": "serverlessFunction.js" } } }
  • サーバーレス関数のJavaScriptファイルで、Authorizationヘッダーの値をBearer secretNameに設定します。例えば、Node.jsとaxiosを使用してコンタクトAPIを呼び出す場合、リクエストは次のようになります。
// example serverless function const axios = require('axios'); exports.main = (context, sendResponse) => { axios.get(`https://api.hubapi.com/crm/v3/objects/contacts`, { headers: { 'Authorization': `Bearer ${process.env.secretName}`, 'Content-Type': 'application/json' } } ) sendResponse({statusCode: 200}); };

1回限りのジョブ

プロパティーの作成のような1回限りのジョブを実行するためにAPIキーを使用している場合は、代わりに非公開アプリを作成して、そのアクセストークンでコールを認証できます。非公開アプリを作成すると、非公開アプリに適切なスコープが設定されている限り、そのアクセストークンを任意の1回限りのジョブで再利用できます。非公開アプリのスコープは、HubSpotの非公開アプリの設定から、いつでも更新できます。または、非公開アプリを削除して、実行する必要があるジョブ専用の新しい非公開アプリを作成することもできます。

private-app-edit-scopes

カスタムオブジェクトの作成

APIキーを使用してカスタムオブジェクトを作成する代わりに、非公開アプリを作成して、そのアクセストークンでコールを認証できます。ただし、必要なスコープが非公開アプリに含まれていることが条件となります。例えば、Postmanを使用してカスタムオブジェクトを作成する場合は、認証タイプをBearerトークンに設定し、[トークン]フィールドにトークンを入力します。

postman-private-app-access-token-field

非公開アプリを使用したカスタムオブジェクトの作成に関する詳細はHubSpotの開発者ブログ(英語)をご覧ください。

カスタム コード ワークフロー アクション

「カスタムコード」ワークフローアクションでAPIキーを使用している場合は、代わりに非公開アプリのアクセストークンを使用できます。ただし、必要なスコープが非公開アプリに存在することが条件となります。更新するには、ワークフローエディターでカスタムアクションを開き、次の変更を行います。

const hubspotClient = new hubspot.Client({ accessToken: process.env.secretName });

参考になりましたか?
こちらのフォームではドキュメントに関するご意見をご提供ください。HubSpotがご提供しているヘルプはこちらでご確認ください。