> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Server + API アーキテクチャシナリオ向けのアプリケーション実装

# アプリケーション実装（Server Apps + API）

このチュートリアルのこのセクションでは、API とそれに関連する Machine-to-Machine Application について詳しく見ていきます。最初から確認するには、[Server Applications with API](/docs/ja-jp/get-started/architecture-scenarios/server-application-api) をお読みください。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  簡単にするため、この実装では認証と認可のみに絞っています。サンプルで示すように、入力する タイムシート エントリ はハードコードされており、API でもその タイムシート エントリ は永続化されません。代わりに、情報の一部をそのまま返すだけです。
</Callout>

<div id="define-the-api-endpoints">
  ## API エンドポイントを定義する
</div>

**API エンドポイント** は、リソース (データの集合) を表す静的な URI です。

たとえば、レストラン向けの API には `/orders` や `/customers` といったエンドポイントがあるかもしれません。この API に接続するアプリケーションは、対応する HTTP メソッド (`POST`、`GET`、`PUT`、`PATCH`、または `DELETE`) で API エンドポイントを呼び出すことで、CRUD (作成、読み取り、更新、削除) 操作を実行できます。

ExampleCo の Timesheets API では、タイムシートのエントリを作成するためのエンドポイントを設定する必要があります。

| HTTP メソッド | API エンドポイント          | 説明                   |
| --------- | -------------------- | -------------------- |
| `POST`    | `/timesheets/upload` | 新しいタイムシート エントリを作成します |

```json lines theme={null}
{
  'user_id': '007',
  'date': '2017-05-10T17:40:20.095Z',
  'project': 'StoreZero',
  'hours': 5
}
```

API がリクエストを正常に処理すると、`HTTP 201 Created` ステータスコードのレスポンスが返され、本文には新しく作成されたタイムシートを説明する message プロパティを持つ JSON オブジェクトが含まれます。

```json lines theme={null}
{
"message": "Created timesheet 14 for employee 007."
}
```

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  [Node.js](/docs/ja-jp/get-started/architecture-scenarios/server-application-api/api-implementation-nodejs#1-define-the-api-endpoint) での実装を参照してください。
</Callout>

<div id="secure-the-api-endpoints">
  ### APIエンドポイントを保護する
</div>

APIエンドポイントを保護するには、トークンを処理するミドルウェア関数をAPIアプリケーションに実装する必要があります。この関数は、APIリクエストにトークンが含まれているかを確認し、トークンを検証したうえで、要求された操作の実行に必要なスコープが含まれているかを確認します。

すべての条件が満たされると、APIアプリケーションは前述のメッセージを返します。指定された<Tooltip tip="アクセストークン: APIにアクセスするために使用される認可資格情報で、不透明文字列またはJWTの形式を取ります。" cta="用語集を見る" href="/docs/ja-jp/glossary?term=access+token">アクセストークン</Tooltip>に何らかの問題がある場合 (またはまったく指定されていない場合) 、APIアプリケーションは`HTTP 401 Unauthorized`ステータスコードのレスポンスを返します。

**実装例は** [**Node.js**](/docs/ja-jp/get-started/architecture-scenarios/server-application-api/api-implementation-nodejs#2-secure-the-api-endpoint)**をご覧ください。**

<div id="get-an-access-token">
  #### アクセストークンを取得する
</div>

アプリケーションサンプルの実装を使用せずにアクセストークンを取得するには、以下のペイロードを指定して Auth0 Authentication API の [Get Token](https://auth0.com/docs/api/authentication#get-token54) エンドポイントを呼び出します。

```json lines theme={null}
{
  audience: "{yourApiIdentifier}",
  grant_type: "client_credentials",
  client_id: "${account.client_id}",
  client_secret: "${account.client_secret}"
}
```

<div id="check-the-application-permissions">
  ## アプリケーションの権限を確認する
</div>

これで、アクセストークン を使用して API の エンドポイント は保護されましたが、API を呼び出すプロセスに新しい タイムシート エントリ を投稿する権限があることまでは、まだ確認できていません。

前述のとおり、各 アクセストークン には、アプリケーションに付与された permissions の一覧を含めることができます。これらの permissions は、`scope` リクエストパラメータで定義します。設定方法については、[Configure the Scopes](/docs/ja-jp/get-started/architecture-scenarios/server-application-api/part-3#configure-the-scopes) の段落を参照してください。

この エンドポイント では、scope `batch:upload` を必須とします。

**実装については** [**Node.js**](/docs/ja-jp/get-started/architecture-scenarios/server-application-api/api-implementation-nodejs#3-check-the-client-permissions) **を参照してください。**

<div id="implement-the-machine-to-machine-application">
  ### Machine-to-Machine Application を実装する
</div>

このセクションでは、このシナリオ向けに Machine-to-Machine Application を実装する方法を見ていきます。

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

まず、Auth0 `/oauth/token` APIエンドポイントを呼び出して、アクセストークンを取得します。

そのためには、[アプリケーション設定](https://manage.auth0.com/#/applications)で確認できる以下の設定値が必要です。

* **Domain**: Auth0 Domain であり、テナント識別子でもあります。この値は API URL の一部となります: `https://{yourTenant}/oauth/token`。
* **<Tooltip tip="Audience: 発行されるトークンの対象を一意に識別する値です。トークン内では aud という名前で表され、その値には ID Token の場合はアプリケーション（Client ID）の ID、Access Token の場合は API（API Identifier）の ID が含まれます。" cta="用語集を見る" href="/docs/ja-jp/glossary?term=Audience">Audience</Tooltip>**: API 識別子。
* **<Tooltip tip="Client ID: 登録されたリソースに Auth0 から付与される識別値です。" cta="用語集を見る" href="/docs/ja-jp/glossary?term=Client+ID">Client ID</Tooltip>**: Auth0 アプリケーションの Client ID。
* **<Tooltip tip="Client Secret: クライアント（アプリケーション）が Authorization Server に対して認証を行うために使用する秘密情報です。これはクライアントと Authorization Server だけが知っている必要があり、推測できないよう十分にランダムでなければなりません。" cta="用語集を見る" href="/docs/ja-jp/glossary?term=Client+Secret">Client Secret</Tooltip>**: Auth0 アプリケーションの Client Secret。

実装では、次の形式のペイロードを指定して、`https://{yourDomain}/oauth/token` エンドポイントに対して `POST` リクエストを実行する必要があります。

```json lines theme={null}
{
  "audience": "{yourApiIdentifier}",
  "grant_type": "client_credentials",
  "client_id": "${account.client_id}",
  "client_secret": "${account.client_secret}"
}
```

詳しくは、[クライアントクレデンシャルフローを使用して API を呼び出す](/docs/ja-jp/get-started/authentication-and-authorization-flow/client-credentials-flow/call-your-api-using-the-client-credentials-flow)を参照してください。

**実装例は** [**Python**](/docs/ja-jp/get-started/architecture-scenarios/server-application-api/cron-implementation-python#get-an-access-token) **をご覧ください。**

<div id="invoke-the-api">
  ## APIを呼び出す
</div>

有効なスコープを含むアクセストークンを取得できたので、APIを呼び出せます。

そのために、次の手順を行います。

* JSON形式で、ハードコードされたタイムシート エントリを作成します。
* リクエストの `Authorization` ヘッダーにアクセストークンを追加します。
* HTTP `POST` リクエストを送信します。
* レスポンスを解析し、ターミナルに出力します (任意) 。

**実装については** [**Python**](/docs/ja-jp/get-started/architecture-scenarios/server-application-api/cron-implementation-python#invoke-the-api) **を参照してください。**
