# サービスとアクセストークンのサポート

> Use Access Tokens and Service Tokens to authenticate requests in Cloud Code scripts.

スクリプトでは、`context` オブジェクトは `accessToken` と `serviceToken` を提供します。

| トークンタイプ        | 発生元                                                                    | データアクセス          | 使用方法                                                                                             |
| -------------- | ---------------------------------------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------ |
| `accessToken`  | [Authentication サービス](/authentication/use-anon-sign-in.md) によって生成されます。 | 認証されたプレイヤーのみ。    | `AccessToken` は、Cloud Code 呼び出しを認証するために使用する JWT です。他の UGS サービスにトークンを渡して、認証されたプレイヤーのデータにアクセスできます。 |
| `serviceToken` | Cloud Code によって生成されます。                                                 | クロスプレイヤーデータアクセス。 | `ServiceToken` は、他の UGS サービスを呼び出し、クロスプレイヤーデータを操作するために使用するトークンです。                                 |

他の UGS サービスを呼び出す場合、これらのトークンではプレイヤーまたは Cloud Code として認証できます。

詳細については、[認証](./authentication.md) のページを参照してください。

## 概要##overview

プレイヤーと信頼されているクライアントのどちらとして認証するかを評価します。

スクリプトの `context` オブジェクトは `accessToken` と `serviceToken` を提供します。

スクリプトの目的が認証されたプレイヤーのデータにアクセスすることだけである場合は、`accessToken` を使用して、スクリプトを呼び出すプレイヤーとして認証する必要があります。これにより、プレイヤーがアクセスして操作できるのは自分のデータのみであることが保証されます。

スクリプトの目的がクロスプレイヤーデータにアクセスすることである場合は、`serviceToken` を使用して Cloud Code として認証する必要があります。これにより、スクリプトがクロスプレイヤーデータにアクセスして操作できることが保証されます。ただし、これにより穴が開けられ、悪意のあるプレイヤーがスクリプトを呼び出したり、意図していないクロスプレイヤーデータにアクセスしたりできるようになります。これを防ぐには、モジュールが [アクセス制御](./access-control.md) ルールで保護されていることを確認する必要があります。

クロスプレイヤーデータの操作方法の詳細については、[クロスプレイヤーデータ](./cross-player-data.md) のドキュメントを参照してください。

## アクセストークンのサポート##access-token-support

