# UAS와 함께 Vivox 액세스 토큰 사용

> Follow this workflow to use Vivox Access Tokens together with Unity Authentication Services.

어떤 플레이어가 어떤 채널에 액세스할 수 있는지 완전히 제어하려면 자체 백엔드에서 VAT(Vivox 액세스 토큰)를 발급하도록 할 수 있습니다.

> **Tip:**
>
> **팁:** 이 플로는 기존의 VAT 플로가 있는 프로젝트에서 Vivox 안전 제품군 전체 또는 기타 Unity 서비스를 활용하는 데 특히 유용합니다.

> **Important:**
>
> **중요**: 이 플로는 일반 UAS 토큰으로는 달성할 수 없는 추가적인 채널 액세스 제어가 필요한 경우나 기존 VAT 사용자로서 UAS와 연동하려는 경우에만 사용하십시오.

**필수 조건**:

1. [Unity Cloud 프로젝트 설정](/services/getting-started.md)
   * 프로젝트 ID, 개발 환경 ID, 개발 환경 이름이 있어야 합니다.
2. [UAS 커스텀 ID 제공자 활성화](/authentication/platform-signin/custom-id.md)
   * 이 설정에서 서비스 계정 인증정보를 손쉽게 사용할 수 있어야 합니다.

이 다이어그램은 이 설정의 전반적인 플로에 대해 설명합니다.

![](/api/media?file=/vivox-unity/media/images/vat-creation-flow-using-uas-tokens.png)

## VAT 생성##creating-vats

1. Vivox SDK는 커스텀 토큰 제공자 구현을 사용하여 필요할 때마다 백엔드에서 VAT를 요청합니다.
2. `GetTokenAsync` 메서드 내에서 VAT를 요청할 때 백엔드에 대한 요청에 `accessToken`를 추가합니다.
3. 백엔드에서 토큰을 확인하고 필요한 정보를 추출한 후 Vivox 액세스 토큰을 생성하여 클라이언트로 반환합니다.

## 클라이언트 측 설정##vat-creation-flow

게임 클라이언트에서 Vivox SDK의 `IVivoxTokenProvider` 인터페이스를 구현하는 클래스를 생성하고 이를 VivoxService에 등록합니다.

`VivoxService.Instance.SetTokenProvider`를 호출하여 IVivoxTokenProvider 구현을 등록하면 Vivox는 로그인과 같은 작업에 토큰이 필요할 때마다 구현의 `IVivoxTokenProvider.GetTokenAsync` 메서드를 호출합니다.

페이로드를 생성하는 데 필요한 정보는 오버라이드된 `IVivoxTokenProvider.GetTokenAsync` 메서드에 대한 입력으로 제공됩니다. 이 정보는 VAT를 작성할 때 사용됩니다.

여전히 서버 측 토큰 제공을 설정하고 오버라이드된 `IVivoxTokenProvider.GetTokenAsync` 메서드 내에서 토큰을 가져와야 합니다.

### 구독하기##to-subscribe

다음과 같이 `IVivoxTokenProvider` 구현을 등록한 후 플레이어를 로그인해야 합니다.

```text
VivoxService.Instance.SetTokenProvider(new CustomTokenProvider());
```

> **Important:**
>
> **중요**: v16.5.0에서 구독 플로가 변경되었습니다. Unity Vivox SDK 16.5.0 이전 버전에서는 `IVivoxTokenProvider` 구현을 등록한 후 Vivox SDK를 초기화해야 합니다.

### 토큰 가져오기##fetch-the-token

일부가 비어 있더라도 오버라이드된 메서드에 제공된 모든 파라미터를 사용하여 페이로드를 생성하고 이를 보안 서버로 보내 Vivox 액세스 토큰을 생성합니다.

가장 좋은 방법은 모든 파라미터를 보내는 것입니다. 페이로드에 필요한 것만 반환됩니다. 페이로드를 `GetTokenAsync` 메서드에 대한 입력으로 사용합니다.

