אבטחת API באמצעות OAuth

כרגע מוצג התיעוד של Apigee Edge.
כניסה למסמכי התיעוד של Apigee X.
מידע

מה תלמדו

  • מורידים ופורסים שרת proxy לדוגמה של API.
  • יצירת שרת proxy ל-API המוגן באמצעות OAuth.
  • יוצרים מוצר, מפתח ואפליקציה.
  • החלפת פרטי הכניסה באסימון גישה מסוג OAuth.
  • מפעילים API עם אסימון גישה.

במדריך הזה תלמדו איך לאבטח API באמצעות OAuth 2.0.

OAuth הוא פרוטוקול הרשאה שמאפשר לאפליקציות לגשת למידע בשמם של משתמשים, בלי לדרוש מהמשתמשים לחשוף את שם המשתמש והסיסמה שלהם.

כשמשתמשים ב-OAuth, המערכת ממירה את פרטי הכניסה לאבטחה (כמו שם משתמש/סיסמה או מפתח/סוד) באסימון גישה. לדוגמה:

joe:joes_password (שם משתמש:סיסמה) או
Nf2moHOASMJeUmXVdDhlMbPaXm2U7eMc:unUOXYpPe74ZfLEb (מפתח:סוד)

יהפוך למשהו כזה:

b0uiYwjRZLEo4lEu7ky2GGxHkanN

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

במפרט OAuth 2.0 מוגדרים מנגנונים שונים, שנקראים "סוגי הרשאות", להפצת אסימוני גישה לאפליקציות. סוג המענק הבסיסי ביותר שמוגדר על ידי OAuth 2.0 נקרא 'פרטי כניסה של לקוח'. בסוג ההרשאה הזה, אסימוני הגישה ל-OAuth נוצרים בתמורה לפרטי הכניסה של הלקוח, שהם צמדים של מפתח צרכן/סוד צרכן, כמו בדוגמה שלמעלה.

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

  • Call API proxy 1 כדי ליצור אסימון גישה מסוג OAuth מפרטי הכניסה של הלקוח. מדיניות OAuth v2.0 על שרת ה-API של שרת ה-proxy מטפלת בבעיה הזו.
  • קוראים לשרת proxy 2 של ה-API כדי לשלוח את אסימון הגישה ל-OAuth בקריאה ל-API. שרת ה-API של ה-API מאמת את אסימון הגישה באמצעות מדיניות OAuth v2.0.

מה הדרישות כדי להצטרף לתוכנית?

  • חשבון Apigee Edge. אם עדיין אין לך חשבון, אפשר להירשם להנחיות במאמר יצירת חשבון Apigee Edge.
  • cURL שמותקנת במחשב כדי לבצע קריאות ל-API משורת הפקודה.

מורידים ופורסים שרת proxy ליצירת אסימונים של API

בשלב הזה יוצרים את שרת ה-API של שרת ה-API שיוצר אסימון גישה ל-OAuth ממפתח צרכן וסוד צרכן שנשלח בקריאה ל-API. Apigee מספקת שרת proxy לדוגמה של API שעושה זאת. עכשיו תצטרכו להוריד ולפרוס את שרת ה-proxy, ואז להשתמש בו מאוחר יותר במדריך. (תוכלו לבנות את שרת ה-API הזה בקלות) בעצמכם. שלב ההורדה והפריסה נועד לנוחיותכם, וכדי להראות לכם כמה קל לשתף שרתי proxy שכבר נוצרו.)

  1. יש להוריד את קובץ ה-ZIP של שרת ה-API לדוגמה מסוג 'oauth' לספרייה כלשהי במערכת הקבצים שלך.
  2. עוברים לכתובת https://apigee.com/edge ונכנסים לחשבון.
  3. בסרגל הניווט הימני, בוחרים באפשרות פיתוח > שרתי proxy של API.
  4. לוחצים על + שרת Proxy.
    לחצן ליצירת שרת proxy
  5. באשף יצירת שרת proxy, לוחצים על העלאת חבילה של שרת proxy.
  6. בוחרים את הקובץ oauth.zip שהורדתם ולוחצים על הבא.
  7. לוחצים על יצירה.
  8. בסיום ה-build, לוחצים על Edit proxy כדי להציג את שרת ה-Proxy החדש בעורך ה-API של שרת ה-proxy.
  9. בדף הסקירה הכללית של עורך ה-API של שרת ה-API, לוחצים על התפריט הנפתח פריסה ובוחרים באפשרות בדיקה. זוהי סביבת הבדיקה בארגון.

    בהודעה לאישור, לוחצים על פריסה.
    כשלוחצים שוב על התפריט הנפתח 'פריסה', מופיע סמל ירוק שמציין ששרת ה-Proxy נפרס בסביבת הבדיקה.

