Denodo Web サービスの呼び出し

[Web Services Container Status] テーブル の [Context Path] 列には、組み込み Web コンテナーにデプロイされているサービスの URL が表示されます。

SOAP Web サービスの起動 URL は次のとおりです。

http://acme:9090/server/<database name>/<web service name>/services

このページには、サービスの WSDL へのリンクが含まれています。

REST Web サービスの起動 URL は次のとおりです。

http://acme:9090/server/<database name>/<web service name>/

この URL にアクセスすると、このサービスによってエクスポートされたビューが表示されます。

REST Web サービスは、 Denodo RESTful Web サービス と同じ方法で呼び出し、IDU (Insert、Delete、および Update) リクエストの処理と、4 つのデータ表現 (HTML、XML、JSON、および RSS) をサポートします。

SAML 認証を使用して Web サービスを呼び出す方法

SAML (Security Assertion Markup Language) 2.0 認証が必要な Web サービスを公開できます。これらのサービスは、「HTTP POST バインド」で ID プロバイダーによって開始される「Web ブラウザー SSO プロファイル」を実装します。

これらのサービスを呼び出す場合、クライアントアプリケーションは SAML アサーションを取得して、このアサーションをリクエストと一緒に REST サービスに送信する必要があります。これらの REST サービスはステートレスであり、セッションをサポートしないため、リクエストごとに 1 つのアサーションが必要です。

Web サービスをデプロイしたら、http://<host name>:9090/server/<database name>/<service name>/resources/metadata.xml でその SAML メタデータを取得できます。

取得するのは、次のような情報です。

<?xml version="1.0" encoding="UTF-8"?>
<md:EntityDescriptor
  xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
  entityID="customer_report_ws_service_provider">

    <md:SPSSODescriptor AuthnRequestsSigned="false"
      WantAssertionsSigned="true"
      protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
        <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>
        <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
        <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat>
        <md:AssertionConsumerService
          Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
          Location="http://acme.denodo.com:9090/server/admin/customer_report_ws/"
          index="0"
          isDefault="true"/>
    </md:SPSSODescriptor>
</md:EntityDescriptor>

「customer_report_ws_service_provider」は、Web サービスの構成の [Service provider ID] フィールドに入力した値です。

