Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
August 17, 2021 01:05 pm GMT

Anahtar Dorulamal API Servisi Oluturma

Her istekte kullanc ad ve parolay gnderme zorunluluu sakncaldr ve aktarm gvenli HTTP olsa bile bir gvenlik riski olarak grlebilir, nk istemcinin bu kimlik bilgilerini isteklerle gnderebilmesi iin ifrelemeden saklamas gerekir.

nceki zme gre bir gelime, isteklerin kimliini dorulamak iin bir anahtar kullanmaktr.

Buradaki fikir, istemci uygulamasnn bir kimlik dorulama anahtar iin kimlik dorulama bilgilerini dei toku etmesi ve sonraki isteklerde bu anahtar gndermesidir.

Anahtarlar genellikle bir sona erme sresi ile verilir, ardndan geersiz hale gelirler ve yeni bir anahtar alnmas gerekir. Bir anahtarn szdrlmas durumunda oluabilecek potansiyel hasar, ksa mrleri nedeniyle ok daha kktr.

Uygulama

Anahtarlar kullanmann birok yolu vardr:

Basit bir uygulama, veritabannda kullanc ve parola ile saklanan, muhtemelen bir son kullanma tarihi olan, belirli uzunlukta rastgele bir karakter dizisi oluturmaktr.

Sunucu tarafnda depolama gerektirmeyen daha ayrntl bir uygulama ise, kriptografik olarak imzalanm bir mesaj anahtar olarak kullanmaktr. Bunun avantaj, anahtarla ilgili bilgilerin, yani anahtarn retildii kullancnn, anahtarn kendisinde kodlanmas ve gl bir kriptografik imza ile korunmasdr.

Bu uygulamada da benzer bir yaklam kullanacaz.

Kod

Kodun tamamna buradan ulaabilirsiniz.

Ayrca Python ile REST-API Servisi Oluturmak ile ilgili yazma da buradan ulaabilirsiniz.

from flask import Flask, jsonify, request, make_responseimport jwt import datetimefrom functools import wraps
  • Gerekli paketlerin import edilmesi

jwt: JSON Web Token'lerini (JWT) kodlamanza ve kodunu zmenize olanak tanr.

datetime: Datetime modl, tarih ve saatle almak iin snflar salar.

functools, daha yksek dereceli fonksiyonlar (dier fonksiyonlar zerinde hareket eden veya baka fonksiyon dndren fonksiyonlar) iin standart bir Python modldr. wraps(), bir dekoratrn sarmalayc ilevine uygulanan bir dekoratrdr.

app = Flask(__name__)app.config['SECRET_KEY'] = 'thisisthesecretkey'
  • Flask app objesinin ve gizli anahtarn oluturulmas.
def token_required(f):    @wraps(f)    def decorated(*args, **kwargs):        token = request.args.get('token')        if not token:            return jsonify({'message' : 'Token is missing!'}), 403        try:             data = jwt.decode(token, app.config['SECRET_KEY'], algorithms="HS256")        except Exception as inst:            print(inst)            return jsonify({'message' : 'Token is invalid!'}), 403        return f(*args, **kwargs)    return decorated
  • Anahtar girilmediyse veya girilen anahtar hatalysa hata mesajlar basan, girilen doru bir ekilde decode edildiyse devam eden wrapper fonksiyon.
@app.route('/unprotected')def unprotected():    return jsonify({'message' : 'Anyone can view this!'})@app.route('/protected')@token_requireddef protected():    return jsonify({'message' : 'This is only available for people with valid tokens.'})
  • Test aamasnda kullanmak iin anahtar gerektiren ve gerektirmeyen end-point'lerin oluturulmas.
@app.route('/login')def login():    auth = request.authorization    if auth and auth.password == 'Passw0rd':        token = jwt.encode({'user' : auth.username, 'exp' : datetime.datetime.utcnow() + datetime.timedelta(minutes=15)}, app.config['SECRET_KEY'], algorithm="HS256")        return jsonify({'token' : token})    return make_response('Could not verify!', 401, {'WWW-Authenticate' : 'Basic realm="Login Required"'})
  • Herhangi bir kullanc ad ve "PasswOrd"parolas ile /login end-point'inini ardnzda ;
    • kullanc adnn
    • son kullanma tarihinin
    • ve gizli anahtarn

jwt ile oluturulan anahtar dndren fonksiyon. datetime' kullanp anahtarn kullanlabilirlik sresini 15 dakika yaptmz da grebilirsiniz.

if __name__ == '__main__':    app.run(debug=True)
  • Betik altrldnda app'in debug modda altrlmas.

altrma

$ python3 api.py * Serving Flask app "api" (lazy loading) * Environment: production   WARNING: This is a development server. Do not use it in a production deployment.   Use a production WSGI server instead. * Debug mode: on * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 241-307-717

Testler

Testleri taraycnz zerinde verilen adreslere giderek yapabilirsiniz.

http://127.0.0.1:5000/unprotected

adresine gittiimizde beklediimiz ierii grebiliyoruz.

ss1

http://127.0.0.1:5000/protected

adresine gittiimizde bir anahtar beklendii iin ierikte anahtar eksik uyars alyoruz.

ss2

http://127.0.0.1:5000/login

Adresine gittiimizde bizden kullanc ad ve ifre isteniyor. Herhangi bir kullanc ad ve "Passw0rd" ifresiyle oturum aalm.

ss3

Oturum atmzda kullanc admza ve gizli anahtarmza zel oluturulan 15 dakika geerli anahtarmz grntleyebiliyoruz.

ss4

http://127.0.0.1:5000/protected?token=invalidtoken

Anahtar gerektiren adrese yanl bir anahtar ile gitmeye altmzda beklediimiz uyaryla karlayoruz.

ss5

http://127.0.0.1:5000/protected?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYWxpIiwiZXhwIjoxNjI5MTg4NDMwfQ.ni3Soivc1a4vKyI3_xpDyb1-RV3iDQ4QMtS3FhXijog

Ayn adrese bu ekilde gittiimizde ise herhangi bir uyaryla karlamadan ierii grebiliyoruz.

ss6

Ali Bura Okkal
HAVELSAN - 2021


Original Link: https://dev.to/aciklab/anahtar-dogrulamali-api-servisi-olusturma-5gbo

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To