アクセストークンは、[Authentication サービス](/authentication/use-anon-sign-in.md) によって生成される [JWT](https://jwt.io/) です。アクセストークンを使用して、プレイヤーを認証できます。

認証されたプレイヤーが Cloud Code モジュールを呼び出す場合、アクセストークンを `context` オブジェクトの `AccessToken` プロパティとしてモジュールに渡します。

Cloud Code JavaScript SDK でアクセストークンを使用できます。他の UGS API でアクセストークンを使用するには、Authentication ヘッダーでトークンを Bearer トークンとして渡します。

設定した [アクセス制御](./access-control.md) ルールは `accessToken` に影響します。

### サポートされているサービス##supported-services

どのサービスがアクセストークンをサポートするかを確認するには、以下の表を参照してください。

| プロバイダー                    | サポートされているサービス                                                                                                          |
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| Cloud Code JavaScript SDK | Authentication サービスにオンボードされるすべての [Cloud Code JavaScript SDK](https://cloud-code-sdk-documentation.cloud.unity3d.com/)。 |
| UGS Client API            | Authentication サービスにオンボードされるすべての UGS サービス。                                                                             |
| UGS Admin API             | サポートされていません。かわりに [サービスアカウント認証](./authentication.md#cloud-code-admin-api-basic-authentication) を使用します。                  |

> **Note:**
>
> **ノート:** ほとんどの UGS サービスは Authentication サービスにオンボードされ、アクセストークンをサポートします。

### Cloud Code JavaScript SDK でのトークンの使用##use-tokens-with-cloud-code-javascript-sdks

Cloud Code JavaScript SDK で `accessToken` を使用するには、`context` オブジェクトからトークンを渡す必要があります。

> **Note:**
>
> **ノート:** デフォルトでは、Cloud Code JavaScript SDK は `context` オブジェクトからの `serviceToken` を使用します。`accessToken` を使用するには SDK コンストラクタに明示的に渡す必要があります。

以下の例は、スクリプトを呼び出すプレイヤーの通貨残高を増やします。通貨 ID をパラメーターとして受け取ります。

#### JavaScript##javascript

```javascript
const { CurrenciesApi } = require("@unity-services/economy-2.4");

module.exports = async ({ params, context, logger }) => {
  const { projectId, playerId, accessToken } = context;
  const { currencyId } = params;

  // Use the accessToken from the context object to authenticate the call as the player
  const currencies = new CurrenciesApi({accessToken});

  try {
    const result = await currencies.incrementPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyModifyBalanceRequest: { amount: 10 } });
    return result.data;
  } catch (err) {
    logger.error("Failed to update currency balance", {"error.message": err.message}, {"currencyId" : currencyId});
    throw err;
  }
}
```

### UGS Client API でのトークンの使用##use-tokens-with-ugs-client-apis

UGS Client API で `accessToken` を使用するには、Authentication ヘッダーでトークンを Bearer トークンとして渡します。

> **Note:**
>
> **ノート:** 呼び出すサービスで Cloud Code JavaScript SDK が提供される場合は、サービス API を直接呼び出すかわりに SDK を使用できます。使用可能な SDK のリストについては、[Cloud Code Services SDK](https://cloud-code-sdk-documentation.cloud.unity3d.com/) のページを参照してください。

以下の例は、スクリプトを呼び出すプレイヤーの友達のリストを取得します。

#### JavaScript##javascript

```javascript
const axios = require("axios-0.21");

module.exports = async ({ params, context, logger }) => {
  const config = {
    headers: {
      'Content-Type': 'application/json',
      // Pass the accessToken from the context object as a bearer token
      Authorization: `Bearer ${context.accessToken}`
    }
  };

  try {
    const friendsGetUrl = `https://social.services.api.unity.com/v1/relationships?type=FRIEND_REQUEST`
    var res = await axios.get(friendsGetUrl, config);
    return res.data;
  } catch (err) {
    logger.error("Failed to retrieve Friends", {"error.message": err.message});
    throw err;
  }
};

```

## サービストークンのサポート##service-token-support

サービストークンは、Cloud Code が生成する [JWT](https://jwt.io/) です。サービストークンを使用して、サービスを Cloud Code として認証できます。これは、[トークン交換](./authentication.md#cloud-code-client-api-bearer-authentication) プロセスが実行されたサービスアカウントトークンです。

Cloud Code JavaScript SDK でサービストークンを使用できます。他の API で使用するには、Authentication ヘッダーで Bearer トークンとして渡します。

詳細については、[認証](./authentication.md#cloud-code-client-api-bearer-authentication) のドキュメントを参照してください。

### サポートされているサービス##supported-services

サービストークンをサポートするサービスのリストについては、以下の表を参照してください。

| プロバイダー                    | サポートされているサービス                                                                                                                                                                                                      |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Cloud Code JavaScript SDK | [Cloud Save][Cloud Save JS SDK][Economy][Economy JS SDK][Lobby][Lobby JS SDK][Leaderboards][Leaderboards JS SDK] [Player Names][Player Names JS SDK][Matchmaker][Matchmaker JS SDK][マルチプレイヤー][Multiplayer JS SDK]  |
| UGS Client API            | [Cloud Save][Cloud Save Client API][Economy][Economy Client API][Leaderboards][Leaderboards Client API] [Player Names][Player Names Client API][Matchmaker][Matchmaker Client API]                                 |
| UGS Admin API             | サポートされていません。かわりに [サービスアカウント認証](./authentication.md#cloud-code-admin-api-basic-authentication) を使用します。                                                                                                              |

詳細については、[Cloud Code Services SDK](https://cloud-code-sdk-documentation.cloud.unity3d.com/) のドキュメントを参照してください。

[Cloud Save JS SDK]: https://cloud-code-sdk-documentation.cloud.unity3d.com/cloud-save/v1.3

[Economy JS SDK]: https://cloud-code-sdk-documentation.cloud.unity3d.com/economy/v2.4

[Lobby JS SDK]: https://cloud-code-sdk-documentation.cloud.unity3d.com/lobby/v1.2

[Leaderboards JS SDK]: https://cloud-code-sdk-documentation.cloud.unity3d.com/leaderboards/v1.1

[Player Names JS SDK]: https://cloud-code-sdk-documentation.cloud.unity3d.com/player-names/v1.0

[Matchmaker JS SDK]: https://cloud-code-sdk-documentation.cloud.unity3d.com/matchmaker/v2.0

[Multiplayer JS SDK]: https://cloud-code-sdk-documentation.cloud.unity3d.com/multiplay/v1.0

[Cloud Save Client API]: https://services.docs.unity.com/cloud-save/v1/

[Economy Client API]: https://services.docs.unity.com/economy/v2/

[Leaderboards Client API]: https://services.docs.unity.com/leaderboards/v1/

[Player Names Client API]: https://services.docs.unity.com/player-names/v1/

[Matchmaker Client API]: https://services.docs.unity.com/matchmaker/v2/

### Cloud Code JavaScript SDK でのトークンの使用##use-tokens-with-cloud-code-javascript-sdks

Cloud Code JavaScript SDK で `serviceToken` を使用するには、`context` オブジェクトからトークンを渡します。

以下の例は、プレイヤー ID と通貨 ID をパラメーターとして受け取り、そのプレイヤーの通貨の残高を増やします。

#### JavaScript##javascript

```javascript
const { CurrenciesApi } = require("@unity-services/economy-2.4");

module.exports = async ({ params, context, logger }) => {
 const { projectId } = context;
 const { playerId, currencyId } = params;

  // By default, the Cloud Code JavaScript SDKs use the serviceToken from the context object
  const currencies = new CurrenciesApi(context);

  try {
    const result = await currencies.incrementPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyModifyBalanceRequest: { amount: 10 } });
    return result.data;
  } catch (err) {
    logger.error("Failed to update currency balance", {"error.message": err.message}, {"currencyId" : currencyId});
    throw err;
  }

}
```

### UGS Client API でのトークンの使用##use-tokens-with-ugs-client-apis

UGS Client API で `serviceToken` を使用するには、Authentication ヘッダーでトークンを Bearer トークンとして渡します。

> **Note:**
>
> **ノート:** 呼び出すサービスで Cloud Code C# SDK が提供される場合は、サービス API を直接呼び出すかわりに SDK を使用できます。使用可能な SDK のリストについては、[利用可能なライブラリ](../reference/available-libraries) のページを参照してください。

例えば、Cloud Save API を呼び出す場合は、`serviceToken` を使用してクロスプレイヤーデータを認証し、操作できます。以下の例は、プレイヤー ID を関数パラメーターとして受け取り、新しい値を記録して、そのプレイヤーについて格納されているすべてのデータを返します。

#### JavaScript##javascript

```javascript
const axios = require("axios-0.21");

module.exports = async ({ params, context, logger }) => {
  const config = {
    headers: {
      'Content-Type': 'application/json',
      // Authenticate as Cloud Code using the serviceToken from the context object
      Authorization: `Bearer ${context.serviceToken}`
    }
  };

  let result;
  try {
    const cloudSaveUrl = `https://cloud-save.services.api.unity.com/v1/data/projects/${context.projectId}/players/${params.playerId}/items`
    const payload = {
      key : "test",
      value: "test"
    };

    await axios.post(cloudSaveUrl, payload, config);
    result = await axios.get(cloudSaveUrl, config);

    return result.data;
  } catch (err) {
    logger.error("Failed to call out to Cloud Save", {"error.message": err.message});
    throw err;
  }
};
```
