【UiPath】個人用アクセストークンのメリットと利用手順

## はじめに
- 本記事ではUiPath Automation Cloud (以下AC)にて利用可能な個人用アクセストークン(以下 PAT: Personal Access Token)のメリットと利用手順について説明します。

## PATの何が便利？
- PATのメリットを簡単に述べると、
    1. API利用時に必要となるアクセストークン取得のフローを省略できる
    2. ACユーザーに紐づくフォルダーロールを継承できる

- これらのメリットをご理解いただくために、次にアクセストークンについて簡単に説明します。PATの利用手順を知りたい方はここは読み飛ばして [PAT利用手順](#pat利用手順) まで進んでください。

## アクセストークンとは？
- 保護対象リソース(Orchestrator)へのアクセスコントロールを安全に行うために認可サーバー(Identity Server)がクライアント(Studio/Robot/ブラウザー/カスタムアプリなど)に対して発行します。​
- クライアントはまず認可サーバーへのアクセストークン取得を要求し、取得したトークンをHTTPヘッダーに埋め込んで保護対象リソースにアクセスできるようになります。
![AccessToken.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/77c86731-3ecd-d0f7-8036-5334cb381f0a.png)

### アクセストークン取得方法比較
- アクセストークン取得にはいくつかの方法があり、それぞれのメリット・デメリットについて比較します。

|トークン取得方法|メリット|デメリット|
|---|---|---|
|[APIキー](https://docs.uipath.com/ja/automation-cloud/automation-cloud/latest/api-guide/api-keys)|AC管理画面より取得できるユーザーキーとクライアントIDを使用してアクセストークンを取得するため実装が比較的容易|スコープの指定ができず管理者権限が付与されてしまうため、これらの情報が漏洩した場合にはセキュリティリスクが高まるため非推奨|
|[外部アプリケーション (クライアントクレデンシャル)](https://docs.uipath.com/ja/automation-cloud/automation-cloud/latest/api-guide/accessing-uipath-resources-using-external-applications#client-credentials)|AC管理画面より取得できるクライアントIDとシークレットを使用してアクセストークンを取得するため実装が比較的容易|アプリケーションスコープではフォルダーごとに権限を分離できないデメリットあり<br>※ [きめ細かいアクセス権](https://docs.uipath.com/ja/automation-cloud/automation-cloud/latest/api-guide/accessing-uipath-resources-using-external-applications#fine-grained-access)の利用によって解消できる|
|[外部アプリケーション (認可コード)](https://docs.uipath.com/ja/automation-cloud/automation-cloud/latest/api-guide/accessing-uipath-resources-using-external-applications#authorization-code)|アクセストークン取得のフローではブラウザー起動とクライアントアプリへのリダイレクトが必要となり実装がやや煩雑|ユーザースコープを利用することによってブラウザーログインするユーザーのロール設定が継承できるためフォルダーごとの権限分離が可能|
|[PAT](https://docs.uipath.com/ja/automation-cloud/automation-cloud/latest/api-guide/personal-access-tokens)|・アクセストークン取得のフローの実装が不要<br>・あらかじめスコープを定義し、かつユーザーに割り当てられたフォルダーへのロール設定が継承できる<br>・トークンの有効期限を設定できる|ローカルユーザーに対してのみ利用可能で、ディレクトリユーザーでは現在利用できない|

- 外部アプリケーションのアクセストークン取得フローやサンプルスクリプトについては[ナレッジベース記事](https://www.uipath.com/ja/community-blog/knowledge-base/implementing-orchestrator-api-with-oauth)もご参照ください。

## PAT利用手順
- PATのメリットをご理解いただいたところで実際の利用手順について説明したいと思います。

### AC設定
1. [Automation Cloud](https://cloud.uipath.com) にログインし、管理メニューをクリックします。
![PAT01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/986c99a4-f437-d053-d27c-ac25fbca1633.png)
2. External Applications (外部アプリケーション) メニューをクリックします。
![PAT02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/f2a07f46-2189-a53b-00de-3d3da3590104.png)
3. 個人用アクセストークンのタブに移動し、[設定] をクリックします。
![PAT03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/33029226-0bd0-95ec-4e62-afcf2686d192.png)
4. [すべてのユーザーに対して PAT を有効化] のトグルをオンにして [保存] をクリックします。
![PAT04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/c9ec37e6-e276-7b7c-6d30-3ebf9bd0aa6a.png)
5. PATを取得するユーザーでログインし、右上のユーザーアイコンをクリックし [設定] をクリックします。
![PAT05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/ea629f3d-e0a7-d15d-8cc4-44de11ee5745.png)
6. 個人用アクセストークンのメニューに移動し、 [新しいトークンを生成する] をクリックします。
![PAT06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/c57285e0-6641-8faf-5aef-93932cf80b1a.png)
7. 今回の例では各Orchestratorフォルダー配下のプロセス一覧を取得したいと思います。
    - 適切な名前と有効期限(2日以上)を指定します。
    - リソースとして [Orchestrator API Access] を選択し、スコープとして `OR.Folder.Read` と `OR.Execution.Read` を選択します。これらは実際に利用するAPIに応じて適切に設定します。
![PAT07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/4f714a1f-4798-4efd-27da-03824bbc6ede.png)
8. [保存] をクリックするとトークンが表示されるためメモします。
![PAT08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/4987af62-ee05-f0a7-2d8a-a1fd4f489b94.png)

### スクリプトの実装
- PowerShellでの実装例を示します。`$uriOrch`にACのURL、`$pat`に先ほど取得したトークンを設定して実行します。

```PowerShell:uipath-pat-sample.ps1
$uriOrch = "https://cloud.uipath.com/<組織名>/<テナント名>"
$pat = '<先ほど取得した個人用アクセストークン>'

$headers = @{"Authorization" = "Bearer $pat" }
$contentType = "application/json;charset=utf-8"

# Get Folders
$uriFolder = "$uriOrch/odata/Folders"
$resFolder = Invoke-RestMethod -Uri $uriFolder -Method Get -ContentType $contentType -Headers $headers
$resFolder.value | foreach {
    try {
	    $headerUnit = $headers + @{"X-UIPATH-OrganizationUnitId" = $_.Id }
	    Write-Host $_.FullyQualifiedName -Foreground Cyan

	    # Get Processes
	    $uriProcess = "$uriOrch/odata/Releases"
	    $resProcess = Invoke-RestMethod -Uri $uriProcess -Method Get -ContentType $contentType -Headers $headerUnit
	    $resProcess.value | ForEach-Object {
		    $procName = $_.Name
		    $procVer = $_.ProcessVersion
		    Write-Host "  - $procName [$procVer]"
	    }
    } catch {
       Write-Host -ForegroundColor Red $_
    }
}
```
- フォルダーごとにプロセス一覧が表示されることを確認します。
![PAT09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/2b006a5c-a8ac-7ca2-deab-74172bed62b4.png)
- この時、表示されるフォルダーはPATを取得したユーザーが権限を割り当てられたフォルダーのみに限定されます。
- PATの代わりに外部アプリケーション(クライアントクレデンシャル)を使用しアプリケーションスコープに `OR.Execution.Read` を割り当てた場合はすべてのフォルダーのプロセスが表示されてしまい、権限を分離できません。

## おわりに
- 本記事では個人用アクセストークン(PAT)のメリットと利用手順について説明しました。外部アプリケーションとの違いをご理解の上、適宜使い分けていただければと思います。