Kom ons leer hoe om ‘n REST API met JSON-webtokens te beveilig om gebruikers en derdeparty-toepassings te misbruik.


Ons sal ‘n databasisdiens bou met behulp van SQLite en gebruikers toelaat om dit via ‘n REST-API te gebruik deur HTTP-metodes soos POST en PUT te gebruik.

Daarbenewens sal ons weet waarom JSON-webtokens ‘n geskikte manier is om rus-API te beskerm in plaas van vertering en basiese verifikasie. Laat ons die begrip JSON-webtokens, REST API en Flask-raamwerk verstaan ​​voordat ons verder gaan.

JSON Web Tokens

JSON webtoken, ook bekend as JWT, is die veilige manier om lukrake tekens tussen twee partye of entiteite oor te dra. JSON bestaan ​​gewoonlik uit drie dele soos volg.

  • loonvrag
  • kop
  • Handtekening

JSON gebruik twee soorte struktuurvorms wanneer data of inligting tussen twee partye oorgedra word.

  • serialized
  • Deserialized

Die opgesomde vorm word gebruik wanneer data deur die versoek en antwoord na die netwerk oorgedra word, terwyl die deserialiseerde vorm gebruik word om data na die webtoken te lees en te skryf..

In die serie-vorm is daar drie komponente.

  • kop
  • loonvrag
  • Handtekening

Die kopkomponent definieer die kriptografiese inligting oor die tekens. Byvoorbeeld:

  • Is dit onderteken of nie onderteken JWT?
  • Definieer algoritme tegnieke

Die ongedierte vorm bevat, in teenstelling met die gevorderde vorm, twee komponente.

  • loonvrag
  • kop

REST API

API (toepassingsprogrammeringskoppelvlak) laat kommunikasie tussen twee toepassings toe om die data op te spoor of in te dien. Daar is twee gewilde API’s – web- en stelsel API.

In hierdie artikel sal ons slegs na die web API kyk. Daar is twee soorte web-API.

  • Request – Response API: Rest, GraphQL, Remote Procedure Call (RPC)
  • Gebeurtenis-gedrewe API: WebHooks, Web Sockets, HTTP Streaming

REST API val onder die kategorie vir versoek-antwoord. Dit maak gebruik van HTTP-metodes soos GET, POST en PUT om API-bewerkings uit te voer.

‘N Klassieke voorbeeld is wanneer ‘n gebruiker ‘n GET-metode na die webdiens stuur om ‘n spesifieke hulpbron of ‘n versameling bronne aan te vra of te kry. Die bediener stuur dan die spesifieke bron of die versameling bronne terug na die gebruiker wat dit versoek het.

Kolfraamwerk

Fles is ‘n raamwerk gebaseer op python. Dit is ‘n mikro-raamwerk wat deur python-ontwikkelaars gebruik word om rus-API te bou. Dit word ‘n mikro-raamwerk genoem, omdat dit ontwikkelaars in staat stel om gepasmaakte verifikasie en enige ander backend-stelsel by te voeg wat gebaseer is op voorkeure..

Laat ons begin met die implementering. My stelselopstelling is soos volg.

  • Ubuntu as OS
  • Python 2.7+
  • Posman

Stel ‘n virtuele omgewing op met behulp van virtualenv

Ons moet ‘n virtuele omgewing opstel om te verseker dat sommige pakkette nie in stryd is met stelselpakkette nie. Laat ons die virtualenv gebruik om ‘n nuwe virtuele omgewing op te stel.

As u aanneem dat die pip-opdrag op u stelsel beskikbaar is, voer die volgende opdrag via pip uit om te installeer.

pip installeer virtualenv

Volg dit as u nie ‘n pip op u masjien het nie dokumentasie om pip op u stelsel te installeer.

Laat ons nou ‘n gids skep om ons virtuele omgewing op te slaan of te behou. Gebruik die mkdir-opdrag hieronder om ‘n gids te skep

mkdir-flaskprojek

Verander die flaskprojekgids met die volgende opdrag

CD flaskprojek

Gebruik die virtualenv-instrument in die kolomprojekgids om ‘n virtuele omgewing te skep soos hieronder getoon:

virtualenv flaskapi

Nadat u die virtualenv-instrument gebruik het om die virtuele omgewing te skep, voer die cd-opdrag uit om in die flaskapi-gids as die virtuele omgewing te verander en aktiveer dit met behulp van die opdrag hieronder.

bron / aktiveer

Voer alle take wat met hierdie projek verband hou binne die virtuele omgewing uit.

