> ## 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 アーキテクチャシナリオにおけるアプリケーション実装

# アプリケーション実装（サーバーアプリ + API）

このチュートリアルのこのセクションでは、API と、それに関連するマシン間アプリケーションを詳しく見ていきます。最初から確認するには、[Server Applications with API](/ja/docs/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 のタイムシート API では、タイムシートエントリを作成するためのエンドポイントを設定する必要があります。

| HTTP method | API endpoint         | Description         |
| ----------- | -------------------- | ------------------- |
| `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](/ja/docs/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="/ja/docs/glossary?term=access+token">アクセストークン</Tooltip> に何らかの問題がある場合 (またはまったく指定されていない場合) 、API アプリケーションは `HTTP 401 Unauthorized` ステータスコードを含むレスポンスを返します。

**実装については** [**Node.js**](/ja/docs/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 を呼び出すプロセスに新しいタイムシートエントリを投稿する権限があることは、まだ確認できていません。

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

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

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

<div id="implement-the-machine-to-machine-application">
  ### マシン間アプリケーションを実装する
</div>

このセクションでは、このシナリオ向けのマシン間アプリケーションを実装する方法を説明します。

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

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

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

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

実装では、次の形式のペイロードを指定して、`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}"
}
```

詳しくは、[Client Credentials フローを使用して API を呼び出す](/ja/docs/get-started/authentication-and-authorization-flow/client-credentials-flow/call-your-api-using-the-client-credentials-flow)を参照してください。

**実装例は** [**Python**](/ja/docs/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**](/ja/docs/get-started/architecture-scenarios/server-application-api/cron-implementation-python#invoke-the-api) **を参照してください。**
