[ServiceNow]OAuth2.0を利用したREST APIを実行してみた

# 概要
[先日](https://qiita.com/ysnow/items/34fd80791f820a1d032a)に引き続きServiceNowのRESTについて書いていきます。
ServiceNowのRESTを普通に実行する場合、
ユーザパスをベタに書く必要があり（間違ってたらすみません）
流失したときにやばいと思い調査してみました。

調べたところによるとコミュニティにこんな[記事](https://community.servicenow.com/community?id=community_blog&sys_id=56086e4fdb9014146064eeb5ca961957)が上がっていました。
どうやらServiceNowでOAuth2.0が利用できそうとのことで試してみました。

手順
①アプリケーションレジストリの作成
②アクセストークンの取得
③アクセストークンを利用したREST実行

# 詳細
### ①アプリケーションレジストリの作成
アクセストークンを生成するにあたり、
ServiceNowにアプリケーションレジストリを作成する必要があります。

　1.システムOAuth>アプリケーションレジストリを開く。
　2.新規を押下する。
　3.外部クライアント用のOauth APIエンドポイントを作成しますを選択する。
　4.名前、アクセストークンの有効期間（秒）を設定し、送信を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/946893/c615660c-6ece-e55e-d90a-9846a62287a8.png)

### ②アクセストークンの取得
RESTなのでCURL等で生成可能ですが今回はPOSTMANというツールを使いアクセストークンを生成します。

　1.[リンク](https://www.postman.com/downloads/)からPOSTMANをダウンロードする。
　2.ダウンロードしたPostman-win64-7.34.0-Setup.exeを実行する。
　3.新規タブを開き、メソッドをGETからPOSTに変更する。
　4.URLに「https://インスタンス名.service-now.com/oauth_token.do」を設定する。
　5.Bodyを選択し「x-www-form-urlencoded」にチェックを入れ下記パラメータを設定する。
　　grant_type:password
　　client_id:【アプリケーションレジストリで生成されたクライアントID 】
　　client_secret:【アプリケーションレジストリで生成されたクライアントシークレット】
　　username:【ユーザ名】
　　password:【パスワード】
　6.SENDを押下する。

　設定画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/946893/41611ccd-44bc-f988-0e40-0285a3d8d50c.png)

　実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/946893/282fdae1-105d-a292-14d6-a3fc7b09ddb7.png)

### ③アクセストークンを利用したREST実行
アクセストークンの生成で取得したアクセストークンを利用して
RESTを実行することが可能です。


```
■アクセストークンを利用する場合
curl “https://インスタンス名.service-now.com/api/now/table/incident"
--request POST 
--header "Accept:application/json" 
--header "Content-Type:application/json" 
--data "{'short_description':'CURLから起票','urgency':'2','impact':'2’}” 
--header "Authorization:Bearer 4O7Ctf8bpmGrUvehna5BVUdAS6OiPbz7DAfKqMQtCuuP6n3fACekpKups7KAHZcaZRUlL-hDGDpobm86TU-Akg“
```

```
■アクセストークンを利用しない場合
curl "https://インスタンス名.service-now.com/api/now/table/incident"
--request POST 
--header "Accept:application/json" 
--header "Content-Type:application/json" 
--data "{'short_description':'CURLから起票','urgency':'2','impact':'2’}” 
--user “【ユーザ名】”:“【パスワード】"
```

# 補足
### POSTMAN以外からの取得方法
#### CURL
```
■パスワードを利用する場合
curl --location --request POST "https://devXXXXX.service-now.com/oauth_token.do" ^
--data-urlencode "grant_type=password" ^
--data-urlencode "client_id=XXXXXXXXXXXXXXXXXXXXXXXXXXX" ^
--data-urlencode "client_secret=XXXXXXXXX" ^
--data-urlencode "username=ユーザ名" ^
--data-urlencode "password=パスワード"

■リフレッシュトークンを利用する場合
curl --location --request POST "https://devXXXXX.service-now.com/oauth_token.do" ^
--data-urlencode "grant_type=refresh_token" ^
--data-urlencode "client_id=XXXXXXXXXXXXXXXXXXXXXXXXXXX" ^
--data-urlencode "client_secret=XXXXXXXXX" ^
--data-urlencode "refresh_token=3YiEdubKXp8JjokXXXXXXXXXXXXXXXXJAFZRxvlhf75ZbXXXXXXXA7ZjzVnzpaqWwD1A" 
```

#### ServiceNow
```
var request = new sn_ws.RESTMessageV2();
var body = "grant_type=password&client_id=5728b128c640a4105e22f5a3338bd53b&client_secret=@PJ48#;@Oi&username=【ユーザ名】&password=【パスワード】";
request.setEndpoint('https://【インスタンス名】.service-now.com/oauth_token.do’);
request.setHttpMethod('POST’);
request.setRequestHeader(‘Content-Type’,‘application/x-www-form-urlencoded’); //oauth_token.doはapplication/json形式利用不可
request.setRequestBody(body);var response = request.execute();
var responseBody = response.getBody();
var obj = JSON.parse(responseBody);

gs.log(responseBody); //Json形式でデータを表示
gs.log(obj.access_token); //アクセストークンのみ表示
```

# 参考
[[ServiceNow]MID Server経由でREST APIを実行してみた](https://qiita.com/ysnow/items/34fd80791f820a1d032a)
[OAuth 2.0 with Inbound REST(community記事)](https://community.servicenow.com/community?id=community_blog&sys_id=56086e4fdb9014146064eeb5ca961957)