Installeer pakkette met behulp van pip

Dit is nou die tyd om pakkette soos die kolfraamwerk en PyJWT te installeer wat ons sal gebruik om die res API en ander nodige pakkette vir ons API-projek te bou.

Skep ‘n vereistes.txt-lêer met die volgende pakkette.

Fles
Datum Tyd
UUID
Fies-SQLAlchemy
PyJWT

Installeer dit met pip.

pip installeer -r vereistes.txt

Stel ‘n databasis op

Laat ons SQLite installeer.

apt-get installeer sqlite3

Skep ‘n databasis met die naam van die biblioteek. Binne hierdie databasis skep ons twee tabelle, naamlik die Gebruikers- en skrywers-tabel.

Gebruikers-tabel sal geregistreerde gebruikers bevat. Slegs geregistreerde gebruikers kan toegang hê tot die skrywers-tabel.

Outeurstabel sal outeurs se inligting of besonderhede stoor, soos die naam van die outeur, die geboorteland en so meer deur die geregistreerde gebruikers ingedien.

Skep die databasis met die volgende opdrag:

sqlite3 biblioteek.db

U kan kyk of u die databasis suksesvol gemaak het deur die onderstaande opdrag te gebruik:

.databasisse

Maak ‘n nuwe terminale oop en voer die volgende uit in die virtuele omgewing wat ons vroeër geskep het.

raak app.py

Plak die volgende kode in die lêer met die naam app.py

vanaf fles invoer Flask, versoek, jsonify, make_response
invoer van SQLAlchemie vanaf flask_sqlalchemy
van werkzeug.security import genereer_password_hash, check_password_hash
invoer uuid
invoer jwt
invoer datetime
vanaf funksools invoerverpakking

Die eerste reël in die kode hierbo voer pakkette soos versoek en jsonify in. Ons sal gebruik maak van die versoek om die data op versoekvlak op te spoor tydens ‘n versoek en gebruik jsonify om antwoorde in ‘n into formaat.

Op die volgende reël het ons SQLAlchemy vanaf flask_sqlalchemy ingevoer om SQLAlchemy-funksies in die kolf te integreer.

Van werkzeug.security, het ons genereer_password_hash ingevoer om ‘n hash-hash vir gebruikers te genereer en check_password_hash om die gebruiker se wagwoord na te gaan wanneer ons wagwoorde wat deur gebruikers ingedien is vergelyk met die wagwoorde van gebruikers wat in die databasis gestoor is.

Uiteindelik het ons uuid, ook bekend as universele unieke identifiseerders, ingevoer om willekeurige ID-nommers vir gebruikers te genereer.

Implementeer die konfigurasie-instellings vir die biblioteek-API binne die app.py-lêer, en gebruik die kode hieronder in die app.py-lêer..

Plaas die volgende kode onder die invoerstaat.

app = Fles (__ naam__)

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

db = SQLAlchemie (app)

Skep nou twee modelle vir die tabel Gebruikers en skrywers, soos hieronder getoon. Kopieer en plak die kode in die app.py-lêer.

Plaas die kode hieronder onder hierdie databasisinstelling db = SQLAlchemy (app)

klasgebruikers (db.Model):
id = db.Column (db.Integer, primary_key = True)
public_id = db.Column (db.Integer)
naam = db.kolom (db.String (50))
wagwoord = db.kolom (db.String (50))
admin = db.Column (db.Boolean)
klas skrywers (db.Model):
id = db.Column (db.Integer, primary_key = True)
naam = db.kolom (db.String (50), uniek = Waar, nullabel = vals))
boek = db.kolom (db.String (20), uniek = Waar, nullabel = onwaar))
land = db.kolom (db.String (50), nullabel = vals))
booker_prize = db.Column (db.Boolean)

Genereer tabelle vir gebruikers en skrywers

Tik op die terminale die volgende kode in die virtuele omgewing om tabelle te genereer of vir beide die tabelle Gebruikers en Skrywers te skep, soos hieronder getoon

vanaf app-invoer db
db.create_all ()

Open daarna die app.py-lêer in die virtuele omgewing en skep ‘n ander funksie.

Hierdie funksie sal tokens genereer om slegs geregistreerde gebruikers toegang tot ‘n stel API-bedrywighede toe te laat teen die Authors-tabel.

Plaas hierdie kode onder die databasismodel vir die skrywers-tabel

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

teken = Geen

as ‘x-access-tokens’ in aanvraag. headers:
token = request.headers [‘x-access-tokens’]

