Cum să securizați o API-ul REST RASPECT cu Jeton Web JSON?

Să învățăm cum să securizați o API REST cu ajutorul token-urilor web JSON pentru a împiedica utilizatorii și aplicațiile terțe să o abuzeze.


Vom construi un serviciu de baze de date folosind SQLite și permiteți utilizatorilor să îl acceseze prin intermediul unei API REST folosind metode HTTP precum POST și PUT.

În plus, vom afla de ce jetoanele web JSON este o modalitate potrivită de a proteja API-ul de odihnă în loc de digerare și autentificare de bază. Înainte de a continua, să înțelegem termenul jetoane web JSON, API REST și cadrul Flask.

Jetonuri web JSON

Jken web JSON, cunoscut și sub numele de JWT, este modul sigur de transfer al jetoanelor aleatorii între două părți sau entități. JSON este de obicei format din trei părți, după cum urmează.

  • Încărcătură utilă
  • Antet
  • Semnătură

JSON folosește două tipuri de formulare de structură atunci când transferă date sau informații între două părți.

  • serializate
  • deserialized

Formularul serializat este utilizat la transferul datelor în rețea prin fiecare cerere și răspuns, în timp ce formularul deserializat este utilizat la citirea și scrierea datelor pe jetonul web.

În forma serializată, există trei componente.

  • Antet
  • Încărcătură utilă
  • Semnătură

Componenta antet definește informațiile criptografice despre jetoane. De exemplu:

  • Este semnat sau nesemnat JWT?
  • Definiți tehnici de algoritm

Forma deserializată, spre deosebire de forma serializată, conține două componente.

  • Încărcătură utilă
  • Antet

API REST

API (interfață de programare a aplicațiilor) permite comunicarea între două aplicații pentru a prelua sau trimite datele. Există două tipuri populare de API-uri – API-ul web și de sistem.

În acest articol, vom analiza doar API-ul web. Există două tipuri de API web.

  • Cerere – API de răspuns: Rest, GraphQL, Apel de procedură la distanță (RPC)
  • API-ul condus de evenimente: WebHooks, Web Sockets, HTTP Streaming

API REST se încadrează în categoria cerere-răspuns. Utilizează metode HTTP precum GET, POST și PUT pentru a efectua operațiuni API.

Un exemplu clasic este atunci când un utilizator trimite o metodă GET către serviciul web pentru a solicita sau recupera o resursă specifică sau o colecție de resurse. Serverul trimite apoi înapoi resursa specifică sau colecția de resurse înapoi utilizatorului care a solicitat-o.

Cadrul Flaconului

Flaconul este un cadru bazat pe python. Este un micro-cadru folosit de dezvoltatorii python pentru a construi API-ul de repaus. Se numește cadru micro, deoarece permite dezvoltatorilor, de exemplu, să adauge autentificare personalizată și orice alt sistem de backend bazat pe preferințe.

Să începem cu implementarea. Configurarea sistemului meu este următoarea.

  • Ubuntu ca sistem de operare
  • Python 2.7+
  • Poştaş

Configurați un mediu virtual folosind virtualenv

Trebuie să creăm un mediu virtual pentru a ne asigura că unele pachete nu vor intra în conflict cu pachetele de sistem. Să folosim virtualenv pentru a configura un nou mediu virtual.

Presupunând că aveți comanda pip disponibilă în sistemul dvs., executați următoarea comandă prin pip pentru instalare.

pip install virtualenv

Dacă nu aveți pip în aparat, urmați acest lucru documentație să instalezi pip pe sistemul tău.

În continuare, creăm un director care să stocheze sau să păstreze mediul nostru virtual. Utilizați comanda mkdir prezentată mai jos pentru a crea un director

mkdir flaskproject

Modificați în directorul flaskproject folosind următoarea comandă

cd flaskproject

În cadrul directorului flaskproject, utilizați instrumentul virtualenv pentru a crea un mediu virtual așa cum se arată mai jos:

virtualenv flaskapi

După ce ați folosit instrumentul virtualenv pentru a crea mediul virtual, executați comanda cd pentru a trece în directorul flaskapi ca mediu virtual și activați-l folosind comanda de mai jos.

sursa / activare

Execută toate sarcinile legate de acest proiect în mediul virtual.

Instalați pachetele folosind pip

Acum este timpul să instalăm pachete precum cadrul de flacon și PyJWT pe care le vom folosi pentru a construi API-ul de rest și alte pachete necesare pentru proiectul nostru API.

