چگونه می توان API Flast REST را با JSON Web Token ایمن کرد؟

بیایید بیاموزیم که چگونه API REST را با نشانه های وب JSON ایمن کنیم تا از سوء استفاده کاربران و برنامه های شخص ثالث جلوگیری کنیم.


ما با استفاده از یک سرویس پایگاه داده ایجاد خواهیم کرد SQLite و به کاربران این امکان را می دهد تا از طریق REST API با استفاده از روشهای HTTP مانند POST و PUT به آن دسترسی پیدا کنند.

علاوه بر این ، خواهیم فهمید که چرا نشانه های وب JSON راهی مناسب برای محافظت از API استراحت به جای هضم و احراز هویت اساسی است. قبل از ادامه کار ، بیایید اصطلاح JSON web tokens ، REST API و چارچوب Flask را درک کنیم.

توکن های وب JSON

نشانه وب JSON ، همچنین به عنوان شناخته می شود JWT, روش امن انتقال نشانه های تصادفی بین دو طرف یا نهاد است. JSON معمولاً از سه قسمت به شرح زیر تشکیل شده است.

  • ظرفیت ترابری
  • سرتیتر
  • امضا

JSON هنگام انتقال داده یا اطلاعات بین دو طرف از دو نوع فرم ساختار استفاده می کند.

  • سریال
  • محصور شده است

فرم سریال شده هنگام انتقال داده به شبکه از طریق هر درخواست و پاسخ استفاده می شود در حالی که از فرم deserialized هنگام خواندن و نوشتن داده ها به نشانه وب استفاده می شود..

در فرم سریالی ، سه مؤلفه وجود دارد.

  • سرتیتر
  • ظرفیت ترابری
  • امضا

مؤلفه هدر اطلاعات رمزنگاری شده در مورد نشانه ها را تعریف می کند. مثلا:

  • آیا JWT امضا شده یا بدون امضا است?
  • تکنیک های الگوریتم را تعریف کنید

فرم deserialized برخلاف فرم سریال شده ، دو مؤلفه دارد.

  • ظرفیت ترابری
  • سرتیتر

API REST

API (رابط برنامه نویسی برنامه) به بازیابی و ارسال داده ها به ارتباط بین دو برنامه اجازه می دهد. دو نوع محبوب API وجود دارد – API وب و سیستم.

در این مقاله ، ما فقط به API وب خواهیم پرداخت. دو نوع API وب وجود دارد.

  • درخواست – API پاسخ: استراحت ، GraphQL ، تماس از راه دور (RPC)
  • API محور رویداد: WebHooks ، Web Sockets ، HTTP Streaming

API REST در رده درخواست پاسخ قرار می گیرد. برای انجام عملیات API از روشهای HTTP مانند GET ، POST و PUT استفاده می کند.

یک مثال کلاسیک وقتی کاربر یک متد GET را به سرویس وب می فرستد تا از یک منبع خاص یا مجموعه ای از منابع درخواست یا بازیابی کند. سپس سرور منبع یا مجموعه ای از منابع را به کاربر مورد نظر ارسال می کند.

چارچوب فلاسک

فلاسک یک چارچوب مبتنی بر پایتون است. این یک چارچوب خرد است که توسط توسعه دهندگان Python برای ساخت API استراحت استفاده می شود. این یک چارچوب میکرو نامیده می شود زیرا به عنوان مثال به توسعه دهندگان این امکان را می دهد تا تأیید هویت سفارشی و هر سیستم پس زمینه دیگری را بر اساس تنظیمات برگزیده اضافه کنند.

بیایید با اجرای آن شروع کنیم. راه اندازی سیستم من به شرح زیر است.

  • اوبونتو به عنوان سیستم عامل
  • پایتون 2.7+
  • پستچی

با استفاده از virtualenv یک محیط مجازی تنظیم کنید

ما باید محیط مجازی را تنظیم کنیم تا اطمینان حاصل شود که برخی از بسته ها با بسته های سیستم مغایرت ندارند. بیایید از virtualenv برای تنظیم یک محیط مجازی جدید استفاده کنیم.

با فرض اینکه شما دستور پیپ را در سیستم خود دارید ، دستور نصب زیر را از طریق پیپ اجرا کنید.

