最初の Google Health API 呼び出しを行う

1. はじめに

Visual Studio Code(VS Code)と Huachao Mao 氏の Rest Client 拡張機能を使用すると、Google OAuth 同意フローと Google Health API をテストできます。この Codelab では、Rest Client 拡張機能を設定する方法、認可フローを開始する方法、Google Health API エンドポイントの 1 つに最初の呼び出しを行う方法について説明します。その後、Rest Client のドキュメントと Fitbit のドキュメントを参照して、HTTP プロジェクトの他のエンドポイントを作成できます。

VS Code と Rest Client を使用しない場合は、curl コマンドで API 呼び出しを行うことができます。

学習内容

  • Rest Client 拡張機能を使用して VS Code を設定する方法。
  • Google Cloud コンソールでクライアント ID を設定する方法。
  • Google OAuth 2.0 認可フローを実行して、アクセス トークンと更新トークンを取得する方法。
  • Rest Client を使用して Google Health API エンドポイントを呼び出す方法。

必要なもの

Fitbit モバイルアプリを設定するには:

  1. Apple App Store または Google Play ストアで Fitbit モバイルアプリを検索してダウンロードします。
  2. アプリアイコンを選択します。
  3. [Google でログイン] をクリックします。
  4. Google アカウントを選択し、[続行] ボタンを押します。

Visual Studio ツールをインストールするには:

  1. VS Code をダウンロードします。通常、ダウンロードには実行可能ファイルが含まれています。
  2. VS Code を起動します。
  3. Huachao Mao 氏の Rest Client 拡張機能をインストールします。
    • IDE の左側にある拡張機能アイコン 拡張機能 をクリックします。
    • REST Client by Huachao Mao」を検索し、[インストール] を押します。

2. Google Cloud プロジェクトを設定する

Google Cloud コンソールを使用してクライアント ID を作成し、Google Health API の使用を有効にします。

  1. Google Cloud コンソールにログインします。
  2. 新しいプロジェクトを作成するには:
    1. プロジェクト選択ツールで [プロジェクトを選択] をクリックします。
    2. 右上の [新しいプロジェクト] を選択します。
    3. プロジェクト名 を入力します。
    4. ロケーション を入力します(例: 「組織なし」)。
    5. [作成] ボタンをクリックします。
    6. プロジェクトを選択します。

Google Health API を有効にする

  1. 左上のメニュー アイコン メニュー をクリックします。
  2. [API とサービス] > [ライブラリ] を選択します。
  3. 「Google Health API」を検索して有効にします。

OAuth 認証情報を設定する

Google Cloud コンソールにログインしていない場合は、Google Cloud コンソールに移動します。

  1. 左上のメニュー アイコン メニュー をクリックします。
  2. [API とサービス] > [認証情報] を選択します。
  3. 中央上部で、[+ 認証情報を作成] > [OAuth クライアント ID] を選択します。
  4. [同意画面を構成] ボタンをクリックします。「Google Auth Platform はまだ構成されていません」というメッセージが表示されたら、[始める] ボタンをクリックします。
  5. セクション 1:
    1. [App name] を入力します。
    2. [User support email] を入力します。
    3. [次へ] ボタンをクリックします。
  6. セクション 2:
    1. [外部] を選択します。
    2. [次へ] ボタンをクリックします。
  7. セクション 3:
    1. [Contact Information] フィールドにメールアドレスを入力します。
    2. [次へ] ボタンをクリックします。
  8. セクション 4:
    1. チェックボックスをオンにして、Google の API サービス ユーザーデータに関するポリシー に同意します。
    2. [作成] ボタンをクリックします。
  9. [指標] セクションで、[OAuth クライアントを作成] ボタンを押します。
  10. アプリケーションの種類として [ウェブ アプリケーション] を選択します。
  11. クライアント ID の名前 を入力します。
  12. [承認済みの JavaScript 生成元] は空のままにします。
  13. [承認済みのリダイレクト URI] で、[+ URI を追加] ボタンを押します。リダイレクト URI として「https://www.google.com」と入力します。
  14. [作成] ボタンをクリックします。
  15. Google コンソールに、クライアント ID が作成されたことを示すメッセージが表示されます。[JSON をダウンロード] リンクをクリックしてクライアント ID とクライアント シークレットをダウンロードするか、値を書き留めます。後でクライアントのシークレットを復元することはできません。
  16. [OK] をクリックします。[OAuth 2.0 クライアント ID] ページに戻ります。
  17. クライアント ID がプロジェクトに追加されます。クライアント ID の URL をクリックすると、詳細が表示されます。

