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

מוצג המסמך של Apigee Edge.
עוברים אל מסמכי תיעוד של Apigee X.
מידע

מה תלמדו

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

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

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

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

joe:joes_password (שם משתמש:סיסמה) או
Nf2moHOASMJeUmXVdDhlMbPaXm2U7eMc:unUOXYpPe74ZfLEb (key:secret)

הופך ל:

b0uiYwjRZLEo4lEu7ky2GGxHkanN

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

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

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

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

למה תזדקק?

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

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

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

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

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

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

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

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

  1. בעורך ה-Proxy ל-API, לוחצים על הכרטיסייה פיתוח. בצד שמאל בחלונית Navigator יופיעו שני כללי מדיניות. יופיעו גם שתי דלתות 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, שיוצרת את הגישה ב-Assistant.

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

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

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

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

מידע על 'mocktarget'

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

http://mocktarget.apigee.net/ip

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

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

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

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

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

    שינוי ל: /hellooauth2

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

    API קיים

    כניסה: https://mocktarget.apigee.net/ip

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

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

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

בואו נבחן מקרוב את מה שיצרתם.

  1. בעורך ה-Proxy ל-API, לוחצים על הכרטיסייה פיתוח. אפשר לראות ש-2 כללי מדיניות נוספו לזרימת הבקשה של שרת ה-proxy ל-API:
    • אימות אסימון גישה מסוג OAuth v2.0 – בודק את הקריאה ל-API לבצע מוודאים שיש אסימון OAuth חוקי.
    • Remove Header Authorization (הסרה של הרשאת כותרת) – מדיניות AssignMessage מסירה את אסימון הגישה לאחר שהוא מסומן כדי שלא יועבר אל לשירות היעד. (אם שירות היעד היה זקוק לאסימון הגישה ל-OAuth, לא תשתמשו המדיניות הזו).
  2. לוחצים על הסמל אימות אסימון גישה מסוג OAuth v2.0 בתצוגת הזרימה לעיין ב-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. השם המוצג מופיע בממשק המשתמש ואפשר לערוך אותו אותו בכל שלב. אם לא מציינים זאת, המערכת תשתמש בערך השם. השדה הזה מאוכלס באופן אוטומטי שימוש בערך Name; אפשר לערוך או למחוק את התוכן שלו. השם המוצג יכול לכלול את השם הבא: בתווים מיוחדים. לדוגמה, helloworld_oauth2-Product.
    תיאור תיאור של מוצר ה-API.
    סביבה סביבות שאליהן מוצר ה-API יאפשר גישה. בחירת הסביבה שאליה רוצים להגיע שפרסתם את ה-Proxy ל-API. לדוגמה, test.
    גישה בוחרים באפשרות גלוי לכולם.
    אישור אוטומטי של בקשות גישה הפעלת אישור אוטומטי של בקשות מפתח למוצר ה-API הזה מכל אפליקציה.
    מכסה התעלמות מהצגת המדריך הזה.
    היקפי הרשאות OAuth מותרים התעלמות מהצגת המדריך הזה.
  4. בשדה API proxy, בוחרים את ה-proxy ל-API שיצרתם.
  5. בשדה נתיב מזינים '/'. מתעלמים מהשדות האחרים.
  6. לוחצים על שמירה.

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

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

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

יצירת מפתח

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

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

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

רוצה ליצור אפליקציה בשביל ניג'ל?

  1. בוחרים באפשרות פרסום > אפליקציות.
  2. לוחצים על + אפליקציה.
  3. בחלון אפליקציה חדשה, מזינים את הפקודה הבאה:
    בשדה הזה לעשות את זה
    שם ושם תצוגה כניסה: 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. בוחרים את המפתח והסוד ומעתיקים אותם. להדביק אותן בדף זמני קובץ טקסט. תשתמשו בהם בשלב מאוחר יותר, שבו קוראים לשרת ה-proxy ל-API להחליף את פרטי הכניסה האלה באסימון גישה ל-OAuth.

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

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

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

כי לשרת ה-proxy ל-API יש מדיניות אימות אסימון גישה מסוג OAuth v2.0 בדקתי אם יש אסימון OAuth תקין בבקשה, הקריאה תיכשל מהשלב הבא message:

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

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

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

עכשיו אנחנו מגיעים לתשלום הגדול. בחרת להשתמש במפתח ובסוד שהועתק והודבק בקובץ טקסט, ולהחליף אותם באסימון גישה של OAuth. עכשיו את/ה לשלוח קריאה ל-API לשרת ה-proxy לדוגמה שייבאתם, 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, כדי לבצע את GenerateAccessTokenClient מדיניות OAuth שיוצרת אסימון גישה? כתובת ה-URL שלך הפקודה עמדה בתנאים האלו, ולכן מדיניות OAuth בוצעה. הוא אימת את מפתח הצרכן שלך והסודות של הצרכן, והחלפנו אותם באסימון OAuth שהתוקף שלו פג תוך שעה.

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

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

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

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

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

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

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

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