pip نصب virtualenv

اگر در دستگاه خود پیپ ندارید ، این کار را دنبال کنید مستندات برای نصب پیپ روی سیستم خود.

در مرحله بعد ، اجازه می دهیم یک دایرکتوری برای ذخیره یا نگه داشتن محیط مجازی خود ایجاد کنیم. از دستور mkdir که در زیر نشان داده شده است برای ایجاد فهرست استفاده کنید

mkdir flaskproject

با استفاده از دستور زیر ، وارد فهرست پوشه flaskproject شوید

پروژه cd flask

در داخل دایرکتوری flaskproject ، از ابزار virtualenv برای ایجاد یک محیط مجازی مانند تصویر زیر استفاده کنید:

virtualenv flaskapi

بعد از اینکه از ابزار virtualenv برای ایجاد محیط مجازی استفاده کرده اید ، دستور cd را اجرا کنید تا به عنوان محیط مجازی به فهرست فلاشاپی تبدیل شوید و با استفاده از دستور زیر آن را فعال کنید..

سطل منبع / فعال کردن

تمام وظایف مربوط به این پروژه را در محیط مجازی انجام دهید.

بسته ها را با استفاده از پیپ نصب کنید

اکنون زمان آن رسیده است که بسته هایی مانند چارچوب فلاسک و PyJWT را که برای ساختن API باقیمانده و سایر بسته های لازم برای پروژه API ما استفاده خواهیم کرد ، نصب کنیم.

با بسته های زیر یک پرونده الزامات.txt ایجاد کنید.

فلاسک
وقت قرار
یوید
فلاسک-SQLAlchemy
PyJWT

آنها را با پیپ نصب کنید.

pip install -r requ.txt

ایجاد یک بانک اطلاعاتی

بگذارید SQLite را نصب کنیم.

apt-get install sqlite3

یک بانک اطلاعاتی به نام کتابخانه ایجاد کنید. در داخل این پایگاه داده ، دو جدول ایجاد خواهیم کرد ، یعنی جدول کاربران و نویسندگان.

جدول کاربران شامل کاربران ثبت نام شده خواهد بود. فقط کاربران ثبت نام شده می توانند به جدول نویسندگان دسترسی داشته باشند.

در جدول نویسندگان اطلاعات یا جزئیات نویسندگان مانند نام نویسنده ، کشور تولد و غیره ارسال شده توسط کاربران ثبت شده ذخیره می شود.

با استفاده از دستور زیر بانک اطلاعاتی را ایجاد کنید:

sqlite3 کتابخانه.db

می توانید با استفاده از دستور زیر ، بانک اطلاعات را با موفقیت ایجاد کنید:

.پایگاه داده

یک ترمینال جدید را باز کنید و موارد زیر را در محیط مجازی که قبلاً ایجاد کرده ایم اجرا کنید.

برنامه را لمس کنید

کد زیر را درون پرونده ای به نام app.py قرار دهید

از وارد کردن فلاسک فلاسک ، درخواست ، jsonify ، make_response
از flask_sqlalchemy وارد کردن SQLAlchemy
از werkzeug.securance واردات generate_password_hash ، check_password_hash
واردات uuid
واردات jwt
تاریخ واردات
از functools بسته بندی واردات

خط اول در کد فوق بسته هایی مانند درخواست و jsonify را وارد می کند. ما از درخواست برای پیگیری داده های سطح درخواست در حین درخواست استفاده خواهیم کرد و از jsonify برای پاسخ های خروجی در یک درخواست استفاده می کنیم JSON قالب.

در خط بعدی ، ما SQLAlchemy را از flask_sqlalchemy وارد کردیم تا ویژگی های SQLAlchemy را درون فلاسک ادغام کنیم..

از werkzeug.securance ، ما generate_password_hash را وارد کردیم تا بتواند هش رمز را برای کاربران ایجاد کند و check_password_hash را برای بررسی رمز عبور کاربر هنگام مقایسه رمز عبور ارسال شده توسط کاربران با کلمه عبور کاربران ذخیره شده در پایگاه داده وارد کردیم..

سرانجام ، ما برای تولید شماره شناسه تصادفی برای کاربران ، uuid را نیز به عنوان شناسه جهانی منحصر به فرد شناخته می کنیم.

