מדיניות SOAPMessageAuthentication

אתם צופים במסמכי העזרה של Apigee Edge.
כניסה למסמכי העזרה של Apigee X.
info

המדיניות SOAPMessageValidation מבצעת את הפעולות הבאות:

  • אימות של כל הודעת XML מול סכימות ה-XSD שלה
  • אימות הודעות SOAP בהתאם להגדרת WSDL
  • בדיקה של תקינות ההגדרות של הודעות JSON ו-XML

השם של המדיניות הזו בממשק המשתמש הוא 'אימות הודעות SOAP', אבל המדיניות מאמתת לא רק הודעות SOAP. בקטע הזה המדיניות נקראת 'מדיניות אימות הודעות'.

רכיב <MessageValidation>

הגדרת המדיניות של אימות ההודעות.

ערך ברירת המחדל בכרטיסייה מדיניות ברירת מחדל שבהמשך
חובה? אופציונלי
סוג אובייקט מורכב
רכיב הורה לא רלוונטי
רכיבי הצאצאים <DisplayName>
<Element>
<ResourceURL>
<SOAPMessage>
<Source>

תחביר

רכיב <MessageValidation> כולל את התחביר הבא:

<MessageValidation
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
    <!-- All MessageValidation child elements are optional -->
    <DisplayName>policy_display_name</DisplayName>
    <Element namespace="element_namespace">element_to_validate</Element>
    <SOAPMessage version="[ 1.1 | 1.2 | 1.1/1.2 ]"/>
    <Source>message_to_validate</Source>
    <ResourceURL>validation_WSDL_or_XSD</ResourceURL>

</MessageValidation>

מדיניות ברירת המחדל

בדוגמה הבאה מוצגות הגדרות ברירת המחדל כשמוסיפים מדיניות של אימות הודעות לתהליך בממשק המשתמש של Edge:

<MessageValidation continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
  <DisplayName>SOAP Message Validation-1</DisplayName>
  <Properties/>
  <Element namespace="http://sample.com">sampleObject</Element>
  <SOAPMessage/>
  <Source>request</Source>
  <ResourceURL>wsdl://SOAP-Message-Validation-1.wsdl</ResourceURL>
</MessageValidation>

לרכיב הזה יש את המאפיינים הבאים, המשותפים לכל כללי המדיניות:

מאפיין ברירת מחדל חובה? תיאור
name לא רלוונטי נדרש

השם הפנימי של המדיניות. הערך של המאפיין name יכול להכיל אותיות, מספרים, רווחים, מקפים, קווים תחתונים ונקודות. האורך המקסימלי של הערך הוא 255 תווים.

אפשר להשתמש ברכיב <DisplayName> כדי להוסיף תווית למדיניות בכלי לעריכת שרת proxy של ממשק המשתמש לניהול, ולהשתמש בשם אחר בשפה טבעית.

continueOnError false אופציונלי צריך להגדיר את הערך 'False' כדי להחזיר שגיאה כשהמדיניות נכשלת. זו התנהגות צפויה ברוב סוגי המדיניות. הערך של הפרמטר הוא TRUE כדי שביצוע הפעולות יתבצע גם אחרי שמדיניות תיכשל.
enabled true אופציונלי כדי לאכוף את המדיניות צריך להגדיר את הערך True. מגדירים את המדיניות כ-"false" כדי "להשבית" את המדיניות. המדיניות הזו לא תיאכף גם אם היא תצורף לתהליך.
async   false הוצא משימוש המאפיין הזה הוצא משימוש.

דוגמאות

בדוגמאות הבאות מפורטות כמה מהדרכים שבהן אפשר להשתמש במדיניות של אימות ההודעות:

1: אימות XSD