テストユーザーを追加する

  1. 左側のペインで [オーディエンス] を選択します。[公開ステータス] が [**テスト中**] に設定され、[ユーザータイプ] が [**外部**] に設定されていることを確認します。
  2. [テストユーザー] セクションで、[+ ユーザーを追加] ボタンをクリックします。データを取得するユーザーのメールアドレスを入力します。
  3. [保存] ボタンをクリックします。

クライアント ID にスコープを追加する

  1. 左側のペインで [データアクセス] を選択します。
  2. [スコープを追加または削除] ボタンをクリックします。
  3. [API] 列で「Google Health API」を検索します。この Codelab では、スコープ .../auth/googlehealth.activity_and_fitness.readonly を使用します。
  4. スコープを選択したら、[更新] ボタンを押して [データアクセス] ページに戻ります。
  5. [保存] ボタンをクリックします。

これでクライアント ID の設定が完了しました。

3. 認可フローを作成する

  1. マシンで VS Code アプリを開きます。
  2. ウェルカム画面で [開く] を選択します。
  3. このプロジェクトを作成するフォルダを選択し、[開く] を押します。画面は次のようになります。エクスプローラにフォルダ名またはプロジェクト名が表示されます。VSC
  4. メインメニューから [ファイル - > 新規テキスト ファイル] を選択します。
  5. ファイルに名前を付けて保存します。メインメニューから [ファイル -> 名前を付けて保存 -> Codelab.http] を選択します。これにより、ファイルがプロジェクトに配置されます。ファイルの拡張子は .http または .rest にする必要があります。この Codelab では .http を使用します。

このプロジェクトでは、複数の値を複数回使用します。値は次のとおりです。

client_id

Google コンソールのクライアント ID 値。

secret

Google コンソールのクライアントのシークレット値。

redirect_uri

認証コードを処理するアプリのエンドポイント。この Codelab では、https://www.google.com を使用します。

access_token

同意フローが完了した後にユーザー用に作成されたアクセス トークン。

refresh_token

同意フローが完了した後にユーザー用に作成された更新トークン。

このプロジェクトで使用する変数を定義する次のコードを追加します。Codelab.http ファイルの上部に配置する必要があります。client_id と secret の値を入力します。

### File Variables for the Codelab
@client_id =
@secret =
@redirect_uri = https://www.google.com
@accessToken={{user.response.body.access_token}}
@refreshToken={{user.response.body.refresh_token}}

同意フローを開始するために使用される認可 URL は、データにアクセスする各ユーザーに送信されます。認可 URL を作成するには、Google OAuth エンドポイントを把握し、クエリ パラメータを使用して、クライアント ID、アクセスするスコープ、ユーザーがスコープに同意したときにリダイレクトする場所を指定する必要があります。Google 認可文字列の作成に関する完全なドキュメントは、ドキュメントに記載されています。

Google の OAuth 2.0 エンドポイントは https://accounts.google.com/o/oauth2/v2/auth にあります。このエンドポイントには HTTPS 経由でのみアクセスできます。プレーン HTTP 接続は拒否されます。

Google 認可サーバーは、ウェブサーバー アプリケーションが認可フローをカスタマイズするための多くのクエリ文字列パラメータをサポートしています。次の必須クエリ パラメータを使用します: client_idredirect_uriresponse_typescope。ドキュメントには、すべてのクエリ パラメータとその説明のリストが記載されています。