هنوز ، در داخل فایل app.py ، تنظیمات پیکربندی API کتابخانه را با استفاده از کد زیر در فایل app.py پیاده سازی کنید.

کد زیر را در زیر عبارت واردات قرار دهید.

برنامه = فلاسک (__ name__)

app.config [‘SECRET_KEY’] = ‘Th1s1ss3cr3t’
app.config [‘SQLALCHEMY_DATABASE_URI’] = ‘sqlite: /////home/michael/geekdemos/geekapp/library.db’
app.config [‘SQLALCHEMY_TRACK_MODIFICATIONS’] = درست است

db = SQLAlchemy (برنامه)

اکنون مطابق شکل زیر ، دو جدول برای Users and Authors ایجاد کنید. کدهای موجود را درون پرونده app.py کپی و جایگذاری کنید.

کد را در زیر سمت راست زیر این تنظیم پایگاه داده قرار دهید db = SQLAlchemy (برنامه)

کاربران کلاس (db.Model):
id = db.Column (db.Integer، basic_key = True)
public_id = db.Column (db.Integer)
name = db.Column (db.String (50))
کلمه عبور = db.Column (db.String (50))
مدیر = db.Column (db.Boolean)
نویسندگان کلاس (db.Model):
id = db.Column (db.Integer، basic_key = True)
name = db.Column (db.String (50) ، منحصر به فرد = واقعی ، ناموزون = غلط))
کتاب = db.Column (db.String (20) ، منحصر به فرد = واقعی ، باطل = غلط))
کشور = db.Column (db.String (50) ، قابل تهدید = غلط))
booker_prize = db.Column (db.Boolean)

جداول کاربران و نویسندگان ایجاد کنید

در ترمینال ، کد زیر را در محیط مجازی تایپ کنید تا جداول کاربران و نویسندگان همانند شکل زیر ایجاد یا ایجاد شود.

از واردات برنامه db
db.create_all ()

پس از آن ، پرونده app.py را در محیط مجازی باز کنید و عملکرد دیگری ایجاد کنید.

این عملکرد به منظور ایجاد دسترسی فقط به کاربران ثبت نام شده امکان دسترسی به و انجام مجموعه ای از عملیات API را در برابر جدول نویسندگان ایجاد می کند..

این کد را در زیر مدل دیتابیس برای جدول نویسندگان قرار دهید

def token_required (f):
wraps (f)
دکوراتور دف (* استدلال ، ** کوارگ):

نشانه = هیچکدام

اگر در نشانه های درخواست “x-access-tok”:
نشانه = درخواست. هدرها [‘x-access-argument’]

اگر نشانه نیست:
Return jsonify (message ‘پیام’: ‘نشانه معتبر موجود نیست’})

تلاش كردن:
داده = jwt.decode (نشانه ، برنامه.کامل [SECRET_KEY])
current_user = Users.query.filter_by (public_id = داده [‘public_id’]).) اول ()
بجز:
Return jsonify (message ‘پیام’: ‘نشانه نامعتبر است’})

بازگشت f (current_user ، * آرگومان ها ، ** کوارگ)
دکوراتور بازگشت

مسیرهایی را برای جدول کاربران ایجاد کنید

اکنون مسیری را ایجاد می کنیم تا به کاربران امکان ثبت نام در API نویسندگان از طریق نام کاربری و رمزعبور را مانند تصویر زیر دهید.

دوباره پرونده app.py را در محیط مجازی باز کنید و کد زیر را زیر عملکرد token_required قرار دهید (f)

@ app.route (‘/ ثبت نام کنید’ ، روش ها = [‘دریافت’ ، ‘پست’])
def signup_user ():
داده = درخواست.get_json ()

hashed_password = generate_password_hash (داده [‘گذرواژه’] ، روش = ‘sha256’)

new_user = کاربران (public_id = str (uuid.uuid4 ()) ، name = data [‘name’] ، گذرواژه = hashed_password ، مدیر = غلط)
db.session.add (new_user)
db.session.commit ()

Return jsonify (message ‘پیام’: ‘با موفقیت ثبت شده’})