indien nie teken nie:
return jsonify ({‘message’: ”n geldige token ontbreek’})

probeer:
data = jwt.decode (token, app.config [SECRET_KEY])
current_user = Users.query.filter_by (public_id = data [‘public_id’]). eerste ()
behalwe:
return jsonify ({‘message’: ‘token is ongeldig’})

gee terug f (huidige gebruiker, * args, ** kwargs)
terugkeerversierder

Skep roetes vir die gebruikers-tabel

Laat ons nou ‘n roete skep om gebruikers toe te laat om vir die Authors API te registreer via ‘n gebruikersnaam en wagwoord soos hieronder getoon.

Maak weer die app.py-lêer in die virtuele omgewing oop en plak die volgende kode onder die funksie token_required (f)

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

hashed_password = genereer_password_hash (data [‘wagwoord’], metode = ‘sha256’)

new_user = Gebruikers (public_id = str (uuid.uuid4 ()), naam = data [‘naam’], wagwoord = hashed_password, admin = onwaar)
db.session.add (new_user)
db.session.commit ()

return jsonify ({‘message’: ‘suksesvol geregistreer’})

Skep ‘n ander roete in die app.py-lêer in die virtuele omgewing om geregistreerde gebruikers in te log.

As ‘n gebruiker aanmeld, word ‘n willekeurige token gegenereer om toegang tot die biblioteek-API te verkry.

Plak die kode hieronder onder die vorige roete wat ons geskep het.

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

autor = versoek. magtiging

indien nie authentic.usnaam of nie authentic.password:
return make_response (‘kon nie verifieer nie’, 401, {‘WWW.Authentication’: ‘Basiese gebied: "login benodig"’})

user = Gebruikers.query.filter_by (naam = autorit.gebruikersnaam). eerste ()

as check_password_hash (user.password, authentic.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 (‘kon nie verifieer nie’, 401, {‘WWW.Authentication’: ‘Basiese gebied: "login benodig"’})

Skep tog binne die virtuele omgewing nog ‘n roete in die app.py-lêer om alle geregistreerde gebruikers te kry of op te spoor.

Hierdie kode kontroleer vir alle geregistreerde gebruikers in die Gebruikertabel en gee die finale uitslag in ‘n JSON-formaat.

Plak die kode hieronder onder die aanmeldroete

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

gebruikers = Users.query.all ()

resultaat = []

vir gebruiker in gebruikers:
user_data = {}
user_data [‘public_id’] = user.public_id
user_data [‘name’] = gebruikersnaam
user_data [‘password’] = user.password
user_data [‘admin’] = user.admin

result.append (user_data)

return jsonify ({‘gebruikers’: resultaat})

Skep roetes vir die outeurstabel 

Kom ons skep roetes vir die skrywers-tabel om gebruikers in staat te stel om alle outeurs in die databasis op te spoor, en outeurs uit te vee.

Slegs gebruikers met geldige tokens kan hierdie API-bewerkings uitvoer.

Binne die app.py-lêer, skep ‘n roete vir geregistreerde gebruikers om nuwe outeurs te skep.

Plak hierdie kode onder die roete waarmee ‘n gebruiker alle geregistreerde gebruikers kan ophaal.

@ app.route (‘/ skrywer’, metodes = [‘POST’, ‘GET’])
@token_required
def create_author (huidige_gebruiker):

data = request.get_json ()

new_authors = Skrywers (naam = data [‘naam’], land = data [‘land’], boek = data [‘boek’], booker_prize = True, user_id = current_user.id)
db.session.add (new_authors)
db.session.commit ()

return jsonify ({‘message’: ‘nuwe outeur geskep’})

Skep nou ‘n ander roete om ‘n geregistreerde gebruiker met ‘n geldige token in staat te stel om alle outeurs in die outeurs-tabel op te spoor soos hieronder getoon.

Plak hierdie kode onder die roete waarmee ‘n gebruiker ‘n nuwe outeur kan skep.

@ app.route (‘/ auteurs’, metodes = [‘POST’, ‘GET’])
@token_required
def get_authors (huidige_gebruiker):

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

uitset = []
vir skrywer in skrywers:

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)

return jsonify ({‘list_of_authors’: output})

Laastens, nog in die app.py-lêer, skep ‘n roete om ‘n gespesifiseerde outeur uit te vee soos hieronder getoon.

Plak hierdie kode onder die roete waarmee ‘n gebruiker ‘n lys outeurs kan ophaal.

