古い OAuth アクセストークンの有効期限が切れたときに新しい OAuth アクセストークンを自動的に取得する (サポートされていないカスタムジョブスケジュール)Description下記のスクリプトは、基本的に新しいアクセストークンを取得するための「refresh_token」権限許可タイプを使用していることに注意してください。以下のスクリプトを使用してスクリプトの実行を予定している場合、(リフレッシュトークンの有効期限が切れていない限り) 期限切れが近い新しい アクセストークン を自動的に取得できます。この例は、OAuth で構成された送信 REST メッセージ用です。 これは参照用のサンプルスクリプトであり、サポートされていないカスタマイズとしてカウントされることに注意してください。その他のカスタマイズは、OAuth クライアントライブラリーの ServiceNow ドキュメントを参照して行う必要があります。 重要な注意点: ServiceNow プラットフォームは、以前のアクセストークンの有効期限が切れており、有効なリフレッシュトークンがoauth_credentialテーブルに存在している場合にのみ、新しいアクセストークンをフェッチできることに注意してください。お客様は、新しいアクセストークンをフェッチするためにこのスケジュール設定済みジョブを記述する必要はありません。 また、トークンプロバイダーがアクセストークンの取得中に新しいリフレッシュトークンを送信できる場合、プラットフォームはoauth_credentialテーブルで新しく受信したリフレッシュトークンを更新する機能を備えています。Instructionsfunction refreshAccessToken(requestorId, oauthProfileId, token) { if ( !(token && requestorId && oauthProfileId)) return; var tokenRequest = new sn_auth.GlideOAuthClientRequest(); tokenRequest.setGrantType("refresh_token"); tokenRequest.setRefreshToken(token.getRefreshToken()); tokenRequest.setParameter('oauth_requestor_context','sys_rest_message'); tokenRequest.setParameter('oauth_requestor', requestorId); tokenRequest.setParameter('oauth_provider_profile',oauthProfileId); var oAuthClient = new sn_auth.GlideOAuthClient(); var tokenResponse = oAuthClient.requestTokenByRequest(null,tokenRequest); var error = tokenResponse.getErrorMessage(); if (error) gs.warn("Error:" + tokenResponse.getErrorMessage()); } function isExpired(expiresIn, withinSeconds) { if (expiresIn > withinSeconds) return false; return true; } function getToken(requestorId, oauthProfileId) { if (!requestorId || !oauthProfileId) return null; var client = new sn_auth.GlideOAuthClient(); return client.getToken(requestorId, oauthProfileId); } function checkAndRefreshAccessToken(grRestMessage) { if (grRestMessage.getValue("authentication_type") != "oauth2" ) return false; var accountMsg = grRestMessage.getValue("name"); if (!accountMsg) accountMsg = grRestMessage.getUniqueValue(); accountMsg = "Account=\"" + accountMsg + "\""; var token = getToken(grRestMessage.getUniqueValue(), grRestMessage.getValue('oauth2_profile')); var accessToken = token.getAccessToken(); if (accessToken) { if (!isExpired(token.getExpiresIn(), 300)) return; } if (!token.getRefreshToken()) { gs.error("No OAuth refresh token for Rest Message. Manual reauthorization required. " + accountMsg); return; } if (isExpired(token.getRefreshTokenExpiresIn(), 0)) { gs.error("OAuth refresh token for Rest Message is expired. Manual reauthorization required. " + accountMsg); return; } gs.info("Refreshing oauth access token for Rest Message account. " + accountMsg); refreshAccessToken(grRestMessage.getUniqueValue(), grRestMessage.getValue('oauth2_profile'), token);} var grAccount = new GlideRecord("sys_rest_message");grAccount.addQuery("authentication_type", "oauth2");grAccount.addNotNullQuery("oauth2_profile");grAccount.query(); while (grAccount.next()) { checkAndRefreshAccessToken(grAccount);}