אפשר להשתמש במדיניות האימות של הודעות כדי לאמת את עומס העבודה של בקשת הודעת ה-XML באמצעות סכימת XSD.

  1. יוצרים קובץ משאב חדש בפורמט XSD. לדוגמה, "note-schema.xsd":
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="note">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="to" type="xs:string"/>
            <xs:element name="from" type="xs:string"/>
            <xs:element name="heading" type="xs:string"/>
            <xs:element name="body" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  2. מוסיפים את המדיניות של אימות הודעות SOAP לתהליך המקדים של נקודת הקצה של שרת ה-proxy:
    1. מציינים את המיקום של קובץ המשאב XSD באמצעות הרכיב <ResourceURL>. לדוגמה:
      ...
        <ResourceURL>xsd://note-schema.xsd</ResourceURL>
      ...
    2. מסירים את הרכיבים <SOAPMessage> ו-<Element> מהגדרת המדיניות.

    הגדרת המדיניות אמורה להיראות כך:

    <MessageValidation continueOnError="false"
        enabled="true" name="validateXMLRequest">
      <DisplayName>My XML Validator</DisplayName>
      <Properties/>
      <Source>request</Source>
      <ResourceURL>xsd://note-schema.xsd</ResourceURL>
    </MessageValidation>
  3. שולחים בקשת POST לשרת proxy של ה-API, עם ה-XML כמטען הייעודי של ההודעה, כמו בדוגמה הבאה:
    curl -v -X POST -H 'Content-Type: application/xml' http://my-test.apigee.net/v1/xsd-mock
      -d '<note>
      <to>Fred Rogers</to>
      <from>Nick Danger</from>
      <heading>Greetings from my neighborhood</heading>
      <body>Just writing to say hello.</body>
    </note>'

    שימו לב שהכותרת Content-type מוגדרת ל-'application/xml'.

    אפשר גם ליצור קובץ נתונים של עומס העבודה ולהפנות אליו באמצעות פקודה שדומה לפקודה הבאה:

    curl -v -X POST -H 'Content-type: application/xml' http://my-test.apigee.net/v1/xsd-mock
      --data '@../examples/note-payload.xml'

אמורה להתקבל תגובה מסוג HTTP 200. בהתאם לנקודת הקצה של היעד, יכול להיות שתקבלו פרטים נוספים על הבקשה. לדוגמה, אם משתמשים ב-http://httpbin.org/post בתור נקודת הקצה היעד ומציינים פלט -v (מפורט), התגובה אמורה להיות דומה לדוגמה הבאה:

< HTTP/1.1 200 OK
< Date: Wed, 16 May 2018 21:24:54 GMT
< Content-Type: application/xml
< Content-Length: 431
< Connection: keep-alive
< Server: gunicorn/19.8.1
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
< Via: 1.1 vegur
{
  "args":{},
  "data":"<note><to>fred</to><from>nick</from><heading>hello</heading>
    <body>Just writing to say hello.</body></note>",
  "files":{},
  "form":{},
  "headers": {
    "Accept":"*/*",
    "Connection":"close",
    "Content-Length":"106",
    "Content-Type":"application/xml",
    "Host":"httpbin.org",
    "User-Agent":"curl/7.58.0"
  },
  "json":null,
  "origin":"10.1.1.1, 104.154.179.1",
  "url":"http://httpbin.org/post"
}

כדי לוודא שהאימות של XSD פועל, נסו להוסיף תג נוסף לגוף הבקשה. לדוגמה:

curl -v -X POST -H 'Content-Type: application/xml' http://my-test.apigee.net/v1/xsd-mock
  -d '<note>
  <to>Fred Rogers</to>
  <from>Nick Danger</from>
  <heading>Greetings from my neighborhood</heading>
  <body>Just writing to say hello.</body>
  <badTag>Not good</badTag>
</note>'

אמורה להופיע שגיאת אימות.

2: אימות SOAP