クエリ パラメータの値は次のとおりです。

client_id

Google コンソールのクライアント ID 値

redirect_uri

認可コードを処理するアプリのエンドポイント。この Codelab では、https://www.google.com を使用します。

response_type

code(ウェブアプリでサポートされている値)

scope

スコープは、Google コンソールから取得され、https://www.googleapis.com の後にスコープ名が続きます。例: https://www.googleapis.com/auth/googlehealth.activity_and_fitness。

複数のスコープをリクエストするには、スコープ パラメータにすべてのスコープをスペースで区切って含めます(例: scope1 scope2 scope3)。URL の一部である場合、スペースは URL エンコードする必要があります(例: %20)。

変数の後に、次のように認可 URL を記述します。プロジェクトの上部で定義されたパラメータは、認可文字列では使用できません。そのため、client_idredirect_uri の値を含める必要があります。文字列 client-id をクライアント ID に置き換えます。

### Google Health API Rest Client Example

### Authorization String
https://accounts.google.com/o/oauth2/v2/auth?client_id=client-id&redirect_uri=https://www.google.com&response_type=code&access_type=offline&scope=https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly

ユーザーが同意すると、Google は認可コードを提供します。この認可コードは、Google のトークン エンドポイントを呼び出してアクセス トークンと交換します。トークン エンドポイントを呼び出す次の定義を、認可文字列の下の Codelab.http に追加します。次のステップで、authorization-code を認証コードに置き換えます。

### AUTHORIZATION ENDPOINTS
######################################################################
# @name user
POST https://oauth2.googleapis.com/token
Content-Type: application/x-www-form-urlencoded

code=authorization-code&client_id={{clientId}}&client_secret={{secret}}&redirect_uri={{redirect_uri}}&grant_type=authorization_code

@name user は、アクセスしているデータの現在のユーザーを参照します。

4. アカウントを認可してトークンを取得する

認可フローに沿って、認可トークンを取得します。

Codelab.http の認可文字列は、Google のブラウザベースの同意フローを開始するために使用されます。Rest Client 拡張機能では、この URL の [リクエストを送信] リンクが表示されることがあります。この特定の URL には [リクエストを送信] を使用しないでください。代わりに、ブラウザにコピーして貼り付けるか、VS Code で Ctrl+クリック (Windows/Linux)または Cmd+クリック (Mac)を使用してデフォルトのブラウザで開きます。

https://accounts.google.com/o/oauth2/v2/auth?client_id=client-id&redirect_uri=https://www.google.com&response_type=code&access_type=offline&scope=https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly
  1. Google アカウントへのログインを求められます。[テストユーザーを追加する] セクションで構成したテストユーザー アカウントのいずれかを使用してログインする必要があります。
  2. アプリが確認されていないことを示すメッセージが表示されることがあります。これは、アプリが公開されていないためです。[続行] を押します。

未確認アプリの警告を示すスクリーンショット。

  1. 同意ページには、リクエストされているスコープが一覧表示されます。ユーザーは、このアプリと共有するスコープを選択できます。[続行] をクリックします。

