API を使って Jira ServiceDesk にリクエストを作成

#はじめに

表題の通り、API 経由で Jira ServiceDesk にリクエストを作成しました。

OAuth2.0 でトークン取得せよとか、OAuth1.0でトークン取得せよとか、APIトークン取得せよとか、ID/パスワードで Basic認証せよとか、APIのバージョンによって違う点もあって少々混乱したこともあり、備忘メモです。

参考にした ServiceDesk の APIドキュメント はこちらです。

https://docs.atlassian.com/jira-servicedesk/REST/4.19.1/


# 1. アプリを登録する

まずは、APIを利用するアプリを登録します。
詳細は [Manage your apps](https://developer.atlassian.com/platform/forge/manage-your-apps/) を参照。

1.1. My apps でアプリを作成する

- [Attlasian Developer My apps](https://developer.atlassian.com/console/myapps/) にアクセス
- [Create] > [OAuth 2.0 Integration] を押下
![スクリーンショット 2021-09-25 19.10.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/08dbefd1-9a57-d9c4-3951-b523616444bd.png)

- Name を入力して [Create] を押下
![スクリーンショット 2021-09-25 19.11.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/f36fbfcd-26e3-2f19-8cc0-105976e0c71b.png)

- 作成完了
![スクリーンショット 2021-09-25 19.11.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/fe9ca673-97fa-6c45-c66a-b89f869dc689.png)

1.2. 作成したアプリで利用する `scope` を設定する

- [Permissions] のメニューを開く
- 利用するAPI に対して [Add] を押下する （押下すると [Configure] の名前になる）
![スクリーンショット 2021-09-26 0.16.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/a7318b37-ddff-22af-d9ab-b11dc983f7e7.png)

- 利用するAPI の [Configure] を押下して詳細画面を開く
- 詳細項目で、利用するスコープに対して [Add] を押下する（押下すると [Remove] の名前になる）
![スクリーンショット 2021-09-26 0.16.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/060fc486-5b59-1c9f-e0d9-da85e1277fff.png)

1.3. 作成したアプリの `redirect_uri` を設定する

- [Authorization]のメニューを開く
- OAuth 2.0 の項目の [Configure] を押下する
![スクリーンショット 2021-09-26 0.16.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/610bc86e-a227-bac6-1de8-7e18c3461a26.png)

- [Callback URL] の項目に、`redirect_uri` として使うURLを記入する
- [Sace Changes] を押下する
![スクリーンショット 2021-09-26 0.17.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/78b579b7-5bb0-56ef-2949-d1e266bafbe0.png)
- [Callback URL] を登録したら表示される [Authorization URL generator]で generateされている Authorization URL は認可コードを取得する時に使います！

# 2. cloudId を確認する

利用するAPIのエンドポイントを確認すると、下記の通り記載されてます。（参考：[Structure of the REST URIs](https://docs.atlassian.com/jira-servicedesk/REST/4.19.1/#structure)）

```
http://host:port/context/rest/servicedeskapi/XXXXXX
```

`host` と `context` が自分の環境の場合何になるのかわかりませんでしたが、[この辺](https://developer.atlassian.com/cloud/jira/platform/rest/v3/intro/#other-integrations)とか見て、下記が怪しいなと思って試したら使えたのできっとこれ。

```
https://api.atlassian.com/ex/jira/<cloudId>/rest/XXXXX
```

ってことで `cloudId` とやらを取得します。
[Get the cloudid for your site](https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/#3-1-get-the-cloudid-for-your-site) を参考に取得します。

## 2.1. cloudId を確認する APIを叩くための token を取得する

cloudId を確認する APIはこれです。

```
https://api.atlassian.com/oauth/token/accessible-resources
```
このAPIを叩くための token を、1. アプリを登録する で登録した情報を使って取得します。

## 2.1.1. 認可リクエスト
- 1. アプリを登録する で [Callback URL] を登録した後、[Authorization URL generator] で Authorization URL が generate されているので、それを使います。
- そのままコピーすると、`state` の値が `{YOUR_USER_BOUND_VALUE}` となっているので、適宜修正して使います。
- `scope` の値も、アプリの登録時にアプリが利用するscopeとして設定したものが全て記されているので、こちらも適宜必要なもののみに修正して使います。
![スクリーンショット 2021-09-26 0.17.11のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/912bc7fa-34c1-6298-229b-6ea2deec4b33.png)
- 同意画面が表示されるので、問題ないことを確認して同意します。
- 認可コードが [Callback URL] に登録したURLに返却されます。

## 2.1.2. アクセストークン取得
- 取得した認可コードを使ってアクセストークンを取得します
- 詳細は [Exchange authorization code for access token](https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/#2--exchange-authorization-code-for-access-token) を参照

```HTTP:トークンエンドポイント
https://auth.atlassian.com/oauth/token
```
- 必要なパラメータは下記
    - client_id: (required) 
    - client_secret: (required) 
    - code: (required) 
    - redirect_uri: (required)
- 通常パラメータは `Content-Type` `application/x-www-form-urlencoded` で送付するのが仕様ですが `application/json` で送る必要がある点、要注意です。


## 2.2. cloudId を取得する
「2. cloudId を確認する」で記した通り、[Get the cloudid for your site](https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/#3-1-get-the-cloudid-for-your-site) を参考に取得します。

# 3. APIトークンの取得

APIのエンドポイントもこれでわかったし、アクセストークンの取得の手順も完璧。

ですが、私が使いたかった、冒頭にドキュメントのURLを記したAPI達は `APIトークン` を使ってアクセスするもののようです。
[Manage API tokens for your Atlassian account](https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/) を参考にAPIトークンを取得します。

[API トークン のページ](https://id.atlassian.com/manage-profile/security/api-tokens) にアクセスして [APIトークンを作成する] を押下するだけです！



# 4. APIを利用してリクエストを作成

これでようやくAPIを利用するための準備が整いました。長かった。

# 4.1. `serviceDeskId` と `requestTypeId` を確認する

とはいえ APIの利用には、どの ServiceDesk にリクエストを作成するのかを指定する `serviceDeskId` と、その中のどの種類のリクエストを作成するかを指定する `requestTypeId` が必要です。

ServiceDeskのポータルのカスタマーがリクエストを送信する画面、URLのパス上の下記の位置にそれぞれある数字が `serviceDeskId` と `requestTypeId` です。

```http:リクエスト画面のURL
https://xxxx.atlassian.net/servicedesk/customer/portal/{serviceDeskId}/group/1/create/{requestTypeId}
```
例えば

- https://samiii.atlassian.net/servicedesk/customer/portal/1/group/8/create/111

の場合は、 `serviceDeskId` が `1`、`requestTypeId` が `111` です。

## 4.2. 対象のリクエストタイプに存在する各項目のパラメータ名を確認する

リクエストを作成する際に、各項目のパラメータ名を確認する必要があります。 ServiceDeskの画面から確認できるフィールド名とは別にそれぞれ指定する `id` となる文字列が存在するので、それを取得します。

[Get request type fields](https://docs.atlassian.com/jira-servicedesk/REST/4.19.1/#servicedeskapi/servicedesk/{serviceDeskId}/requesttype/{requestTypeId}/field) のAPIを使って取得してください。

この API は、APIトークンを使って叩くので、ヘッダに下記のように APIトークンを使ったBasic認証を付して利用します。


```
Authorization: Basic {"メールアドレス:APIトークン"をbase64エンコードした文字列}  
```

## 4.3. リクエストを作成する

以上で必要な情報が全て揃いました。

リクエストの作成は [Create Customer Request](https://docs.atlassian.com/jira-servicedesk/REST/4.19.1/#servicedeskapi/request-createCustomerRequest) のAPIを使って行います。詳細はAPIドキュメントを確認ください。

この API は、「4.2.」 で使ったAPIと同様にAPIトークンを使って叩くので、ヘッダに下記のように APIトークンを使ったBasic認証を付して利用します。

```
Authorization: Basic {"メールアドレス:APIトークン"をbase64エンコードした文字列}  
```

----
以上でAPI経由でリクエストが作成できました！

ちなみに、「自動化」の Webhook を使って、リクエスト作成の処理を書いて、Webhook の URL に JSONでパラメータ送りつけてもできます。そっちの方が簡単です。

ただ、APIでリクエスト作成したら、作成に成功したか否かとか、どのURL（課題番号）で作成されたかとか、普通必要ですよね？ Webhook はその名の通りなので、特に結果を返却してはくれません。

ただ、結果の返却不要で、ある程度適当で良いよ、であれば「自動化」のWebhook使った方が断然早いですのでそちらも試してみるといいと思います。

おしまい。