אפשר להשתמש במדיניות האימות של הודעות כדי לאמת את עומס העבודה של בקשת הודעת ה-SOAP מול WSDL.

  1. יוצרים קובץ משאב חדש של WSDL. לדוגמה, ‎"example-wsdl.wsdl":
  2. מוסיפים את המדיניות של אימות הודעות SOAP לתהליך המקדים של נקודת הקצה של שרת ה-proxy:
    1. מגדירים את המאפיין version של האלמנט <SOAPMessage> לגרסה של פרוטוקול SOAP שרוצים לאמת אותה. לדוגמה, "1.1":
      ...
        <SOAPMessage version="1.1"/>
      ...
    2. מגדירים את הערך של הרכיב <Element> לרכיב שרוצים לאמת:
      ...
        <Element namespace="https://example.com/gateway">getID</Element>
      ...

      <Element> מציין את הצאצא הראשון שמתחת לאלמנט <Body> בתוך המעטפה של בקשת ה-SOAP.

      מגדירים את המאפיין namespace למרחב השמות של הצאצא הזה.

    3. מציינים את המיקום של קובץ המשאב WSDL באמצעות הרכיב <ResourceURL>. לדוגמה:
      ...
        <ResourceURL>wsdl://example-wsdl.wsdl</ResourceURL>
      ...

    הגדרת המדיניות אמורה להיראות כך:

    <MessageValidation continueOnError="false"
        enabled="true" name="validateSOAPRequest">
      <DisplayName>My SOAP Validator</DisplayName>
      <Properties/>
      <Source>request</Source>
      <SOAPMessage version="1.1"/>
      <Element namespace="https://example.com/gateway">getID</Element>
      <ResourceURL>wsdl://example-wsdl.wsdl</ResourceURL>
    </MessageValidation>
  3. שולחים בקשת POST לשרת proxy של ה-API, עם מעטפת ה-SOAP בתור המטען הייעודי של ההודעה, כפי שמתואר בדוגמה הבאה:
    curl -v -X POST -H 'Content-Type: application/xml' http://my-test.apigee.net/v1/xsd-mock
      -d '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:prox="https://example.com/gateway" xmlns:typ="https://example.com/gateway/types">
      <soapenv:Header/>
      <soapenv:Body>
        <prox:getID>
          <typ:MyType>
            <typ:ID>42</typ:ID>
          </typ:MyType>
        </prox:getID>
      </soapenv:Body>
    </soapenv:Envelope>'

    שימו לב שהכותרת Content-type מוגדרת ל-'application/xml'.

    אפשר גם ליצור קובץ נתונים של עומס העבודה ולהפנות אליו באמצעות פקודה שדומה לפקודה הבאה:

    curl -v -X POST -H 'Content-type: application/xml' http://my-test.apigee.net/v1/xsd-mock
      --data '@../examples/soap-payload.xml'

אמורה להתקבל תגובה מסוג HTTP 200. בהתאם לנקודת הקצה של היעד, יכול להיות שתקבלו פרטים נוספים על הבקשה. לדוגמה, אם משתמשים ב-http://httpbin.org/post כנקודת הקצה היעד, התגובה אמורה להיראות כך:

< HTTP/1.1 200 OK
< Date: Wed, 16 May 2018 21:24:54 GMT
< Content-Type: application/xml
< Content-Length: 431
< Connection: keep-alive
< Server: gunicorn/19.8.1
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
< Via: 1.1 vegur
{
  "args":{},
  "data":"<note><to>fred</to><from>nick</from><heading>hello</heading>
    <body>Just writing to say hello.</body></note>",
  "files":{},
  "form":{},
  "headers": {
    "Accept":"*/*",
    "Connection":"close",
    "Content-Length":"106",
    "Content-Type":"application/xml",
    "Host":"httpbin.org",
    "User-Agent":"curl/7.58.0"
  },
  "json":null,
  "origin":"10.1.1.1, 104.154.179.1",
  "url":"http://httpbin.org/post"
}

3: XML/JSON בפורמט תקין

אפשר להשתמש במדיניות האימות של הודעות כדי לוודא שהמטען של הודעה בפורמט JSON או XML בנוי בצורה תקינה (לא זהה לאימות). המדיניות הזו מבטיחה שהמבנה והתוכן עומדים בסטנדרטים המקובלים, כולל:

  • יש רכיב בסיס יחיד
  • התוכן לא מכיל תווים לא חוקיים
  • אובייקטים ותגים מוערמים בצורה נכונה
  • התגים של ההתחלה והסיום תואמים