リクエストされたスコープの共有に同意すると、指定した redirect_uri(この Codelab では https://www.google.com)にリダイレクトされます。Google は認証コードとその他のパラメータを redirect_uri に追加するため、ブラウザのアドレスバーの URL は次のようになります。

https://www.google.com/?code=4/0Ab32j93oyGWqaXE112sP1IKmh3kV1fE4tcHIMXYJQYWgNEtAa_0-YsfkS9Ekj3Be89u3fw&scope=https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly

認証コードは、「code=」と「&scope」の間の英数字値です。上記の例では、値は次のようになります。

4/0Ab32j93oyGWqaXE112sP1IKmh3kV1fE4tcHIMXYJQYWgNEtAa_0-YsfkS9Ekj3Be89u3fw

本番環境のアプリでは、サーバーが URL パラメータからこの値を解析します。この Codelab では、ブラウザの URL から認証コードをコピーします。

この認証コードを access_tokenrefresh_token に交換します。Codelab.http で、POST /token リクエスト本文の authorization-code をコピーした認証コードに置き換えます。

POST https://oauth2.googleapis.com/token
Content-Type: application/x-www-form-urlencoded

code=authorization-code&client_id={{client_id}}&client_secret={{secret}}&redirect_uri={{redirect_uri}}&grant_type=authorization_code

POST https://oauth2.googleapis.com/token 行のすぐ上にある [リクエストを送信] リンクをクリックします。

レスポンスは次のようになります。

{
  "access_token": "ya29.a0ATi6K2uasci7FyyIClNLtQou6z...",
  "expires_in": 3599,
  "refresh_token": "1//05EuqYpEXjJCHCgYIA...",
  "scope": "https://www.googleapis.com/auth/googlehealth.activity_and_fitness",
  "token_type": "Bearer",
  "refresh_token_expires_in": 604799
}

このレスポンスを受け取ると、Rest Client は、後続のリクエストで使用するために、Codelab.http の上部で定義された @accessToken 変数と @refreshToken 変数を自動的に入力します。

更新トークンについて

認可コードを交換すると、レスポンスには access_token に加えて refresh_token が含まれることがあります。access_token の有効期間は短く(通常は 1 時間)です。access_token の有効期限が切れた場合は、ユーザーに再度ログインまたは同意を求めることなく、refresh_token を使用して新しい access_token を取得する必要があります。これは、認可リクエストに access_type=offline を含めたためです。

レスポンスで refresh_token を受け取らない場合は、このアプリとスコープの同意をすでに付与している可能性があります。通常、更新トークンは、ユーザーがアプリに初めて同意したとき、または後続の認可でも同意画面を強制的に表示するために prompt=consent が認可 URL に追加された場合にのみ発行されます。

refresh_token の有効期間は長いですが、6 か月間使用しない場合、ユーザーがアプリへのアクセスを取り消した場合など、有効期限が切れたり無効になったりすることがあります。今後の使用に備えて、refresh_token を安全に保存する必要があります。

詳細については、アクセス トークンの更新(オフライン アクセス)をご覧ください。

5. Fitbit モバイルアプリにデータを追加する

Fitbit を初めて使用する場合は、Fitbit アカウントにクエリするデータがない可能性があります。エンドポイントの 1 つを使用してクエリできるエクササイズ ログを手動で追加します。エクササイズを手動で記録する手順は次のとおりです。

  1. デバイスで Fitbit モバイルアプリを開きます。必要に応じて Fitbit アカウントにログインします。
  2. 画面の右下にある + ボタンをタップします。
  3. [手動で記録] セクションで、[アクティビティ] をタップします。
  4. エクササイズの種類 ウォーキング を検索して選択します。
  5. 今日の開始時間 を入力します。
  6. 期間を [15 分] に変更します。
  7. 距離は [1.0 マイル] のままにします。
  8. [追加] をタップします。
  9. 画面を長押しして下にスライドし、モバイルアプリを Fitbit サーバーと同期します。指を離すと、モバイルアプリが同期されます。
  10. [アクティビティ] セクションに、手動で記録したウォーキング エントリが表示されます。ウォーキング アクティビティを示すスクリーンショット。

6. list メソッドを使用してデータを取得する

list メソッドを呼び出すには、次のコードを Codelab.http/token エンドポイントのすぐ下に追加します。

### users.dataTypes.dataPoints
#####################################################

### LIST exercise
GET https://health.googleapis.com/v4/users/me/dataTypes/exercise/dataPoints
Authorization: Bearer {{accessToken}}
Accept: application/json

このコードは list エンドポイントを呼び出して、ユーザーが Fitbit アカウントに記録した歩数を表示します。1 分ごとの歩数がレスポンスで返されます。これは Fitbit Web API v1 Activity Intraday エンドポイントと同様です。

呼び出しを実行するには、GET エンドポイントの [リクエストを送信] リンクを押します。次のような応答が返されます。

{
  "dataPoints": [
    {
      "name": "users/2515055256096816351/dataTypes/exercise/dataPoints/8896720705097069096",
      "dataSource": {
        "recordingMethod": "MANUAL",
        "platform": "FITBIT"
      },
      "exercise": {
        "interval": {
          "startTime": "2026-02-23T13:10:00Z",
          "startUtcOffset": "-18000s",
          "endTime": "2026-02-23T13:25:00Z",
          "endUtcOffset": "-18000s"
        },
        "exerciseType": "WALKING",
        "metricsSummary": {
          "caloriesKcal": 16,
          "distanceMillimiters": 1609344,
          "steps": "2038",
          "averagePaceSecondsPerMeter": 0.55923407301360051,
          "activeZoneMinutes": "0"
        },
        "exerciseMetadata": {},
        "displayName": "Walk",
        "activeDuration": "900s",
        "exerciseEvents": [
          {
            "eventTime": "2026-02-23T13:10:00Z",
            "eventUtcOffset": "-18000s",
            "exerciseEventType": "START"
          },
          {
            "eventTime": "2026-02-23T13:25:00Z",
            "eventUtcOffset": "-18000s",
            "exerciseEventType": "STOP"
          }
        ],
        "updateTime": "2026-02-24T01:19:22.450466Z"
      }
    },
    {
      "name": "users/2515055256096816351/dataTypes/exercise/dataPoints/5870930690409355408",
      "dataSource": {
        "recordingMethod": "MANUAL",
        "platform": "FITBIT"
      },
      "exercise": {
        "interval": {
          "startTime": "2026-02-23T06:00:00Z",
          "startUtcOffset": "-18000s",
          "endTime": "2026-02-23T06:15:00Z",
          "endUtcOffset": "-18000s"
        },
        "exerciseType": "WALKING",
        "metricsSummary": {
          "caloriesKcal": 17,
          "distanceMillimiters": 1609344,
          "steps": "2038",
          "averagePaceSecondsPerMeter": 0.55923407301360051,
          "averageHeartRateBeatsPerMinute": "81",
          "activeZoneMinutes": "0",
          "heartRateZoneDurations": {
            "lightTime": "900s"
          }
        },
        "exerciseMetadata": {},
        "displayName": "Walk",
        "activeDuration": "900s",
        "exerciseEvents": [
          {
            "eventTime": "2026-02-23T06:00:00Z",
            "eventUtcOffset": "-18000s",
            "exerciseEventType": "START"
          },
          {
            "eventTime": "2026-02-23T06:15:00Z",
            "eventUtcOffset": "-18000s",
            "exerciseEventType": "STOP"
          }
        ],
        "updateTime": "2026-02-23T08:29:39.480437Z"
      }
    }
  ],
  "nextPageToken": ""
}

多くのエンドポイントは、フィルタリングまたはページネーション用のクエリ パラメータをサポートしています。たとえば、エクササイズはフィルタ interval.civil_start_time をサポートしています。特定の期間内のエクササイズを一覧表示するには、次のリクエストを Codelab.http に追加します。

### LIST exercise >= civil start time
GET https://health.googleapis.com/v4/users/me/dataTypes/exercise/dataPoints?filter=exercise.interval.civil_start_time >= "2026-02-22T00:00:00"
Authorization: Bearer {{accessToken}}
Accept: application/json

7. 完了

お疲れさまでした

これで基本的な Codelab は終了です。Visual Studio Code と Rest Client 拡張機能を使用して OAuth 2.0 認可をテストし、Google Health API エンドポイントを呼び出す方法を学習しました。ここから、[list メソッドを使用してデータを取得する] セクションの冒頭と同じように、追加のエンドポイントを追加できます。

Google Health API エコシステムと統合するアプリの構築をお楽しみください。詳細については、リファレンス ドキュメントで他の Google Health API エンドポイントを確認し、ウェブサーバー アプリケーション向けの Google OAuth 2.0 について詳しく学習してください。