כיצד לאבטח ממשק API REST של בקבוק באמצעות אסימון האינטרנט JSON?

בואו ללמוד כיצד לאבטח ממשק API של REST באמצעות אסימוני אינטרנט של JSON כדי למנוע ממשתמשים ויישומי צד שלישי לרעה בו.


אנו נבנה שירות מסד נתונים באמצעות SQLite ולאפשר למשתמשים לגשת אליו באמצעות ממשק REST בשיטות HTTP כמו POST ו- PUT.

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

סמלי רשת JSON

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

  • עומס מטען
  • כותרת עליונה
  • חתימה

JSON משתמש בשני סוגים של צורות מבנה בעת העברת נתונים או מידע בין שני צדדים.

  • בהמשכים
  • מייתר

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

בצורה בהמשכים, ישנם שלושה רכיבים.

  • כותרת עליונה
  • עומס מטען
  • חתימה

רכיב הכותרת מגדיר את המידע הקריפטוגרפי אודות האסימונים. לדוגמה:

  • האם זה JWT חתום או לא חתום?
  • הגדירו טכניקות אלגוריתם

הטופס המיוחל, בניגוד לטופס המסודר, מכיל שני רכיבים.

  • עומס מטען
  • כותרת עליונה

ממשק API

API (ממשק תכנות יישומים) מאפשר לתקשורת בין שני אפליקציות לאחזר או להגיש את הנתונים. ישנם שני סוגים פופולריים של ממשקי API – ממשק API ומערכת.

במאמר זה, נסקור רק את ה- API של האינטרנט. ישנם שני סוגים של ממשק API באינטרנט.

  • בקשה – ממשק API לתגובה: מנוחה, GraphQL, שיחת נוהל מרחוק (RPC)
  • ממשק API מונע אירועים: WebHooks, Sockets Web, HTTP Streaming

ממשק API של REST נופל תחת קטגוריית תשובת הבקשה. הוא עושה שימוש בשיטות HTTP כמו GET, POST ו- PUT לביצוע פעולות API.

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

מסגרת בקבוק

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

בואו נתחיל עם היישום. הגדרת המערכת שלי היא כדלקמן.

  • אובונטו כמערכת הפעלה
  • פייתון 2.7+
  • דוור

הגדרת סביבה וירטואלית באמצעות virtualenv

עלינו להקים סביבה וירטואלית כדי להבטיח שחבילות מסוימות לא יתנגשו עם חבילות מערכת. בואו להשתמש ב- virtualenv כדי להגדיר סביבה וירטואלית חדשה.

בהנחה שיש לך את הפקודה pip זמינה במערכת שלך, הפעל את הפקודה הבאה באמצעות pip להתקנה.

pip להתקין

אם אין לך pip במחשב שלך, עקוב אחר זה תיעוד להתקנת pip במערכת שלך.

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

פרויקט הבקבוק של mkdir

התחל לספריית פרוייקט הבקבוק באמצעות הפקודה הבאה

פרויקט בקבוק CD

בתוך ספריית ה- Flask Project, השתמש בכלי virtualenv כדי ליצור סביבה וירטואלית כמוצג להלן:

Flaskapi – –

לאחר שהשתמשת בכלי virtualenv כדי ליצור את הסביבה הווירטואלית, הפעל את הפקודה cd כדי לשנות את ספריית flaskapi כסביבה הווירטואלית והפעל אותה באמצעות הפקודה שלהלן..

סל המקור / הפעל – –

בצעו את כל המשימות הקשורות לפרויקט זה בסביבה הווירטואלית.

התקן חבילות באמצעות pip

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

צור קובץ דרישות.טקסט עם החבילות הבאות.

בקבוק
תאריך שעה
uuid
Flask-SQLAlchemy
PyJWT

התקן אותם בעזרת פיפ.

pip להתקין -r דרישות. טקסט

הקמת בסיס נתונים

בואו נתקין את SQLite.

apt-get להתקין את sqlite3