כדי לבדוק אם מטען הייעודי (payload) של ה-XML או ה-JSON תקין:

  1. מוסיפים את המדיניות של אימות הודעות SOAP לתהליך המקדים של נקודת הקצה של שרת ה-proxy.
  2. מסירים מההגדרה של המדיניות את הרכיבים <ResourceURL>,‏ <SOAPMessage> ו-<Element>.

    הגדרת המדיניות אמורה להיראות כך:

    <MessageValidation async="false" continueOnError="false"
        enabled="true" name="validateXMLRequest">
      <DisplayName>My JSON Checker</DisplayName>
      <Properties/>
      <Source>request</Source>
    </MessageValidation>
  3. שולחים בקשת POST לשרת ה-proxy של ה-API, כמו בדוגמה הבאה:
    curl -v -X POST -H 'Content-Type: application/json' http://my-test.apigee.net/v1/xsd-mock
      -d '{
    "note": {
      "to": "Fred Rogers",
      "from": "Nick Danger",
      "header": "Greetings from my neighborhood",
      "body": "Just writing to say hello."
      }
    }'

    שימו לב שהכותרת Content-type מוגדרת ל-'application/json'.

    כדי לבדוק אם קובץ XML תקין, משתמשים ב-XML כמטען של ההודעה ומגדירים את Content-type לערך 'application/xml'.

אמורה להתקבל תגובה מסוג HTTP 200. כששולחים עומס נתונים של הודעה שלא מכיל XML או JSON בפורמט תקין, אמורה להופיע הודעת השגיאה steps.messagevalidation.Failed.

הפניה לרכיב הצאצא

בקטע הזה מתוארים רכיבי הצאצאים של <MessageValidation>.

<DisplayName>

אפשר להשתמש במאפיין name כדי לתייג את המדיניות בכלי העריכה של שרת ה-proxy בממשק המשתמש לניהול, בשם שונה שנשמע טבעי יותר.

הרכיב <DisplayName> הוא משותף לכל כללי המדיניות.

ערך ברירת המחדל לא רלוונטי
חובה? זה שינוי אופציונלי. אם משמיטים את <DisplayName>, המערכת משתמשת בערך של המאפיין name במדיניות
סוג מחרוזת
רכיב הורה <PolicyElement>
רכיבי הצאצאים ללא

רכיב <DisplayName> כולל את התחביר הבא:

תחביר

<PolicyElement>
  <DisplayName>policy_display_name</DisplayName>
  ...
</PolicyElement>

דוגמה

<PolicyElement>
  <DisplayName>My Validation Policy</DisplayName>
</PolicyElement>

לאלמנט <DisplayName> אין מאפיינים או רכיבי צאצא.

<Element>

מציין את הרכיב בהודעה שרוצים לאמת. זהו הצאצא הראשון שמופיע מתחת לאלמנט <Body> בתוך המעטפה של בקשת ה-SOAP.

ערך ברירת המחדל sampleObject
חובה? אופציונלי
סוג מחרוזת
רכיב הורה <MessageValidation>
רכיבי הצאצאים ללא

רכיב <Element> כולל את התחביר הבא:

תחביר

...
  <Element namespace="element_namespace">element_to_validate</Element>
...

דוגמה 1

בדוגמה הבאה מוגדר רכיב יחיד שצריך לאמת:

...
<Element namespace="https://example.com/gateway">getID</Element>
...

דוגמה 2

כדי לציין יותר מרכיב אחד לאימות, מוסיפים כמה רכיבי <Element>:

...
<Element namespace="https://example.com/gateway">getID</Element>
<Element namespace="https://example.com/gateway">getDetails</Element>
...

לרכיב <Element> יש את המאפיינים הבאים:

מאפיין ברירת מחדל חובה? תיאור
namespace ‎"http://sample.com"‎ אופציונלי הגדרת מרחב השמות של הרכיב שרוצים לאמת.

<ResourceURL>

מזהה את הסכימה של XSD או את ההגדרה של WSDL שישמשו לאימות הודעת המקור.