Creați un fișier require.txt cu următoarele pachete.

sticlă
datetime
UUID
Flask-SQLAlchemy
PyJWT

Instalați-le cu pip.

pip install -r conditions.txt

Configurați o bază de date

Să instalăm SQLite.

apt-get install sqlite3

Creați o bază de date numită biblioteca. În cadrul acestei baze de date, vom crea două tabele și anume tabelul Utilizatori și Autori.

Tabelul utilizatorilor va conține utilizatori înregistrați. Doar utilizatorii înregistrați pot avea acces la tabelul Autori.

Tabelul de autori va stoca informațiile sau detaliile autorilor, cum ar fi numele autorului, țara de naștere și așa mai departe, trimise de utilizatorii înregistrați.

Creați baza de date folosind următoarea comandă:

sqlite3 library.db

Puteți verifica dacă ați creat cu succes baza de date utilizând comanda de mai jos:

.baze de date

Deschideți un terminal nou și executați următoarele în mediul virtual pe care l-am creat anterior.

atingeți app.py

Lipiți următorul cod în fișierul numit app.py

din importul flaconului Flask, request, jsonify, make_response
din flask_sqlalchemy import SQLAlchemy
din werkzeug.security import generate_password_hash, check_password_hash
import uuid
import jwt
import date de timp
de la funcools impachetează import

Prima linie din codul de mai sus importă pachete precum cerere și jsonificare. Vom folosi solicitarea pentru a urmări datele la nivel de solicitare în timpul unei solicitări și vom folosi jsonify pentru a genera răspunsuri într-o JSON format.

Pe linia următoare, am importat SQLAlchemy din flask_sqlalchemy pentru a integra caracteristicile SQLAlchemy în balon.

De la werkzeug.security, am importat generate_password_hash pentru a genera hash de parolă pentru utilizatori și check_password_hash pentru a verifica parola utilizatorului atunci când compară parola trimisă de utilizatori cu parolele utilizatorilor stocate în baza de date.

În cele din urmă, am importat uuid cunoscut și ca identificatori unici universali pentru a genera numere de identitate aleatoare pentru utilizatori.

Totuși, în fișierul app.py, implementați setările de configurare pentru API-ul bibliotecii folosind codul de mai jos din fișierul app.py.

Plasați următorul cod sub declarația de import.

app = Flacon (__ nume__)

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

db = SQLAlchemy (aplicație)

Creează acum două modele pentru tabelul Utilizatori și Autori, așa cum se arată mai jos. Copiați și lipiți codul în fișierul app.py.

Plasați codul de mai jos chiar sub această bază de date setarea db = SQLAlchemy (aplicație)

Utilizatori de clasă (db.Model):
id = db.Column (db.Integer, basic_key = True)
public_id = db.Column (db.Integer)
name = db.Column (db.String (50))
parola = db.Column (db.String (50))
admin = db.Column (db.Boolean)
Autori de clasă (db.Model):
id = db.Column (db.Integer, basic_key = True)
nume = db.Column (db.String (50), unic = True, nullable = False))
book = db.Column (db.String (20), unic = True, nullable = False))
country = db.Column (db.String (50), nullable = False))
booker_prize = db.Column (db.Boolean)

Generați tabele de utilizatori și autori

Pe terminal, tastați următorul cod în mediul virtual pentru a genera sau crea tabele atât pentru tabelele Utilizatori cât și pentru Autori, așa cum se arată mai jos

din aplicația import db
db.create_all ()

După aceea, deschideți fișierul app.py în mediul virtual și creați o altă funcție.

Această funcție va genera tokenuri pentru a permite utilizatorilor înregistrați să acceseze și să efectueze un set de operații API în tabelul Autori.

Plasați acest cod sub modelul bazei de date pentru tabelul Autori

def token_required (f):
@wraps (f)
def decorator (* args, ** kwargs):

jeton = Niciuna

dacă „x-access-tokens” în cerere.headers:
token = request.headers [‘x-access-tokens’]

dacă nu jeton:
return jsonify ({‘mesaj’: ‘lipsește un jeton valabil’})

încerca:
date = jwt.decode (token, app.config [SECRET_KEY])
current_user = Users.query.filter_by (public_id = date [‘public_id’]). primul ()
cu exceptia:
return jsonify ({‘mesaj’: ‘token-ul nu este valabil’})