در داخل محیط مجازی مسیری دیگر را در پرونده app.py ایجاد کنید تا کاربران ثبت نام شده بتوانند وارد شوند.

وقتی کاربر وارد سیستم می شود ، یک نشانه تصادفی برای کاربر ایجاد می کند تا به API کتابخانه دسترسی پیدا کند.

کد زیر زیر مسیر قبلی را که ایجاد کردیم بچسبانید.

@ app.route (‘/ ورود به سیستم’ ، متدهای = [‘دریافت’ ، ‘پست’])
def login_user ():

auth = request.authorization

اگر auth.username نباشد یا auth.password نباشد:
Return make_response (‘نمی توان تأیید کرد’ ، 401 ، {“WWW.Authentication”: ‘قلمرو اصلی: "ورود به سیستم مورد نیاز است"’})

کاربر = Users.query.filter_by (نام = auth.username) .first ()

اگر check_password_hash (user.password ، auth.password):
token = jwt.encode ({‘public_id’: user.public_id ، ‘exp’: datetime.datetime.utcnow () + datetime.timedelta (دقیقه = 30)} ، app.config [‘SECRET_KEY’])
بازگشت jsonify (tok ‘token’: token.decode (‘UTF-8’)})

Return make_response (‘نمی توان تأیید کرد’ ، 401 ، {“WWW.Authentication”: ‘قلمرو اصلی: "ورود به سیستم مورد نیاز است"’})

هنوز هم در محیط مجازی مسیری دیگر را در پرونده app.py ایجاد کنید تا کلیه کاربران ثبت نام شده را دریافت یا بازیابی کنید.

این کد برای کلیه کاربران ثبت نام شده در جدول کاربران بررسی می کند و نتیجه نهایی را با فرمت JSON برمی گرداند.

کد زیر مسیر ورود را جایگذاری کنید

@ app.route (‘/ / کاربران’ ، روش = [‘دریافت’])
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 (users ‘کاربران’: نتیجه})

برای جدول نویسندگان مسیر ایجاد کنید 

بیایید مسیرهایی را برای جدول نویسندگان ایجاد کنیم تا به کاربران امکان بازیابی همه نویسندگان در پایگاه داده و همچنین حذف نویسندگان را بدهیم.

فقط کاربران دارای نشانه های معتبر می توانند این عملیات API را انجام دهند.

در داخل فایل app.py ، مسیری را برای کاربران ثبت نام شده ایجاد کنید تا نویسندگان جدید ایجاد کنید.

این کد را در زیر مسیری قرار دهید که به کاربر اجازه می دهد همه کاربران ثبت شده را بازیابی کند.

@ app.route (‘/ نویسنده’ ، روش = [‘پست’ ، ‘دریافت’])
token_required
def create_author (current_user):

داده = درخواست.get_json ()

new_authors = نویسندگان (name = data [‘name’]، country = data [‘country’]، book = data [‘book’]، booker_prize = True، user_id = current_user.id)
db.session.add (new_authors)
db.session.commit ()

Return jsonify (message ‘پیام’: ‘نویسنده جدید ایجاد شده’})

در مرحله بعد ، مسیری دیگر ایجاد کنید تا کاربر ثبت نام شده با نشانه معتبر بتواند همه نویسندگان را در جدول نویسندگان مانند جدول زیر بازیابی کند.

این کد را در زیر مسیری قرار دهید که به کاربر امکان ایجاد نویسنده جدید را می دهد.

@ app.route (‘/ نویسندگان’ ، روش = [‘پست’ ، ‘دریافت’])
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 ‘list_of_authors’: خروجی})

سرانجام ، هنوز هم در پرونده 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 ()
اگر نویسنده نباشد:
Return jsonify (message ‘پیام’: ‘نویسنده وجود ندارد’})

db.session.delete (نویسنده)
db.session.commit ()

Return jsonify (message ‘پیام’: ‘نویسنده حذف شد’)

اگر __name__ == ‘__main__’:
app.run (اشکال زدایی = واقعی)

پس از آن ، پرونده app.py را در محیط مجازی ذخیره و بسته کنید.

تست API کتابخانه با Postman

در این بخش از یک ابزار پستچی برای ارسال درخواست به خدمات پایگاه داده استفاده خواهیم کرد. اگر پستچی در دستگاه خود ندارید ، می توانید نحوه دانلود و نصب آن را بیابید اینجا.