כל הכבוד! הורדת ופרסת בהצלחה שרת proxy של ממשק API שיוצר אסימוני גישה לארגון שלך ב-Edge.

הצגת התהליך והמדיניות של OAuth

נבחן מקרוב את התוכן של שרת proxy ל-API.

  1. בעורך ה-API של שרת ה-proxy, לוחצים על הכרטיסייה פיתוח. בחלונית הניווט השמאלית יוצגו שני כללי מדיניות. יופיעו גם שני זרימות POST בקטע Proxy Endpoints.
  2. לוחצים על AccessTokenClientCredential בקטע Proxy Endpoints.

    בתצוגת קוד ה-XML יופיע Flow בשם AccessTokenClientCredential:

    <Flow name="AccessTokenClientCredential">
        <Description/>
        <Request>
            <Step>
                <Name>GenerateAccessTokenClient</Name>
            </Step>
        </Request>
        <Response/>
        <Condition>(proxy.pathsuffix MatchesPath "/accesstoken") and (request.verb = "POST")</Condition>
    </Flow>
    

    זרימה היא שלב עיבוד בשרת proxy ל-API. במקרה כזה, הזרימה מופעלת כשתנאי מסוים מתקיים (התהליך הזה נקרא זרימה מותנה). התנאי, שמוגדר ברכיב <Condition>, אומר שאם מתבצעת קריאה לשרת ה-proxy של ה-API למשאב /accesstoken, והפועל של הבקשה הוא POST, אז מריץ את המדיניות GenerateAccessTokenClient, שיוצרת את אסימון הגישה.

  3. עכשיו נסתכל על המדיניות שהתהליך המותנה יפעיל. לוחצים על סמל המדיניות GenerateAccessTokenClient בתרשים הזרימה.

    תצורת ה-XML הבאה נטענת לתצוגת הקוד:

    <OAuthV2 name="GenerateAccessTokenClient">
        <!-- This policy generates an OAuth 2.0 access token using the client_credentials grant type -->
        <Operation>GenerateAccessToken</Operation>
        <!-- This is in millseconds, so expire in an hour -->
        <ExpiresIn>3600000</ExpiresIn>
        <SupportedGrantTypes>
            <!-- This part is very important: most real OAuth 2.0 apps will want to use other
             grant types. In this case it is important to NOT include the "client_credentials"
             type because it allows a client to get access to a token with no user authentication -->
            <GrantType>client_credentials</GrantType>
        </SupportedGrantTypes>
        <GrantType>request.queryparam.grant_type</GrantType>
        <GenerateResponse/>
    </OAuthV2>
    

    ההגדרה כוללת את הפריטים הבאים:

    • הערך <Operation>, שיכול להיות אחד מהערכים המוגדרים מראש, מגדיר מה המדיניות אמורה לעשות. במקרה הזה, המערכת תיצור אסימון גישה.
    • התוקף של האסימון יפוג שעה אחת (3600,000 אלפיות השנייה) אחרי שנוצר.
    • בחודש <SupportedGrantTypes>, השימוש הצפוי ב-<GrantType> של OAuth הוא client_credentials (החלפת מפתח צרכן וסוד באסימון OAuth).
    • רכיב <GrantType> השני מורה למדיניות איפה לחפש בקריאה ל-API לגבי הפרמטר של סוג המענק, כפי שנדרש במפרט OAuth 2.0. (תוכלו לראות את זה בקריאה ל-API מאוחר יותר). אפשר לשלוח את סוג ההרשאה גם בכותרת ה-HTTP (request.header.grant_type) או כפרמטר של טופס (request.formparam.grant_type).

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

  • יוצרים את שרת ה-API של ה-API שאותו אתם רוצים לאבטח באמצעות OAuth.
  • עליך ליצור עוד כמה פריטי מידע שנוצרו בתהליך פיתוח (Artifact) שיובילו ליצירת מפתח הצרכן וסוד הצרכן שנדרשים כדי להחליף אסימון גישה.

יצירת שרת proxy ל-API המוגן באמצעות OAuth

מידע על 'יעד מדומה'

שירות mocktarget מתארח ב-Apigee ומחזיר נתונים פשוטים. למעשה, אפשר לגשת אליו בדפדפן אינטרנט. כדי לנסות זאת:

http://mocktarget.apigee.net/ip