@ app.route (‘/ auteurs /’, methodes = [‘DELETE’])
@token_required
def delete_author (huidige_gebruiker, outeur_id):
author = Author.query.filter_by (id = author_id, user_id = current_user.id) .first ()
indien nie skrywer:
return jsonify ({‘message’: ‘skrywer bestaan ​​nie’})

db.session.delete (skrywer)
db.session.commit ()

return jsonify ({‘message’: ‘Author is geskrap’})

as __name__ == ‘__main__’:
app.run (debug = true)

Stoor en sluit daarna die app.py-lêer in die virtuele omgewing.

Toets die biblioteek API met Postman

In hierdie afdeling maak ons ​​gebruik van ‘n posbode-instrument om ‘n versoek aan die databasisdienste te stuur. As u nie ‘n posman op u masjien het nie, kan u uitvind hoe u dit aflaai en installeer hier.

Afgesien van die posbode, kan ons gebruik maak van ander instrumente soos Krul om versoeke na die bediener te stuur.

Maak ‘n nuwe terminale oop en tik die volgende in:

posman

Die opdragboodskapper sal veroorsaak dat u webblaaier die bladsy hieronder vertoon:

postman_signup

U kan besluit om aan te meld en ‘n gratis rekening te skep, maar ons sal direkte toegang tot die app kry om die biblioteek-API te toets, soos hieronder getoon:

Toets die biblioteek api

In hierdie afdeling laat ons ‘n gebruiker toe om vir die biblioteek-API te registreer deur ‘n gebruikersnaam en ‘n unieke wagwoord in ‘n JSON-formaat te verskaf met behulp van die POST-metode deur die onderstaande stappe te gebruik:

  • Klik op die oortjie met die naam Body
  • Kies dan die rou knop en kies die JSON-formaat
  • voer ‘n gebruikersnaam en wagwoord in om te registreer soos aangedui op die skermkiekie
  • Voeg die volgende URL http://127.0.0.1/register langs die stuurknoppie in
  • Uiteindelik, verander die metode na POST en druk op die stuurknoppie.

'n gebruiker registreer vir 'n api

Dit sal die volgende afvoer vertoon soos hieronder getoon:

Nou het ons ‘n gebruiker suksesvol geregistreer. Laat ons toe om die gebruiker wat pas geregistreer het, toe te laat om aan te meld om ‘n tydelike token te genereer om toegang tot die skrywers-tabel te verkry deur die volgende stappe te gebruik:

  •  Klik op die magtigingstab.
  • Kies die basiese verifikasie onder die tipe afdeling.
  • Vul dan die gebruikersnaam en wagwoordvorm in met die gebruikersnaam en wagwoord waarmee u voorheen geregistreer het.
  • Druk ten slotte op die stuurknoppie om aan te meld en ‘n ewekansige teken te genereer.

Sodra die gebruiker suksesvol aangemeld het, word ‘n ewekansige token vir die gebruiker gegenereer soos op die skermkiekie getoon.

Ons sal gebruik maak van die gegenereerde ewekansige token om toegang tot die skrywers-tabel te kry.

In hierdie afdeling voeg ons die inligting van ‘n skrywer by met die POST-metode aan die skrywers-tabel deur die volgende stappe te gebruik:

  • Klik op die bladsyopskrifte-oortjie
  • Sluit die volgende HTTP-kopstukke in wat op die skermkiekie verskyn

  • Klik dan op die oortjie-oortjie en voer die besonderhede van die nuwe outeur in
  • Druk dan op die stuurknoppie om die outeur se besonderhede by die skrywer se tafel te voeg

U kan ook die inligting van outeurs in die skrywers-tabel ophaal via die volgende:

  • Maak seker dat u gegenereerde teken in die opskrif-afdeling is. as dit nie daar is nie, moet u dit met u teken invul.
  • Tik langs die stuurknoppie hierdie URL http://127.0.0.1/authors in
  • Verander dan die HTTP-metode na GET en druk op die stuurknoppie om die outeursdetails te kry.

Uiteindelik kan u die outeur (s) in die skrywers-tabel via die DELETE-metode verwyder deur die volgende stappe te gebruik:

  • Maak seker dat u teken steeds in die opskrifafdeling is. U kan die oortjie-oortjie nagaan om seker te maak dat die nodige inligting beskikbaar is.
  • Tik langs die stuurknoppie hierdie URL http://127.0.0.1/sam in
  • Druk dan op die stuurknoppie om die gebruiker wat u gespesifiseer het, uit te vee.

U kan die volledige bronkode op vind GitHub.  U kan dit kloon en dit op u rekenaar sien.

Tags:

  • Python

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me