ערך ברירת המחדל wsdl://display_name.wsdl
חובה? אופציונלי
סוג מחרוזת
רכיב הורה <MessageValidation>
רכיבי הצאצאים ללא

רכיב <ResourceURL> כולל את התחביר הבא:

תחביר

...
  <ResourceURL>[wsdl|xsd]://validation_WSDL_or_XSD</ResourceURL>
...

דוגמאות

בקובץ XML:

...
<ResourceURL>xsd://note-schema.xsd</ResourceURL>
...

עבור WSDL:

...
<ResourceURL>wsdl://example-wsdl.wsdl</ResourceURL>
...

הערך של <ResourceURL> חייב להפנות לקובץ משאבים בשרת ה-proxy של ה-API. לא ניתן להפנות למשאבים חיצוניים דרך HTTP או HTTPS.

אם לא מציינים ערך ל-<ResourceURL>, המערכת בודקת אם ההודעה בפורמט JSON או XML תקין, אם הכותרת Content-type היא 'application/json' או 'application/xml', בהתאמה.

לאלמנט <ResourceURL> אין רכיבי צאצא או מאפיינים.

שימוש ב-XSD לאימות

אם עומס העבודה של ה-XML שאתם מאמתים באמצעות מדיניות אימות ההודעות מפנה לסכימה אחרת, עליכם להוסיף את הקידומת xsd למאפיין schemaLocation בקובץ ה-XSD המצורף.

הסכימה לדוגמה הבאה מורכבת מכמה קובצי XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:include schemaLocation="xsd://note-schema.xsd"/>
  <xs:include schemaLocation="xsd://letter-schema.xsd"/>
  <xs:include schemaLocation="xsd://user-schema.xsd"/>
</xs:schema>

שימוש ב-WSDL לאימות

ב-WSDL צריך להגדיר סכימה אחת לפחות. אם לא מצוין בהפניה לסכימה אחת לפחות, מדיניות אימות ההודעות נכשלת.

עומק הייבוא המקסימלי של סכימה הוא 10. אם תחרגו מהמספר הזה של ייבוא בתצוגת עץ, המדיניות של אימות ההודעות תיכשל.

<SOAPMessage>

הגדרה של גרסת ה-SOAP שבה מתבצע האימות של מדיניות אימות ההודעות.

ערך ברירת המחדל לא רלוונטי
חובה? אופציונלי
סוג לא רלוונטי
רכיב הורה <MessageValidation>
רכיבי הצאצאים ללא

רכיב <SOAPMessage> כולל את התחביר הבא:

תחביר

...
  <SOAPMessage version="[ 1.1 | 1.2 | 1.1/1.2 ]"/>
...

דוגמה

...
<SOAPMessage version="1.1"/>
...

לרכיב <SOAPMessage> יש את המאפיינים הבאים:

מאפיין ברירת מחדל חובה? תיאור
version ללא אופציונלי גרסת ה-SOAP שבה המדיניות הזו משתמשת כדי לאמת הודעות SOAP.

הערכים החוקיים כוללים:

  • '1.1'
  • '1.2'
  • '1.1/1.2'

מידע נוסף זמין במאמר מ-SOAP/1.1 ל-SOAP גרסה 1.2 ב-9 נקודות.

<Source>

מזהה את הודעת המקור שצריך לאמת. הערך של הרכיב הזה הוא שם ההודעה שרוצים לאמת.

אם לא תגדירו את <Source>, ערך ברירת המחדל של המדיניות הזו יהיה 'message', שמתייחס להודעת הבקשה המלאה (בתהליך הבקשה) או להודעת התגובה המלאה (בתהליך התגובה), כולל עומס העבודה. אפשר גם להגדיר אותו באופן מפורש כ-'בקשה' או 'תשובה' כדי להפנות לבקשה או לתשובה.

ערך ברירת המחדל בקשה
חובה? אופציונלי
סוג מחרוזת
רכיב הורה <MessageValidation>
רכיבי הצאצאים ללא

רכיב <Source> כולל את התחביר הבא:

תחביר

