ServiceNowで認証＆接続情報の管理(URL/ID/Password)

* Version: London

# 概要

ServiceNowのBusiness RuleでAPIなどを扱う際の、接続情報（URL/ID/Pass）を管理する。

# Connection & Credential

Connection & Credential（認証情報と接続情報）を使用する。
[認証情報と接続情報| ServiceNow](https://docs.servicenow.com/bundle/london-servicenow-platform/page/product/credentials/reference/r-credentials.html)

下記はAPiのURL/ID/Passを管理する場合のテーブル構造を示した例である。テーブルと配置される情報の差異について注意したい。
![Connection.png](https://qiita-image-store.s3.amazonaws.com/0/176014/45e2537c-a936-e107-0c91-19c64b575094.png)

なお、パスワードに関しては認証情報 [discovery_credentials] テーブルに値が保存されるが、保存された段階で自動的に暗号化される。
>暗号化と復号化
プラットフォームでは、認証情報 [discovery_credentials] テーブルの暗号化フィールドに認証情報を保存します。認証情報が入力されると、認証情報は表示できません。 
>[認証情報の開始](https://docs.servicenow.com/bundle/london-servicenow-platform/page/product/credentials/reference/r-credentials-introduction.html)


# やってみる

簡単な外部APIへの問い合わせコードを、Connection & Credential機能を使って書いてみる。
今回は OpenWeatherMap API（ https://home.openweathermap.org/ ）を利用した。

### Aliasの作成

まずは接続情報をまとめるエイリアスを作成する。Connection & Credential > Connection & Credential Aliases からNewで新規レコードを作成して保存。

  * Type： Connection & Credential
  * Connection Type: HTTP

  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/176014/0331f2fb-8cd2-ce08-de17-0d0b259fc677.png)

### Credentialの作成

次にCredentialを作成する。Connection & Credential > CredentialsからNewで新規レコードを作成。今回は「API Key Credentials」を選択する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/176014/e346952a-6d5f-8dce-3dbb-6f737dee05e3.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/176014/8bd5a4c7-6592-dc36-1547-969f94c8a133.png)

### Connectionsの作成

最後にConnectionsを作成する。Connection & Credential > ConnectionsからNewで新規レコードを作成。今回は[Current weather data](https://openweathermap.org/current)を利用するとして登録する。HTTP Connectionを選んで作成。

  * Credential: 先ほど作成したCredentialを選択
  * Connection alias: 先ほど作成したaliasを選択
  * Connection URL： http://api.openweathermap.org/data/2.5/weather

![image.png](https://qiita-image-store.s3.amazonaws.com/0/176014/f420ed44-9993-ccf0-f640-61292d05eb1c.png)

### 実際に問い合わせてみる

[ConnectionInfoProvider | ServiceNow Developers](https://developer.servicenow.com/app.do#!/api_doc?v=london&id=connectioninfoprovider-api)
スクリプトでConnection & Credentialの情報を利用する際は、ConnectionInfoProviderを利用する。ここではAliasのsys_idで指定することで、URL/ID/Passをまとめて取ってくることが可能。
なお、sys_idはリストビューなどで「右クリック→Copy sys_id」で拾える。

下記のコードを「System Definition - Scripts - Background」で実行する。

```
// Get Connection Info
var provider = new sn_cc.ConnectionInfoProvider();
var connectionInfo = provider.getConnectionInfo("*****"); // ここにsys_idを指定

var BASE_URL = String(connectionInfo.getAttribute("connection_url"));
var API_KEY = String(connectionInfo.getCredentialAttribute("api_key"));
var endPointURL = BASE_URL + "?q=London&APPID=" + API_KEY;

// Rest Request
var rm = new sn_ws.RESTMessageV2();
rm.setLogLevel("all");
rm.setEndpoint(endPointURL);
rm.setHttpMethod("get");
rm.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
var request = rm.execute();

// Output
var requestBody = JSON.parse(request.getBody());
gs.info(requestBody["name"] + ":" + requestBody["weather"][0]["main"]);
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/176014/ce34c7d0-83ea-8fd6-d57e-8dd041414ee1.png)
なにか解析エラーが出ているが、無事「London:Clouds」と表示された。
`gs.getProperty('instance_name')`でのインスタンス名取得と組み合わせれば、インスタンスごとに接続情報を切り替えることなどできそう。

# 参考
[接続情報および認証情報エイリアスの作成](https://docs.servicenow.com/bundle/london-servicenow-platform/page/product/credentials/task/connection-alias.html)