return f (current_user, * args, ** kwargs)
retur decorator

Creați rute pentru tabelul utilizatorilor

Acum creăm o rută pentru a permite utilizatorilor să se înregistreze pentru API-ul Authors printr-un nume de utilizator și o parolă, așa cum se arată mai jos.

Deschideți din nou fișierul app.py în mediul virtual și lipiți următorul cod sub funcția token_required (f)

@ app.route (‘/ înregistrare’, metode = [‘GET’, ‘POST’])
def signup_user ():
data = request.get_json ()

hashed_password = generate_password_hash (date [‘parolă’], metodă = ‘sha256’)

new_user = Utilizatori (public_id = str (uuid.uuid4 ()), nume = date [‘nume’], parolă = hashed_password, admin = False)
db.session.add (new_user)
db.session.commit ()

returnează jsonify ({‘mesaj’: ‘înregistrat cu succes’})

În interiorul mediului virtual, creați un alt traseu în fișierul app.py pentru a permite utilizatorilor înregistrați să se autentifice.

Când un utilizator se conectează, este generat un jeton aleatoriu pentru ca utilizatorul să acceseze API-ul bibliotecii.

Lipiți codul de mai jos sub ruta anterioară pe care am creat-o.

@ app.route (‘/ login’, metode = [‘GET’, ‘POST’])
def login_user ():

auth = cerere.autorizare

dacă nu auth sau nu auth.username sau nu auth.password:
return make_response (‘nu a putut verifica’, 401, {‘WWW.Authentication’: ‘Tărâm de bază: "autentificare necesară"„})

user = Users.query.filter_by (nume = nume auth.us) .first ()

dacă check_password_hash (user.password, auth.password):
token = jwt.encode ({‘public_id’: user.public_id, ‘exp’: datetime.datetime.utcnow () + datetime.timedelta (minute = 30)}, app.config [‘SECRET_KEY’])
return jsonify ({‘token’: token.decode (‘UTF-8’)})

return make_response (‘nu a putut verifica’, 401, {‘WWW.Authentication’: ‘Tărâm de bază: "autentificare necesară"„})

Totuși, în mediul virtual, creați o altă rută în fișierul app.py pentru a obține sau recupera toate utilizatorii înregistrați.

Acest cod verifică toți utilizatorii înregistrați în tabelul Utilizatori și returnează rezultatul final într-un format JSON.

Lipiți codul de mai jos sub ruta de conectare

@ app.route (‘/ utilizatori’, metode = [‘GET’])
def get_all_users ():

utilizatori = Users.query.all ()

rezultat = []

pentru utilizator în utilizatori:
user_data = {}
user_data [‘public_id’] = user.public_id
user_data [‘nume’] = nume utilizator
user_data [‘parola’] = user.password
user_data [‘admin’] = user.admin

result.append (user_data)

returnează jsonify ({‘utilizatori’: rezultat})

Creați rute pentru tabelul de autori 

Să creăm rute pentru tabelul Autori, pentru a permite utilizatorilor să recupereze toți autorii din baza de date, precum și să ștergem autori.

Doar utilizatorii cu jetoane valide pot efectua aceste operațiuni API.

În fișierul app.py, creați o rută pentru utilizatorii înregistrați pentru a crea noi autori.

Lipiți acest cod pe ruta care permite utilizatorului să recupereze toți utilizatorii înregistrați.

@ app.route (‘/ autor’, metode = [‘POST’, ‘GET’])
@token_required
def create_author (curent_user):

data = request.get_json ()

new_authors = 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’: ‘nou autor creat’})

Apoi, creați o altă rută pentru a permite unui utilizator înregistrat cu un simbol valabil să recupereze toți autorii din tabelul Autori, așa cum se arată mai jos.

Lipiți acest cod sub ruta, care permite utilizatorului să creeze un nou autor.

@ app.route (‘/ autori’, metode = [‘POST’, ‘GET’])
@token_required
def get_authors (curent_user):

autori = Authors.query.filter_by (user_id = current_user.id) .all ()

ieșire = []
pentru autor în autori:

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

returnează jsonify ({‘list_of_authors’: output})

În cele din urmă, încă în fișierul app.py, creați o rută pentru a șterge un autor specificat, așa cum se arată mai jos.

Lipiți acest cod pe ruta care permite utilizatorului să recupereze o listă de autori.