צור בסיס נתונים בשם הספריה. בתוך בסיס נתונים זה ניצור שני טבלאות, כלומר טבלת המשתמשים והמחברים.

טבלת המשתמשים תכיל משתמשים רשומים. רק משתמשים רשומים יכולים לקבל גישה לטבלת המחברים.

טבלת המחברים תאחסן את פרטי המחברים או את הפרטים כגון שם המחבר, ארץ לידה וכן הלאה שהוגשו על ידי המשתמשים הרשומים.

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

sqlite3 library.db

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

.מאגרי מידע

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

גע באפליקציה

הדבק את הקוד הבא בקובץ בשם app.py

מייבוא ​​בקבוק בקבוק, בקש, jsonify, make_response
מ- flask_sqlalchemy יבוא SQLAlchemy
מ- werkzeug.security יבוא create_password_hash, check_password_hash
יבוא uuid
יבוא jwt
יבוא תאריך תאריך
מכריכות ייבוא ​​של פונקציות

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

בשורה הבאה ייבאנו SQLAlchemy מ- flask_sqlalchemy בכדי לשלב תכונות SQLAlchemy בבקבוק.

מ- werkzeug.security, ייבאנו את create_password_hash כדי ליצור hash סיסמא למשתמשים ובדוק_password_hash כדי לבדוק את סיסמת המשתמש בעת השוואה בין סיסמה שהוגשה על ידי משתמשים עם סיסמאות המשתמשים המאוחסנים בבסיס הנתונים..

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

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

הניח את הקוד הבא מתחת להצהרת הייבוא.

app = בקבוק (__ שם__)

app.config [‘SECRET_KEY’] = ‘Th1s1ss3cr3t’
app.config [‘SQLALCHEMY_DATABASE_URI’] = ‘sqlite: /////home/michael/geekdemos/geekapp/library.db’
app.config [‘SQLALCHEMY_TRACK_MODIFICATIONS’] = נכון

db = SQLAlchemy (אפליקציה)

כעת צור שני דגמים לטבלת המשתמשים והמחברים כמוצג להלן. העתק והדבק את הקוד בקובץ app.py.

מקם את הקוד מתחת למטה תחת הגדרת בסיס נתונים זה db = SQLAlchemy (אפליקציה)

משתמשים בכיתה (db.Model):
id = db. טור (db. מספר שלם, ראשי_מפתח = נכון)
public_id = db. טור (db.Integer)
name = db. טור (db.String (50))
סיסמה = db. טור (db.String (50))
admin = db. טור (db.Boolean)
מחברים בכיתה (db.Model):
id = db. טור (db. מספר שלם, ראשי_מפתח = נכון)
שם = db. טור (db.String (50), ייחודי = נכון, ערכי = שווא))
ספר = db. טור (db.String (20), ייחודי = נכון, ערכי = שווא))
מדינה = db. טור (db.String (50), ניתן לאפס = שקר))
booker_prize = db. טור (db.Boolean)

צור טבלאות משתמשים ומחברים

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

מייבוא ​​יישום db
db.create_all ()

לאחר מכן, פתח את קובץ ה- app.py בסביבה הווירטואלית וצור פונקציה נוספת.

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

הנח קוד זה מתחת למודל בסיס הנתונים עבור טבלת המחברים

def token_required (ו):
@ כורכת (ו)
מעצב מעצבים (* טענות, ** kwargs):

אסימון = אין

אם ‘אסימוני x-access’ בבקשה. כותרות:
token = request.headers [‘x-access-tokens’]

אם לא אסימון:
להחזיר jsonify ({‘הודעה’: ‘חסר אסימון תקף’})

נסה:
data = jwt.decode (אסימון, app.config [SECRET_KEY])
current_user = Users.query.filter_by (public_id = data [‘public_id’]). ראשית ()
מלבד:
להחזיר jsonify ({‘הודעה’: ‘אסימון אינו חוקי’})

החזר f (זרם_משתמש, * טענות, ** kwargs)
מעצב חוזר

צור מסלולים לטבלת המשתמשים

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