היעד מחזיר את מה שאתה אמור לראות בסופו של דבר כשאתה קורא לשרת proxy זה ל-API.

בנוסף, בכתובת http://mocktarget.apigee.net/help אפשר לראות משאבי API אחרים שזמינים ב-mocktarget.

עכשיו אתם עומדים ליצור את שרת ה-API של ה-API שעליו רוצים להגן. זוהי הקריאה ל-API שמחזירה את הערך הרצוי. במקרה כזה, שרת ה-proxy של ה-API יקרא לשירות mocktarget של Apigee כדי להחזיר את כתובת ה-IP שלך. אבל אפשר לראות אותה רק אם מעבירים אסימון גישה תקין מסוג OAuth בקריאה ל-API.

שרת ה-proxy של ה-API שנוצר כאן יכלול מדיניות שבודקת בבקשה אסימון OAuth.

  1. בסרגל הניווט הימני, בוחרים באפשרות פיתוח > שרתי proxy של API.
  2. לוחצים על + שרת Proxy.
    לחצן ליצירת שרת proxy
  3. באשף בניית שרת Proxy, בוחרים באפשרות הפוך שרת Proxy (הנפוץ ביותר) ולוחצים על הבא.
  4. מגדירים את שרת ה-Proxy באמצעות האפשרויות הבאות:
    בשדה הזה עשה זאת
    שם שרת Proxy הזנת: helloworld_oauth2
    נתיב הבסיס של הפרויקט

    שינוי ל: /hellooauth2

    הנתיב של בסיס הפרויקט הוא חלק מכתובת ה-URL שמשמשת לשליחת בקשות לשרת ה-proxy של ה-API.

    API קיים

    הזנת: https://mocktarget.apigee.net/ip

    השדה הזה מגדיר את כתובת ה-URL של היעד ש-Apigee Edge מפעיל בבקשה לשרת proxy של API.

    תיאור הזנת: hello world protected by OAuth
  5. לוחצים על הבא.
  6. בדף כללי מדיניות נפוצים:
    בשדה הזה עשה זאת
    אבטחה: הרשאה בוחרים באפשרות: OAuth 2.0
  7. לוחצים על הבא.
  8. בדף מארחים וירטואליים, לוחצים על הבא.
  9. בדף Build, מוודאים שסביבת test מסומנת ולוחצים על Create and Deploy (יצירה ופריסה).
  10. בדף Summary (סיכום), תופיע אישור על כך ששרת ה-Proxy החדש של ה-API נוצר בהצלחה, וששרת ה-Proxy של ה-API נפרס בסביבת הבדיקה.
  11. לוחצים על עריכת שרת ה-proxy כדי להציג את הדף סקירה כללית של שרת ה-API של שרת ה-proxy.
    חשוב לשים לב שהפעם שרת ה-proxy של ה-API נפרס באופן אוטומטי. לוחצים על התפריט הנפתח 'פריסה' כדי לוודא שיש נקודת פריסה ירוקה ליד סביבת הבדיקה.

הצגת המדיניות

בואו נסתכל על זה יותר לעומק.

  1. בעורך ה-API של שרת ה-proxy, לוחצים על הכרטיסייה פיתוח. תראו שנוספו שני כללי מדיניות לזרימת הבקשות של שרת ה-proxy של ה-API:
    • אימות אסימון גישה לגרסה 2.0 של OAuth – הפונקציה בודקת את הקריאה ל-API כדי לוודא שקיים אסימון OAuth תקף.
    • Remove Header Authorization – מדיניות של assignMessage, שמסירה את אסימון הגישה אחרי שנבדק, כך שהוא לא מועבר לשירות היעד. (אם שירות היעד היה זקוק לאסימון הגישה ל-OAuth, לא הייתם משתמשים במדיניות הזו).
  2. לוחצים על הסמל Verify OAuth v2.0 Access Token בתצוגת התהליך ובודקים את קוד ה-XML שמתחתיו בחלונית הקוד.

    <OAuthV2 async="false" continueOnError="false" enabled="true" name="verify-oauth-v2-access-token">
        <DisplayName>Verify OAuth v2.0 Access Token</DisplayName>
        <Operation>VerifyAccessToken</Operation>
    </OAuthV2>
    

    שימו לב שהערך של <Operation> הוא VerifyAccessToken. הפעולה מגדירה מה המדיניות אמורה לעשות. במקרה כזה, תתבצע בדיקה אם הבקשה מכילה אסימון OAuth חוקי.

הוספת מוצר של API