به غیر از پستچی ، ما می توانیم از ابزارهای دیگری مانند: استفاده کنیم حلقه برای ارسال درخواست به سرور.

یک ترمینال جدید را باز کنید و موارد زیر را تایپ کنید:

پستچی

فرمانده پست باعث می شود مرورگر وب شما صفحه زیر را نمایش دهد:

postman_signup

می توانید تصمیم بگیرید که ثبت نام کنید و یک حساب کاربری رایگان ایجاد کنید اما ما برای آزمایش API کتابخانه همانطور که در شکل زیر نشان داده شده است ، از برنامه مستقیم می شویم و به برنامه مستقیم دسترسی پیدا می کنیم:

تست API کتابخانه

در این بخش به کاربر اجازه می دهیم با تهیه نام کاربری و رمزعبور منحصر به فرد با فرمت JSON با استفاده از روش POST با استفاده از مراحل زیر ، برای API کتابخانه ثبت نام کند:

  • بر روی زبانه برچسب Body کلیک کنید
  • سپس دکمه خام را انتخاب کرده و فرمت JSON را انتخاب کنید
  • یک نام کاربری و رمز عبور وارد کنید تا همانطور که در تصویر نشان داده شده است ثبت نام کنید
  • در کنار دکمه ارسال ، آدرس زیر را http://127.0.0.1/register وارد کنید
  • در آخر ، روش را به POST تغییر دهید و دکمه send را فشار دهید.

یک کاربر برای api ثبت می کند

خروجی زیر را مطابق شکل زیر نمایش می دهد:

اکنون ما با موفقیت یک کاربر را ثبت کرده ایم. بیایید جلوتر برویم تا به کاربرانی که به تازگی ثبت نام کرده اند اجازه ورود به سیستم بدهد تا بتواند با استفاده از مراحل زیر به فهرست نویسندگان دسترسی پیدا کند:

  •  بر روی برگه مجوز کلیک کنید.
  • در قسمت نوع ، تأیید اعتبار اولیه را انتخاب کنید.
  • سپس نام کاربری و رمز عبور را با نام کاربری و رمز عبوری که قبلاً با آنها ثبت کرده اید ، پر کنید.
  • در آخر ، دکمه ارسال را فشار دهید تا وارد شوید و یک نشانه تصادفی تولید کنید.

هنگامی که کاربر با موفقیت وارد سیستم شد ، همانطور که در تصویر نشان داده شده است ، یک علامت تصادفی برای کاربر ایجاد می شود.

ما برای دسترسی به جدول نویسندگان از نشانه تصادفی تولید شده استفاده خواهیم کرد.

در این بخش ، اطلاعات نویسنده را از طریق روش POST با استفاده از مراحل زیر به جدول نویسندگان اضافه می کنیم:

  • روی سربرگ کلیک کنید
  • هدرهای HTTP زیر را که در تصویر نشان داده شده است ، درج کنید

  • بعد ، روی زبانه بدن کلیک کنید و جزئیات نویسنده جدید را وارد کنید
  • سپس دکمه ارسال را فشار دهید تا جزئیات نویسنده به جدول نویسنده اضافه شود

همچنین می توانید اطلاعات نویسندگان را در جدول نویسندگان از طریق موارد زیر بازیابی کنید:

  • اطمینان حاصل کنید که نشانه تولید شده شما در بخش عنوان ها قرار دارد. اگر در آنجا نباشد ، باید آن را با نشانه خود پر کنید.
  • در کنار دکمه ارسال ، این URL را وارد کنید http://127.0.0.1/authors
  • سپس روش HTTP را به GET تغییر داده و دکمه ارسال را برای بازیابی جزئیات نویسندگان فشار دهید.

سرانجام می توانید نویسنده (های) را در جدول نویسندگان از طریق روش DELETE با استفاده از مراحل زیر حذف کنید:

  • اطمینان حاصل کنید که نشان شما هنوز در بخش عنوان ها قرار دارد. برای اطمینان از وجود اطلاعات لازم ، می توانید برگه هدر ها را بررسی کنید.
  • در کنار دکمه ارسال ، این URL را وارد کنید 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