פתח שוב את קובץ ה- app.py בסביבה הווירטואלית והדבק את הקוד הבא מתחת לפונקציה token_required (f)

@ app.route (‘/ הרשמה’, שיטות = [‘GET’, ‘POST’])
def signup_user ():
data = request.get_json ()

hashed_password = create_password_hash (נתונים [‘סיסמא’], שיטה = ‘sha256’)

new_user = משתמשים (public_id = str (uuid.uuid4 ()), name = data [‘name’], סיסמא = hashed_password, admin = False)
db.session.add (new_user)
db.session.commit ()

להחזיר jsonify ({‘הודעה’: ‘נרשם בהצלחה’})

בתוך הסביבה הווירטואלית, צור מסלול אחר בקובץ app.py כדי לאפשר למשתמשים רשומים להתחבר.

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

הדבק את הקוד למטה מתחת למסלול הקודם שיצרנו.

@ app.route (‘/ כניסה’, שיטות = [‘GET’, ‘POST’])
משתמש כניסה def ():

autor = בקשה. הרשאה

אם לא autor.usname או לא autor.password:
להחזיר make_response (‘לא יכול היה לאמת’, 401, {‘WWW.Authentication’: ‘תחום בסיסי: "כניסה נדרשת"’})

user = Users.query.filter_by (name = authentic.username) .first ()

אם check_password_hash (user.password, authentic.password):
token = jwt.encode ({‘public_id’: user.public_id, ‘exp’: datetime.datetime.utcnow () + datetime.timedelta (דקות = 30)}, app.config [‘SECRET_KEY’])
להחזיר jsonify ({‘token’: token.decode (‘UTF-8’)})

להחזיר make_response (‘לא יכול היה לאמת’, 401, {‘WWW.Authentication’: ‘תחום בסיסי: "כניסה נדרשת"’})

עדיין, בסביבה הווירטואלית, צור מסלול אחר בקובץ app.py כדי להשיג או לאחזר את כל המשתמשים הרשומים.

קוד זה בודק את כל המשתמשים הרשומים בטבלת המשתמשים ומחזיר את התוצאה הסופית בפורמט JSON.

הדבק את הקוד שמתחת לדרך ההתחברות

@ app.route (‘/ משתמשים’, שיטות = [‘GET’])
def get_all_users ():

משתמשים = Users.query.all ()

תוצאה = []

למשתמשים המשתמשים:
user_data = {}
user_data [‘public_id’] = user.public_id
user_data [‘name’] = שם משתמש
user_data [‘password’] = user.password
user_data [‘admin’] = user.admin

result.append (user_data)

להחזיר jsonify ({‘משתמשים’: תוצאה})

צור מסלולים לטבלת המחברים 

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

רק משתמשים עם אסימונים תקפים יכולים לבצע פעולות API אלה.

בתוך קובץ ה- app.py, צור מסלול למשתמשים רשומים ליצור מחברים חדשים.

הדבק קוד זה מתחת למסלול המאפשר למשתמש לאחזר את כל המשתמשים הרשומים.

@ app.route (‘/ מחבר’, שיטות = [‘POST’, ‘GET’])
@token_required
def create_author (current_user):

data = request.get_json ()

new_authors = מחברים (name = data [‘name’], country = data [‘country’], book = data [‘book’], booker_prize = נכון, user_id = current_user.id)
db.session.add (new_authors)
db.session.commit ()

להחזיר jsonify ({‘הודעה’: ‘מחבר חדש נוצר’})

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

הדבק קוד זה מתחת למסלול המאפשר למשתמש ליצור מחבר חדש.

@ app.route (‘/ מחברים’, שיטות = [‘POST’, ‘GET’])
@token_required
def get_authors (current_user):

מחברים = Authors.query.filter_by (user_id = current_user.id) .all ()

פלט = []
לסופר בסופרים:

author_data = {}
author_data [‘name’] = author.name
author_data [‘book’] = author.book
author_data [‘country’] = author.country
author_data [‘booker_prize’] = author.booker_prize
output.append (author_data)