@ app.route (‘/ autori /’, metode = [‘Șterge’])
@token_required
def delete_author (current_user, author_id):
autor = Author.query.filter_by (id = autor_id, user_id = curent_user.id) .first ()
dacă nu autor:
return jsonify ({‘mesaj’: ‘autorul nu există’})

db.session.delete (autor)
db.session.commit ()

return jsonify ({‘message’: ‘Autor șters’})

dacă __name__ == ‘__main__’:
app.run (debug = True)

După aceea, salvați și închideți fișierul app.py în mediul virtual.

Testarea API-ului bibliotecii cu Postman

În această secțiune, vom folosi un instrument poștal pentru a trimite o solicitare serviciilor bazei de date. Dacă nu aveți un poștaș pe mașina dvs., puteți afla cum îl puteți descărca și instala aici.

În afară de poștaș, putem folosi alte instrumente cum ar fi Răsuci pentru a trimite cereri către server.

Deschideți un terminal nou și introduceți următoarele:

poştaş

Poștașul de comandă va determina browserul dvs. web să afișeze pagina de mai jos:

postman_signup

Puteți decide să vă înscrieți și să creați un cont gratuit, dar vom omite și vom avea acces direct la aplicație pentru a testa API-ul bibliotecii, așa cum se arată mai jos:

Testați api-ul bibliotecii

În această secțiune, vom permite unui utilizator să se înregistreze pentru API-ul bibliotecii, furnizând un nume de utilizator și o parolă unică într-un format JSON folosind metoda POST folosind pașii de mai jos:

  • Faceți clic pe fila cu eticheta Body
  • Apoi selectați butonul brut și alegeți formatul JSON
  • introduceți un nume de utilizator și o parolă pentru a vă înregistra așa cum se arată în captură de ecran
  • Lângă butonul de trimitere, introduceți următoarea adresă URL http://127.0.0.1/register
  • În cele din urmă, schimbați metoda în POST și apăsați butonul de trimitere.

un utilizator se înregistrează pentru o api

Va afișa următoarea ieșire, așa cum se arată mai jos:

Acum am înregistrat cu succes un utilizator. Să mergem mai departe pentru a permite utilizatorului care tocmai s-a înregistrat să se autentifice pentru a genera un jeton temporar aleatoriu pentru a accesa tabelul Autori, urmând pașii următori:

  •  Faceți clic pe fila de autorizare.
  • În secțiunea tip, selectați autentificarea de bază.
  • Apoi completați formularul de utilizator și parola cu numele de utilizator și parola cu care v-ați înregistrat anterior.
  • În cele din urmă, apăsați butonul de trimitere pentru a vă autentifica și generați un jeton aleatoriu.

Odată cu conectarea utilizatorului cu succes, este generat un jeton aleatoriu pentru utilizator, așa cum se arată în captură de ecran.

Vom folosi tokenul aleator generat pentru a accesa tabelul Autori.

În această secțiune, vom adăuga informațiile unui autor în tabelul Autori prin metoda POST, urmând pașii următori:

  • Faceți clic pe fila anteturi
  • Includeți următoarele anteturi HTTP afișate în captură de ecran

  • Apoi, faceți clic pe fila corp și introduceți detaliile noului autor
  • Apoi apăsați butonul de trimitere pentru a adăuga detaliile autorului în tabelul autorului

Puteți prelua informațiile autorilor din tabelul Autori prin următoarele:

  • Asigurați-vă că tokenul dvs. generat este în secțiunea anteturi. dacă nu este acolo, trebuie să-l completați cu jetonul.
  • Lângă butonul de trimitere, introduceți această adresă URL http://127.0.0.1/authors
  • Apoi schimbați metoda HTTP în GET și apăsați butonul de trimitere pentru a prelua detaliile autorilor.

În sfârșit, puteți șterge autorul (autorii) din tabelul Autori prin metoda DELETE folosind următorii pași:

  • Asigurați-vă că simbolul dvs. este încă în secțiunea anteturi. Puteți verifica fila anteturi pentru a vă asigura că informațiile necesare sunt în vigoare.
  • Pe lângă butonul de trimitere, introduceți această adresă URL http://127.0.0.1/sam
  • Apoi apăsați butonul de trimitere pentru a șterge utilizatorul pe care l-ați specificat.

Puteți găsi codul sursă complet pe github.  Îl puteți clona și verifica în mașină.

ETICHETE:

  • Piton

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