כדי להוסיף מוצר API באמצעות ממשק המשתמש של Apigee:

  1. בוחרים באפשרות פרסום > מוצרי API.
  2. לוחצים על +מוצר API.
  3. מזינים את פרטי המוצר של מוצר ה-API.
    שדה התיאור
    שם שם פנימי של מוצר ה-API. אין לציין תווים מיוחדים בשם.
    הערה: לא ניתן לערוך את השם לאחר יצירת מוצר ה-API. לדוגמה, helloworld_oauth2-Product
    השם המוצג השם המוצג של מוצר ה-API. השם המוצג מופיע בממשק המשתמש, ואפשר לערוך אותו בכל שלב. אם לא יצוין ערך, המערכת תשתמש בערך 'שם'. השדה הזה מתמלא באופן אוטומטי באמצעות הערך 'שם'. ניתן לערוך או למחוק את התוכן שלו. השם המוצג יכול לכלול תווים מיוחדים. לדוגמה, helloworld_oauth2-Product.
    התיאור תיאור המוצר של ה-API.
    סביבה סביבות שאליהן מוצר ה-API יאפשר גישה. צריך לבחור את הסביבה שבה פרסתם את שרת ה-proxy של ה-API. לדוגמה, test.
    גישה בוחרים באפשרות ציבורי.
    אישור אוטומטי של בקשות גישה הפעלת אישור אוטומטי של בקשות מרכזיות למוצר ה-API הזה מכל אפליקציה.
    מכסה התעלמות מהמדריך הזה.
    היקפי OAuth מותרים התעלמות מהמדריך הזה.
  4. בשדה שרתי proxy ל-API, בוחרים את שרת ה-proxy של ה-API שיצרתם.
  5. בשדה נתיב, מזינים "/". מתעלמים מהשדות האחרים.
  6. לוחצים על שמירה.

הוספה של מפתח ואפליקציה לארגון

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

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

יצירת מפתח

בואו ניצור מפתח בשם נייג'ל טאנל.

  1. בתפריט, בוחרים באפשרות פרסום > מפתחים.
  2. לוחצים על + מפתח.
  3. מזינים את הפקודה הבאה בחלון New Developer (מפתח חדש):
    בשדה הזה מזינים
    שם פרטי Nigel
    שם משפחה Tufnel
    שם משתמש nigel
    אימייל nigel@example.com
  4. לוחצים על יצירה.

רישום אפליקציה

קדימה, ניצור אפליקציה בשביל ניג'ל.

  1. בוחרים באפשרות פרסום > אפליקציות.
  2. לוחצים על + אפליקציה.
  3. מזינים את הפקודה הבאה בחלון New App (אפליקציה חדשה):
    בשדה הזה עשה זאת
    שם ושם לתצוגה הזנת: nigel_app
    מפתח לוחצים על מפתח ובוחרים באפשרות: Nigel Tufnel (nigel@example.com)
    כתובת URL לקריאה חוזרת (callback) והערות להשאיר ריק
  4. בקטע מוצרים, לוחצים על הוספת מוצר.
  5. בוחרים באפשרות helloworld_oauth2-Product.
  6. לוחצים על יצירה.

קבלת מפתח הצרכן וסוד הצרכן

עכשיו תקבלו את מפתח הצרכן וסוד הצרכן שיועברו באסימון גישה מסוג OAuth.

  1. מוודאים שהדף nigel_app מוצג. אם לא, בדף 'אפליקציות' (פרסום > אפליקציות), לוחצים על nigel_app.
  2. בדף nigel_app, לוחצים על Show בעמודות Key ו-Secret. ניתן לראות שהמפתח/סוד משויך ל-"helloworld_oauth2-Product" שנוצר באופן אוטומטי קודם לכן.

  3. בוחרים את המפתח והסוד ומעתיקים אותם. מדביקים את התוכן בקובץ טקסט זמני. תשתמשו בהם בשלב מאוחר יותר, שבו תקראו לשרת ה-API של ה-API, שיחליף את פרטי הכניסה האלה באסימון גישה מסוג OAuth.

מנסים לקרוא ל-API כדי לקבל את כתובת ה-IP (נכשל!)

לשם כך, כדאי לנסות להפעיל את שרת ה-API המוגן, שאמור להחזיר את כתובת ה-IP שלך. מריצים את פקודת ה-cURL הבאה בחלון טרמינל (מחליפים את שם הארגון ב-Edge). המילה test בכתובת ה-URL היא סביבת הבדיקה של הארגון שלך, זו שאליה פרסת את שרתי ה-proxy. נתיב הבסיס של שרת ה-proxy הוא /hellooauth2, והוא זהה לנתיב הבסיס שציינתם כשיצרתם את שרת ה-proxy. שימו לב שאתם לא מעבירים אסימון גישה מסוג OAuth בקריאה.