להחזיר jsonify ({‘list_of_authors’: output})

לבסוף, עדיין בתוך קובץ ה- app.py, צור מסלול למחיקת מחבר שצוין כמוצג להלן.

הדבק קוד זה מתחת למסלול המאפשר למשתמש לאחזר רשימת מחברים.

@ app.route (‘/ מחברים /’, שיטות = [‘מחק’])
@token_required
def delete_author (current_user, author_id):
מחבר = Author.query.filter_by (id = author_id, user_id = current_user.id) .first ()
אם לא מחבר:
להחזיר jsonify ({‘הודעה’: ‘המחבר לא קיים’})

db.session.delete (מחבר)
db.session.commit ()

להחזיר jsonify ({‘הודעה’: ‘המחבר נמחק’})

אם __name__ == ‘__main__’:
app.run (ניפוי באגים = נכון)

לאחר מכן, שמור וסגור את קובץ ה- app.py בסביבה הווירטואלית.

בדיקת ממשק ה- API עם הספרייה

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

מלבד הדוור, אנו יכולים להשתמש בכלים אחרים כגון תלתל כדי לשלוח בקשות לשרת.

פתח מסוף חדש והקלד את הדברים הבאים:

דוור

דוכן הפקודה יגרום לדפדפן האינטרנט שלך להציג את הדף למטה:

הדואר

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

בדוק את api הספרייה

בחלק זה אנו מאפשרים למשתמש להירשם לממשק ה- API של הספרייה על ידי מתן שם משתמש וסיסמא ייחודית בפורמט JSON בשיטת POST באמצעות השלבים שלהלן:

  • לחץ על הכרטיסייה שכותרתה גוף
  • ואז בחר בלחצן הגולמי ובחר בפורמט JSON
  • הזן שם משתמש וסיסמא כדי להירשם כמוצג בתמונה
  • לצד כפתור השליחה, הכנס את כתובת האתר הבאה http://127.0.0.1/register
  • לבסוף, שנה את השיטה ל- POST ולחץ על כפתור השליחה.

משתמש נרשם ל- api

הוא יציג את הפלט הבא כמוצג להלן:

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

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

לאחר כניסת המשתמש בהצלחה, נוצר אסימון אקראי למשתמש כפי שמוצג בתמונת המסך.

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

בחלק זה נוסיף מידע מחבר לטבלת המחברים בשיטת POST באמצעות השלבים הבאים:

  • לחץ על לשונית הכותרות
  • כלול את כותרות HTTP שלהלן המוצגות בתמונת המסך

  • לאחר מכן לחץ על לשונית הגוף והזן את פרטי המחבר החדש
  • לאחר מכן לחץ על כפתור השליחה כדי להוסיף את פרטי המחבר לטבלת המחבר

תוכל גם לאחזר מידע מחברים בטבלת המחברים דרך הדברים הבאים:

  • ודא שהאסימון שנוצר נמצא בחלק הכותרות. אם הוא לא שם, אתה צריך למלא אותו באסימון שלך.
  • לצד כפתור השליחה, הזן כתובת אתר זו http://127.0.0.1/authors
  • לאחר מכן שנה את שיטת HTTP ל- GET ולחץ על כפתור השליחה כדי לאחזר את פרטי המחברים.

לבסוף, אתה יכול למחוק את המחברים / ים בטבלת המחברים בשיטת DELETE באמצעות הצעדים הבאים:

  • ודא שהאסימון שלך עדיין נמצא בכותרת הכותרות. אתה יכול לבדוק את כרטיסיית הכותרות כדי לוודא שהמידע הדרוש קיים.
  • לצד כפתור השליחה, הזן כתובת אתר זו http://127.0.0.1/sam
  • לאחר מכן לחץ על כפתור השליחה כדי למחוק את המשתמש שציינת.

אתה יכול למצוא את קוד המקור המלא ב- גיתוב.  אתה יכול לשבט אותו ולבדוק אותו במחשב שלך.

תגיות:

  • פייתון

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map