ServiceNow:フローデザイナーのScriptステップでOAuthアクセストークンを取得する
概要
フローデザイナーのActionに含まれるScriptステップから、Application Registryに登録済みのOAuthプロファイルを使ってアクセストークンを取得する方法。
前提条件
- Application Registry に対象サービスのOAuthアプリが登録済みであること
- OAuth Entity Profile が作成済みであること
- フローのActionに
access_token(String型)とstate(String型)のOutputが定義されていること
実装
(function execute(inputs, outputs) {
try {
var oAuthClient = new sn_auth.GlideOAuthClient();
var oauthProfileId = 'OAuthプロファイルのsys_id'; // OAuth Entity Profile の sys_id
var oauthAppName = 'Application Registry名'; // Application Registry の Name フィールド
var params = {
grant_type: "client_credentials",
oauth_provider_profile: oauthProfileId
};
var tokenResponse = oAuthClient.requestToken(oauthAppName, new global.JSON().encode(params));
if (!tokenResponse || !tokenResponse.getToken()) {
gs.error('[TokenFetch] トークンレスポンスが不正です');
outputs.access_token = null;
outputs.state = 'error';
return;
}
var accessToken = tokenResponse.getToken().getAccessToken();
if (!accessToken) {
gs.error('[TokenFetch] アクセストークンが取得できませんでした');
outputs.access_token = null;
outputs.state = 'error';
} else {
gs.info('[TokenFetch] アクセストークン取得成功');
outputs.access_token = accessToken;
outputs.state = 'success';
}
} catch (ex) {
gs.error('[TokenFetch] 例外: ' + ex.message);
outputs.access_token = null;
outputs.state = 'exception';
}
})(inputs, outputs);
ポイント
| 項目 | 内容 |
|---|---|
sn_auth.GlideOAuthClient() |
ServiceNow標準のOAuthクライアントクラス |
oauth_provider_profile |
OAuth Entity Profile の sys_id を指定(Name不可) |
requestToken() の第1引数 |
Application Registry の Name を指定(sys_id不可) |
grant_type |
Client Credentials フローの場合は "client_credentials"
|
getToken().getAccessToken() |
トークンオブジェクトからアクセストークン文字列を取得 |
エラーハンドリング
state のOutputで呼び出し元のフローが結果を判断できるようにする。
| state の値 | 意味 |
|---|---|
success |
トークン取得成功 |
error |
トークンが空またはレスポンス不正 |
exception |
スクリプト内で例外が発生 |
注意事項
-
access_tokenをgs.info()などでログ出力するのは開発・デバッグ時のみにする。本番環境ではセキュリティリスクになるため削除すること - Application Registry名とOAuthプロファイルのsys_idは混同しやすいため、指定する値の種類に注意する
- トークンの有効期限はサービス側の設定に依存するため、フロー全体の設計時に考慮する