REST API の外部 ID トークン認証 (OIDC) を構成する方法Issue <!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } OpenID Connect (OIDC) を使用して外部 ID トークン認証を構成し、JSON Web トークン (JWT) を使用してテーブル API またはスクリプト Web サービスにアクセスする方法について説明します。 OIDC は、OAuth 2.0 上にビルドされた認証レイヤーです。これにより、ServiceNow を含むクライアントは、ユーザー情報を含む JWT トークンを検証することで、エンドユーザーの身元を検証できます。ServiceNow では、API 認証用の JWT トークンのみをサポートしています。 RFC 7519 で定義されている JWT は、ヘッダー、ペイロード、署名の 3 つの部分をドットで区切って構成します。ペイロードには、トークン検証中にシステムが検証する要求が含まれています。 OIDC 認証の仕組み インスタンスのアドミンがアプリをサードパーティ OIDC プロバイダーに登録します。インスタンスアドミンは、OIDC メタデータ URL、ユーザー要求、およびユーザーフィールドを指定して、インスタンスで OIDC プロバイダーを構成します。インスタンスアドミンは、プロバイダーからのクライアント ID [client_id] とクライアントシークレット [secret_id] を使用して、OAuth OIDC エンティティを設定します。API ユーザーは、ServiceNow REST API を呼び出すときに JWT を取得し、それを Authorization Bearer ヘッダーに含めます。インスタンスは、ベアラートークンが OAuth アクセストークンであるかどうかを確認します。そうでない場合は、トークンを JWT として検証します。インスタンスは、署名、有効期限、およびユーザー要求を検証して、JWT を検証します。インスタンスは、JWT のユーザーをユーザー [sys_user] テーブルのレコードと照合することで、要求を認証します。 認証結果 ユーザーが見つかりました:要求は認証されます。ユーザーが見つかりません。自動ユーザーインポートが有効です:事前定義された変換マップを使用してユーザーが作成され、要求が認証されます。ユーザーが見つかりません。自動ユーザーインポートが無効です:認証に失敗し、API 呼び出しから 401 エラーが返されます。 JTI 要求検証 JTI 要求検証を有効にする が選択されている場合、各 JWT は 1 つの API 呼び出しにのみ使用できます。同じトークンを使用する後続の呼び出しは失敗します。このオプションが選択されていない場合、インスタンスは JWT が以前に使用されたかどうかをチェックしません。 統合セットアップ アプリを OIDC プロバイダーに登録する アプリケーションを OpenID Connect プロバイダーに登録します。プロバイダー固有の手順については、ID およびアクセス管理ソリューションのドキュメントを参照してください。認定プロバイダーのリストについては、「 OpenID 認定」を参照してください。 OAuth OIDC エンティティ構成の設定 システム OAuth > アプリケーションレジストリ に移動します。既存のレコード (デモデータ) を選択するか、 新規 を選択して新しいレコードを作成します。ID トークンを検証するための OIDC プロバイダーの設定を選択します。クライアント ID と クライアントシークレット を含むすべての必須フィールドに入力します。OIDC プロバイダは次の値を提供します。OAuth エンティティ スコープ を構成します。OIDC プロバイダーがスコープの詳細を提供します。 最適化されたバージョンの OIDC プロバイダー構成フィールド OIDC プロバイダー構成 説明 OIDC プロバイダー OIDC プロバイダーの名前 OIDC メタデータ URL OIDC プロバイダーのメタデータ URL。この値については、プロバイダーのドキュメントを確認してください。 ユーザー要求 ユーザーテーブルに対して検証される要求 ユーザーフィールド ユーザー [sys_user] テーブルに対して検証された要求。 JTI 要求検証を有効化 有効な場合、JWT 検証にはプロバイダーから送信された JTI (JWT ID) の検証が含まれます。無効にすると、トークンに存在する場合でも JTI は検証されません。 JWT を取得 OIDC プロバイダーを使用して、クライアントプログラムの ID トークンを生成します。 REST API 呼び出しを呼び出す テーブル API またはスクリプト Web サービスにアクセスするには、認証ヘッダーに ID トークンを含めます。 cURL 要求の例 curl -X GET --header "Accept:application/json" https://<instance_name>.service-now.com/api/now/table/incident/897b04f2dbd4a300a135364e9d961952 -k --header "Authorization: Bearer eyJraWQiOiJjNTZtZTlXU0xPVnY3UFMwcTg4Qzl1b0lzNjFQYTdmUG4yZFVFOW9RNUg4IiwiYWxnIjoiUlMyNTYifQ..." 認証に成功すると、API は有効な application/json 応答を返します。認証に失敗した場合、API はエラーメッセージを返します。 ユーザーが認証されていないエラー {"error":{"message":"User Not Authenticated","detail":"Required to provide Auth information"},"status":"failure"} JWT 要求検証 Now Platform は JWT のペイロードを解析し、JWT 要求検証構成と比較します。設定された値が JWT の要求と一致しない場合、検証エラーが localhost ログに記録されます。 ユーザープロビジョニング OIDC 要求からユーザーを自動的にプロビジョニングするには、データ ソースと変換マップを構成します。 タイプ OIDC のデータソースを作成します。変換マップをデータソースに関連付けます。OIDC プロバイダー構成でデータソースを選択します。ユーザーを自動的にプロビジョニングを選択します。適切なロールをアサインします。 Now Platform はクレーム値を解析し、ステージングテーブルに入力します。変換マップが実行され、ターゲットテーブルにデータがロードされます。 [インポートセット] 画面の例 localhost ログの例 次の例は、さまざまな認証シナリオの主要なログエントリを示しています。これらのパターンを使用して、OIDC 認証の問題をトラブルシューティングします。トランザクション ID、タイムスタンプ、セッション ID、およびユーザー名はインスタンスごとに異なることに注意してください。 認証成功 2018-12-11 15:50:32 (275) API_INT-thread-2 SYSTEM txid=db83700edb1a DEBUG: Auth JWT token sucessfully verified for algorithm=RS256 2018-12-11 15:50:32 (299) API_INT-thread-2 SYSTEM txid=db83700edb1a DEBUG: Auth All claims are sucessfully validated. 2018-12-11 15:50:32 (319) API_INT-thread-2 SYSTEM txid=db83700edb1a HTTP authorization validated user 'oauth.admin' 2018-12-11 15:50:32 (319) API_INT-thread-2 SYSTEM txid=db83700edb1a Session user set to oauth.admin 認証に失敗しました (JTI 要求検証失敗) 2018-12-11 13:16:59 (966) API_INT-thread-2 SYSTEM txid=a260184adbd6 SEVERE *** ERROR *** Failed in jti(JWT token_id) claim verification. Token is already used. 2018-12-11 13:16:59 (966) API_INT-thread-2 SYSTEM txid=a260184adbd6 WARNING *** WARNING *** Oauth authentication failed for access token ... No user found. 2018-12-11 13:16:59 (966) API_INT-thread-2 SYSTEM txid=a260184adbd6 WARNING *** WARNING *** Failed authorization by script include 'BearerAuth' 2018-12-11 13:16:59 (967) API_INT-thread-2 SYSTEM txid=a260184adbd6 #30849 [REST API] RESTAPIProcessor : User Not Authenticated 2018-12-11 13:16:59 (967) API_INT-thread-2 SYSTEM txid=a260184adbd6 DEBUG: Session inactivity timeout changed for unauthorized session. Inactive_interval=60 seconds 成功したクレーム検証 2018-12-11 17:44:24 (316) API_INT-thread-3 SYSTEM txid=2f9dcd4edb9e DEBUG: Auth Going to verify claims:[name] 2018-12-11 17:44:24 (317) API_INT-thread-3 SYSTEM txid=2f9dcd4edb9e DEBUG: Auth JWT token sucessfully verified for algorithm=RS256 2018-12-11 17:44:24 (320) API_INT-thread-3 SYSTEM txid=2f9dcd4edb9e DEBUG: Auth All claims are sucessfully validated. 失敗したクレーム検証 2018-12-11 18:06:15 (276) API_INT-thread-1 SYSTEM txid=67925142dbde DEBUG: Auth Going to verify claims:[name] 2018-12-11 18:06:15 (278) API_INT-thread-1 SYSTEM txid=67925142dbde SEVERE *** ERROR *** JWT verification failed. exception:com.auth0.jwt.exceptions.InvalidClaimException: The Claim 'name' value doesn't match the required one. トラブルシューティング OAuth デバッグを有効にする 詳細なログ記録を有効にするには、次のシステムプロパティを true に設定します。 com.snc.platform.security.oauth.debugglide.auth.debug.enabled ログを確認し、トークンを検証します localhost ログでエラーメッセージを確認します。外部 JWT デコーダー を使用してトークンの内容を検査し、要求を検証します。 Release<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } London リリース以降 Resolution<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } この記事では、構成ガイダンスを提供します。解決策は必要ありません。 Related Links<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } 規格と仕様 RFC 7519:JSON Web トークン (JWT)OpenID Connect プロトコルのドキュメントOpenID 認定 (認定プロバイダーのリスト) Okta リソース (OIDC プロバイダーの例) Okta OIDC API ドキュメントOkta の概要:OAuth 2.0 と OpenID ConnectOkta JWT 検証ガイドOkta 開発者アカウントにサインアップする ServiceNow 製品ドキュメント OAuth 2.0受信 REST API 認証