「Location」の値は、サーバーのグローバル構成の [SAML 2.0 configuration] ダイアログで [Service provider URL base] フィールドに入力した値 (この例では「http://acme.denodo.com:9090」) に、Denodo Web コンテナーのサービスの相対 URL (「server/admin/customer_report_ws/」) を付加した値です。

Web サービスをデプロイした後、ID プロバイダー (IdP) にサービスを登録します。これを行うには、サービスプロバイダー ID (上記の例では customer_report_ws_service_provider) およびメタデータファイルの URL (つまり http://<host name>:9090/server/<database name>/<service name>/resources/metadata.xml) が必要です。


SAML 認証を使用して Web サービスを呼び出す方法として、以下の 2 つがあります。

  1. ブラウザーから呼び出す

  2. クライアントアプリケーションから呼び出す

ブラウザーから SAML 認証を使用して Web サービスを呼び出す方法

SAML 認証を必要とする REST Web サービスを呼び出すには、以下の手順に従って実施してください。

  1. ブラウザーを開いて、REST サービスではなく ID プロバイダー (IdP) にリクエストを送信する URL を構築します。この URL に、クエリを実行するサービスを含める必要があります。

    ID プロバイダーを呼び出す方法は、ベンダーごとに異なります。たとえば、使用しているベンダーで、REST サービスへのリクエストを URL パラメーター「target」で指定する必要があるとします。この場合、次のようなリクエストを送信する必要があります。

    https://identity_provider.acme.com/idp/profile/SAML2/Unsolicited/SSO?providerId=customer_report_ws_service_provider&target=views%2Fcustomer_report%3Fstate%3DCA

    パラメーター「target」の値は、REST サービスでクエリを実行するリソースの相対 URL (views/customer_reports?state=CA) をエンコードした値です。

  2. ID プロバイダー (IdP) は、このリクエストを受信すると、通常は、ユーザーに資格情報の入力を求めるフォームを表示します。

  3. 資格情報が正しい場合、IdP は、ユーザーが REST サービスにリクエストを送信できる IdP のページにブラウザーをリダイレクトします。

  4. ユーザーはこのページから REST サービスにリクエストを送信します。これは、本文に SAML アサーションを含む POST リクエストです。

  5. Web サービスは、リクエストに含まれる SAML アサーションが有効であることを確認します。つまり、ユーザーがサービスにリクエストを送信することが認可されます。

  6. Web サービスは、SAML アサーションの「Subject」の「NameID」属性からユーザー名を取得し、それを使用してこのユーザーのロールを取得して、このユーザーに認可されている操作を把握します。ロールを取得するプロセスは、 LDAP データベースの場合と同じ です。

プログラムで SAML 認証を使用して Web サービスを呼び出す方法

SAML 認証を必要とする REST サービスにリクエストを送信できるようにするために、アプリケーションは、まず SAML アサーションを取得してから、サービスにリクエストを送信する必要があります。これらの REST サービスはステートレスであるため、リクエストごとに 1 つのアサーションが必要です。

通常、このアプリケーションは、ID プロバイダー (IdP) の API を使用して、このアサーションを取得できます。

ID プロバイダー (IdP) から返される SAML アサーションは、以下の条件を満たす必要があります。満たさない場合、REST サービスに対するリクエストは失敗します。

  • アサーションが署名済みである。

  • アサーションの Subject にパラメーター「NameID」が存在している。サービスはこの値を使用して、[Server administration] > [SAML 2.0 configuration] ダイアログで構成した LDAP サーバーからユーザーのロールを取得します。

  • ベアラーのサブジェクト確認が含まれるアサーションに <AudienceRestriction> エレメントと <Audience> エレメントが存在し、<Audience> エレメントの値が REST サービスの「サービスプロバイダー ID」の値になっている。

サービスに送信されるリクエストは、以下の条件を満たす必要があります。

  • リクエストは、完全な URL ではなく、サービスのルート URL に対する POST リクエストである。

  • HTTP ヘッダー Content-typeapplication/x-www-form-urlencoded である。

  • リクエストの本文に以下の 2 つのフィールドが存在する。

    • RelayState: クエリを実行するリソースの相対 URI

    • SAMLResponse: Base64 でエンコードされた SAML アサーション

SAML 認証を使用するサービスに送信される HTTP リクエストの例
POST /server/admin/customer_report_ws_service_provider/
Content-Type: application/x-www-form-urlencoded

RelayState=views%2Fcustomer%3Fyear%3D2016&SAMLResponse=PD94bWwgdmVyc2lvbj0iMS4wIiBlbm...

この例の説明:

  • リクエストは、サービスのベース URL に送信されます。サービスは「customer_report_ws_service_provider」という名前で、「admin」データベースに存在するので、アプリケーションはこのリクエストを /server/admin/customer_report_ws_service_provider/ に送信します。

  • このリクエストの本文には以下の 2 つの属性が存在します。

    1. RelayState: アクセスするリソースの相対 URL とそのパラメーター。この例では views/customer?year=2016 を URL エンコードした値です。

    2. SAMLResponse: Base64 でエンコードされた SAML アサーション。

SAML アサーションは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:xs="http://www.w3.org/2001/XMLSchema" Destination="http://denodo-dv1-prod.denodo.com:9090/server/admin/internet_inc_ws/" ID="pfxb679929f-a8f8-6f04-1c86-54a6ac2439f0" IssueInstant="2015-03-31T20:08:33.405Z" Version="2.0">
    <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">IdentityProviderNameID</saml2:Issuer>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        .......................
    </ds:Signature>
    <saml2p:Status>
        <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
    </saml2p:Status>
    <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="pfx23d93abd-1269-04f0-1c98-128d396a10d6" IssueInstant="2015-03-31T20:08:33.405Z" Version="2.0">
        <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">IdentityProviderNameID</saml2:Issuer>
        <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
            .......................
        </ds:Signature>
        <saml2:Subject>
            <saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">userName</saml2:NameID>
            <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
                <saml2:SubjectConfirmationData NotOnOrAfter="2015-03-31T20:13:33.405Z" Recipient="http://host:port/endpoint/url/"/>
            </saml2:SubjectConfirmation>
        </saml2:Subject>
        <saml2:Conditions NotBefore="2015-03-31T20:03:33.405Z" NotOnOrAfter="2015-03-31T20:13:33.405Z">
            <saml2:AudienceRestriction>
                <saml2:Audience>internet_inc_service_provider</saml2:Audience>
            </saml2:AudienceRestriction>
        </saml2:Conditions>
        <saml2:AuthnStatement AuthnInstant="2015-03-31T20:08:33.405Z" SessionIndex="id1427832513405.1286465069">
            <saml2:AuthnContext>
                <saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml2:AuthnContextClassRef>
            </saml2:AuthnContext>
        </saml2:AuthnStatement>
    </saml2:Assertion>
</saml2p:Response>

REST/SOAP で公開される Web サービスの型変換を示す表

次の表に、Virtual DataPort のデータ型から SOAP および REST Web サービスのデータ型への変換を示します。これらの型変換は Web サービスの入出力パラメーターを対象とします。

Virtual DataPort のデータ型と Web サービスのデータ型との間の変換

Virtual DataPort のデータ型

SOAP Web サービスのデータ型

REST Web サービスのデータ型

blob

xsd:hexBinary

xsd:hexBinary

boolean

xsd:boolean

xsd:boolean

date

xsd:date または xsd:dateTime

xsd:date または xsd:dateTime

decimal

xsd:decimal

xsd:decimal

double

xsd:double

xsd:double

float

xsd:float

xsd:float

int

xsd:int

xsd:int

long

xsd:long

xsd:long

text

xsd:string

xsd:string

xml

xsd:string

xsd:string

array

soapenc:Array

xsd:complexType (sequence)

register

soapenc:complexType (sequence)

xsd:complexType (sequence)