curl https://ORG_NAME-test.apigee.net/hellooauth2

מאחר שבשרת ה-API של ה-API מוגדרת המדיניות אימות אסימון גישה לגרסה 2.0 של OAuth שבודקת בבקשה אסימון OAuth חוקי, הקריאה אמורה להיכשל ומוצגת ההודעה הבאה:

{"fault":{"faultstring":"Invalid access token","detail":{"errorcode":"oauth.v2.InvalidAccessToken"}}}

במקרה הזה, כישלון הוא דבר טוב! פירוש הדבר ששרת ה-API של ה-API מאובטח הרבה יותר. רק אפליקציות מהימנות שיש להן אסימון גישה תקין ל-OAuth יכולות להפעיל את ה-API הזה.

קבלת אסימון גישה ל-OAuth

עכשיו אנחנו מגיעים להחזר הגדול. בחרת להשתמש במפתח ובסוד שהעתקת והדבקת בקובץ טקסט ולהמיר אותם באסימון גישה ל-OAuth. עכשיו תתבצע קריאה ל-API לשרת ה-proxy לדוגמה של ממשק ה-API שייבאת, oauth. הפעולה הזו תיצור אסימון גישה ל-API.

תוך שימוש במפתח ובסוד האלה, מבצעים את הקריאה הבאה ל-cURL (שימו לב שהפרוטוקול הוא https) ומחליפים את שם הארגון ב-Edge, את המפתח ואת הסוד, כאשר מצוין:

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" \
"https://ORG_NAME-test.apigee.net/oauth/client_credential/accesstoken?grant_type=client_credentials" \
-d "client_id=CLIENT_KEY&client_secret=CLIENT_SECRET"

הערה: אם משתמשים בלקוח כמו Postman כדי לבצע את השיחה, הערכים client_id ו-client_secret בגוף הבקשה צריכים להיות x-www-form-urlencoded.

אמורה להתקבל תגובה כזו:

{
  "issued_at" : "1466025769306",
  "application_name" : "716bbe61-f14a-4d85-9b56-a62ff8e0d347",
  "scope" : "",
  "status" : "approved",
  "api_product_list" : "[helloworld_oauth2-Product]",
  "expires_in" : "3599", //--in seconds
  "developer.email" : "nigel@example.com",
  "token_type" : "BearerToken",
  "client_id" : "xNnREu1DNGfiwzQZ5HUN8IAUwZSW1GZW",
  "access_token" : "GTPY9VUHCqKVMRB0cHxnmAp0RXc0",
  "organization_name" : "myOrg",
  "refresh_token_expires_in" : "0", //--in seconds
  "refresh_count" : "0"
}

קיבלת את אסימון הגישה שלך ל-OAuth! מעתיקים את הערך של access_token (ללא המירכאות) ומדביקים אותו בקובץ הטקסט. עוד מעט תשתמש בו.

מה קרה עכשיו?

חשוב לזכור שבעבר כשבדקת את התהליך המותנה הזה בשרת ה-proxy של oauth, זאת הייתה אומרת אם ה-URI של המשאב הוא /accesstoken ופועל הבקשה הוא POST, כדי להפעיל את מדיניות OAuth של GenerateAccessTokenClient שיוצרת אסימון גישה? פקודת ה-cURL עמדה בתנאים האלה, כך שמדיניות OAuth בוצעה. האפליקציה אימתה את מפתח הצרכן ואת סוד הצרכן שלך, והועברה אליהם באסימון OAuth שהתוקף שלו יפוג תוך שעה.

קריאה ל-API עם אסימון גישה (הצלחה!)

עכשיו יש לכם אסימון גישה ואתם יכולים להשתמש בו כדי להפעיל את שרת ה-API של שרת ה-proxy. מבצעים את קריאת ה-cURL הבאה. מחליפים את שם הארגון של Edge ואת אסימון הגישה.

curl https://ORG_NAME-test.apigee.net/hellooauth2 -H "Authorization: Bearer TOKEN"

עכשיו אתם אמורים לקבל קריאה מוצלחת לשרת ה-API שמחזיר את כתובת ה-IP. לדוגמה:

{"ip":"::ffff:192.168.14.136"}

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

כל הכבוד! יצרת שרת proxy ל-API והגנת עליו בכך שנדרשת לקריאה אסימון גישה תקין ל-OAuth.

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