...
  <Source>message_to_validate</Source>
...

דוגמה

...
<Source>request</Source>
...

בנוסף לאפשרויות 'message', 'request' ו-'response', אפשר להגדיר את הערך של <Source> לשם של כל הודעה בתהליך. עם זאת, אם תעשו זאת, תצטרכו ליצור הודעה בהתאמה אישית עם השם הזה בתהליך לפני שהמדיניות הזו תתבצע. אחרת, תוצג הודעת שגיאה.

אם לא ניתן לפתור את הערך של <Source> בתהליך העברת ההודעה, או שהוא מוגדר כסוג שאינו הודעה, מתרחש אחד מהאירועים הבאים:

  • אם הערך הוא null: ב-Edge תוצג שגיאה מסוג steps.messagevalidation.SourceMessageNotAvailable.
  • אם מדובר בסוג שאינו הודעת: Edge יוצר שגיאה מסוג steps.messagevalidation.NonMessageVariable.

לאלמנט <Source> אין מאפיינים או רכיבי צאצא.

קודי שגיאה

השגיאות שמוחזרות ממדיניות Edge עומדות בפורמט עקבי, כפי שמתואר בחומר העזר בנושא קודי שגיאה.

בקטע הזה מתוארים קודי התקלות והודעות השגיאה שמוחזרים, ומשתני השגיאה שמוגדרים על ידי Edge כשהמדיניות הזו גורמת לשגיאה. חשוב לדעת אם אתם מפתחים כללים לתיקון תקלות. מידע נוסף זמין במאמר מה צריך לדעת על שגיאות מדיניות ועל טיפול בפגמים.

שגיאות בזמן ריצה

השגיאות האלה יכולות להתרחש כשהמדיניות מופעלת.

קוד שגיאה סטטוס HTTP סיבה תיקון
steps.messagevalidation.SourceMessageNotAvailable 500

השגיאה הזו מתרחשת אם משתנה שצוין ברכיב <Source> של המדיניות הוא:

  • מחוץ להיקף (לא זמין בתהליך הספציפי שבו המדיניות מיושמת)
  • או
  • לא ניתן לפענח (אינו מוגדר)
steps.messagevalidation.NonMessageVariable 500

השגיאה הזו מתרחשת אם הרכיב <Source> במדיניות SOAPMessageAuthentication מוגדר למשתנה שאינו מסוג message.

משתנים של סוגי הודעות מייצגים את כל הבקשות והתגובות של HTTP. משתני הזרימה המובנים של Edge request, response ו-message הם מסוג הודעה. מידע נוסף על משתני הודעות זמין בחומר העזר בנושא משתנים.

steps.messagevalidation.Failed 500 השגיאה הזו מתרחשת אם המדיניות SOAPMessageValidation לא מאמתת את המטען הייעודי (payload) של הודעת הקלט מול סכימת XSD או ההגדרה של WSDL. זה יקרה גם אם בהודעת המטען הייעודי (payload) יש JSON או XML לא תקינים.

שגיאות בפריסה

השגיאות האלה יכולות להתרחש כשפורסים שרת proxy שכולל את המדיניות הזו.

שם השגיאה סיבה תיקון
InvalidResourceType הרכיב <ResourceURL> במדיניות SOAPMessageValidation מוגדר לסוג משאב שלא נתמך במדיניות.
ResourceCompileFailed סקריפט המשאב שמפנה לרכיב <ResourceURL> במדיניות SOAPMessageValidation מכיל שגיאה שמונעת את ההידור שלו.
RootElementNameUnspecified הרכיב <Element> במדיניות SOAPMessageValidation לא מכיל את השם של רכיב הבסיס.
InvalidRootElementName הרכיב <Element> במדיניות SOAPMessageValidation מכיל שם של רכיב בסיס שלא תואם לכללי ה-XML למתן שמות חוקיים לרכיבים.

סכימות

כל סוג מדיניות מוגדר על ידי סכימת XML (.xsd). לידיעתכם, סכמות של מדיניות זמינות ב-GitHub.

נושאים קשורים