1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

フローデザイナーのScriptステップでOAuthアクセストークンを取得する

1
Posted at

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_tokengs.info() などでログ出力するのは開発・デバッグ時のみにする。本番環境ではセキュリティリスクになるため削除すること
  • Application Registry名とOAuthプロファイルのsys_idは混同しやすいため、指定する値の種類に注意する
  • トークンの有効期限はサービス側の設定に依存するため、フロー全体の設計時に考慮する
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?