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


概要

先日に引き続きServiceNowのRESTについて書いていきます。
ServiceNowのRESTを普通に実行する場合、
ユーザパスをベタに書く必要があり(間違ってたらすみません)
流失したときにやばいと思い調査してみました。

調べたところによるとコミュニティにこんな記事が上がっていました。
どうやらServiceNowでOAuth2.0が利用できそうとのことで試してみました。

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

詳細

①アプリケーションレジストリの作成

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

 1.システムOAuth>アプリケーションレジストリを開く。
 2.新規を押下する。
 3.外部クライアント用のOauth APIエンドポイントを作成しますを選択する。
 4.名前、アクセストークンの有効期間(秒)を設定し、送信を押下する。

②アクセストークンの取得

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

 1.リンクから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を押下する。

 設定画面

 実行結果

③アクセストークンを利用した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を実行してみた
OAuth 2.0 with Inbound REST(community記事)