> ## Documentation Index
> Fetch the complete documentation index at: https://docs-dev-eval-flywheel-swift-quickstart.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

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

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

このシュートリアルのセクションでは、APIとそれに関連するマシンツーマシンアプリケーションについて掘り下げてみたいと思います。最初から始めたい方は、「[APIを使用したサーバーアプリケーション](/docs/ja-jp/get-started/architecture-scenarios/server-application-api)」をお読みください。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  分かりやすくするために、実装では認証と認可に焦点をあてています。サンプルからも分かるとおり、入力のタイムシートエントリーはハードコードされるため、APIはタイムシートエントリーを保持しません。代わりに、情報の一部をエコーバックします。
</Callout>

## APIエンドポイントを定義する

**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`ステータスコードともに、JSONオブジェクトを含んだボディーを返します。この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>

### APIエンドポイントを保護する

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

すべての条件が満たされると、APIアプリケーションは前に述べたメッセージで応答します。提供されたアクセストークンに問題がある（またはまったく提供されていない）場合は、APIアプリケーションが`HTTP 401 Unauthorized`ステータスコードを送信します。

[**Node.js** ](/docs/ja-jp/get-started/architecture-scenarios/server-application-api/api-implementation-nodejs#2-secure-the-api-endpoint)**での実装を参照してください。**

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

アプリケーションのサンプル実装を使うことなくアクセストークンを取得するには、以下のペイロードでAuth0 Authentication APIの[トークン取得](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}"
}
```

## アプリケーションの権限を確認する

アクセストークンでAPIのエンドポイントはセキュリティ保護されましたが、APIを呼び出すプロセスに新しいタイムシートのエントリをPOSTする権限があるかは未確認のままです。

前述のように、それぞれのアクセストークンには、アプリケーションに付与されたアクセス権限のリストが含まれます。これらの権限は、`scope`要求パラメーターを使って定義されます。これを構成する方法については、「[スコープを構成する](/docs/ja-jp/get-started/architecture-scenarios/server-application-api/part-3#configure-the-scopes)」記述のある段落をお読みください。

エンドポイントには、`batch:upload`スコープが必要です。

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

### マシンツーマシンアプリケーションを実装する

このセクションでは、シナリオでマシンツーマシンアプリケーションを実装する方法について説明します。

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

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

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

* **Domain（ドメイン）** ：Auth0ドメイン（テナント識別子でもある）です。この値は、APIのURL「`https://{yourTenant}/oauth/token`」の一部になります。
* **<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=audience" tip="オーディエンス: 発行されたトークンに対するオーディエンスを表す一意の識別子。トークンでaudという名前が付けられ、その値にはIDトークンの場合はアプリケーション（Client ID）、アクセストークンの場合はAPI（API Identifier）のいずれかのIDが含まれます。" cta="用語集の表示">Audience</Tooltip>（オーディエンス）** ：API識別子です。
* **<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-4" href="/docs/ja-jp/glossary?term=client-id" tip="クライアントID: Auth0から登録されたリソースに与えられる識別値。" cta="用語集の表示">Client ID</Tooltip>（クライアントID）** ：Auth0アプリケーションのクライアントIDです。
* **<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-2" href="/docs/ja-jp/glossary?term=client-secret" tip="クライアントシークレット: クライアント（アプリケーション）が認可サーバーで認証するために使用するシークレット。これはクライアントと認可サーバーだけが知っているものであり、推測できないように十分にランダムである必要があります。" cta="用語集の表示">Client Secret</Tooltip>（クライアントシークレット）** ：Auth0アプリケーションのクライアントシークレットです。

実装では、以下ような形式のペイロードを使って、`POST`操作を`https://{yourDomain}/oauth/token`エンドポイントに対して行います。

```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)の実装を参照してください。

## APIを呼び出す

有効なスコープのあるアクセストークンを取得したら、APIを呼び出すことができます。

そのためには、以下を行います。

* コードに埋め込まれたタイムシートエントリをJSON形式で構築する
* アクセストークンを`Authorization`ヘッダーとして要求に追加する
* HTTP `POST`要求を行う
* 応答を解析し、ターミナルに出力する（任意）

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