또한 서버가 UAS accessToken을 확인하고 이를 통해 Vivox 액세스 토큰을 생성할 수 있도록 요청의 페이로드에 UAS 액세스 토큰을 전송해야 합니다.

특정 토큰의 경우 다른 파라미터가 비어 있습니다. 예를 들어 로그인 토큰의 경우 `targetUserUri`와 `channelUri`가 비어 있습니다. 이는 예상된 동작입니다.

다음은 토큰 생성 예제입니다.

```cs
public class VoiceManager : MonoBehaviour
{
    async void Start()
    {
        // Must be done before any other Vivox action otherwise tokens will not be generated properly.
        VivoxService.Instance.SetTokenProvider(new VivoxTokenProvider());
        await UnityServices.InitializeAsync();
        await VivoxService.Instance.InitializeAsync();
    }
}

class VivoxTokenProvider : IVivoxTokenProvider
{
    public Task<string> GetTokenAsync(string issuer = null, TimeSpan? expiration = null, string targetUserUri = null, string action = null, string channelUri = null, string fromUserUri = null, string realm = null)
    {
        if (!AuthenticationService.Instance.SessionTokenExists)
        {
          // Player not logged in!
        }
        var accessToken = AuthenticationService.Instance.AccessToken
        // Implement token fetching logic here.
        // The method parameters together with the accessToken from the AuthenticationService contain the necessary information for crafting the request payload.
        // This will be called whenever a token is needed for a Vivox action
    }
}
```

## 서버 측 설정##client-side-setup

백엔드 서비스에서는 클라이언트가 [위](#fetch-the-token)의 `GetTokenAsync` 함수 내에서 호출하여 필요할 때 VAT를 받을 수 있도록 API를 노출해야 합니다.

VAT 생성 방법에 대한 구현 세부 정보를 자세히 알아보려면 [보안 서버에서 토큰 생성](../../access-token-guide/generate-token-secure-server/generate-token-secure-server-toc)을 참고하시기 바랍니다.

토큰 페이로드에 대한 자세한 내용은 [액세스 토큰 페이로드](../../access-token-guide/access-token-format/access-token-payload)를 참고하시기 바랍니다.

VAT를 생성할 때는 다음 사용자 SIP URI를 대상으로 사용해야 합니다.

```text
sip:.issuer.unity_player_id.unity_environment_id.@domain.vivox.com
```

`issuer`는 Unity 프로젝트의 Vivox 발급자를 나타냅니다. `unity_player_id`는 UAS 플레이어 ID를 나타냅니다. `unity_environment_id`는 Unity Cloud 개발 환경의 개발 환경 ID를 나타냅니다.

두 값 모두 `GetTokenAsync` 메서드 내에서 클라이언트에서 백엔드로 전송해야 하는 accessToken에서 추출할 수 있습니다.

그런 다음 [토큰 ID 확인](https://services.docs.unity.com/docs/client-auth/#validate-the-token-id)에 설명된 단계에 따라 `accessToken`을 확인해야 합니다.

토큰의 `sub` 클레임에는 UAS 플레이어 ID가 포함되어 있습니다. 토큰의 `aud` 클레임에는 개발 환경 ID가 포함되어 있습니다. `aud` 값은 대소문자를 구분하는 문자열의 배열이며, 각 문자열은 StringOrURI 값을 포함합니다.

```json
{
  "header": {
    "alg": "RS256",
    "kid": "<id>",
    "typ": "JWT"
  },
  "payload": {
    "aud": [
      "upid:{{unity_project_id}}",
      "envName:{{environment_name}}",
      "envId:{{unity_environment_id}}" // unity environment id
    ],
    "exp": 1617677595, // expires at
    "iat": 1617673872, // issued at
    "nbf": 1617673872, // not valid before
    "sub": "{{unity_player_id}}", // UAS player ID
    "project_id": "{{unity_project_id}}" // unity project id
  }
}
```

이를 통해 VAT를 생성하고 클라이언트로 반환할 수 있습니다.
