JSON Web Belirteçlerinin kullanımı ve hata ayıklaması kolaydır, ancak aynı zamanda etkileyici bir güvenlik artışı sunarlar.

Bozuk kimlik doğrulaması, modern web uygulamalarında kalıcı bir güvenlik açığı olmaya devam ediyor; OWASP'nin en önemli 10 API güvenlik riski arasında hâlâ üst sıralarda yer alıyor.

Bu güvenlik açığının etkileri ciddi olabilir. Hassas verilere yetkisiz erişim izni verebilir ve sistem bütünlüğünü tehlikeye atabilirler. Uygulamalara ve kaynaklarına etkili bir şekilde güvenli erişim sağlamak için sağlam kimlik doğrulama mekanizmaları kullanmanız çok önemlidir.

Popüler ve etkili bir belirteç tabanlı yöntem olan JSON Web Simgelerini (JWT) kullanarak Flask'ta kullanıcı kimlik doğrulamasını nasıl uygulayabileceğinizi öğrenin.

JSON Web Belirteçlerini Kullanan Belirteç Tabanlı Kimlik Doğrulama

Belirteç tabanlı kimlik doğrulama, bir sistem veya kaynağa erişimi doğrulamak ve yetkilendirmek için şifrelenmiş bir karakter dizisi kullanır. Oturum belirteçleri, API anahtarları ve JSON Web Belirteçleri dahil olmak üzere çeşitli yöntemler kullanarak bu tür kimlik doğrulamasını uygulayabilirsiniz.

Özellikle JWT'ler, gerekli kullanıcıların kimlik bilgilerini istemci tarafı uygulamalar ve sunucular arasında iletmek için güvenli ve kompakt bir yaklaşım sunar.

Bir JWT üç ana bileşenden oluşur: başlık, yük ve imza. Başlık, belirteci kodlamak için kullanılan karma algoritma dahil olmak üzere, belirteç hakkında meta verileri içerir.

Yük, kullanıcı kimliği ve izinler gibi gerçek kullanıcı kimlik bilgilerini içerir. Son olarak, imza, içeriğini gizli bir anahtar kullanarak doğrulayarak belirtecin geçerliliğini sağlar.

JWT'leri kullanarak, kullanıcıların kimliğini doğrulayabilir ve oturum verilerini belirtecin içinde depolayabilirsiniz.

Flask Projesi ve MongoDB Veritabanı Kurma

Başlamak için bir terminal kullanarak yeni bir proje dizini oluşturun:

mkdir şişesi projesi
cd şişesi projesi

Ardından, yükleyin sanal ortam, Flask projeniz için yerel bir sanal geliştirme ortamı oluşturmak için.

sanalenv venv

Son olarak sanal ortamı etkinleştirin.

# Unix veya MacOS: 
kaynak venv/bin/etkinleştir

# Pencereler:
.\venv\Komut Dosyaları\etkinleştir

Bu projenin kodunu burada bulabilirsiniz. GitHub deposu.

Gerekli Paketleri Kurun

Proje klasörünüzün kök dizininde yeni bir tane oluşturun. gereksinimler.txt dosyasını açın ve proje için şu bağımlılıkları ekleyin:

matara
pyjwt
python-dotenv
pirmongo
şifrelemek

Son olarak paketleri kurmak için aşağıdaki komutu çalıştırın. Sahip olduğundan emin ol bip (paket yöneticisi) yüklü; değilse, Windows, Mac veya Linux sisteminize kurun.

pip kurulumu -r gereksinimleri.txt

Bir MongoDB Veritabanı Oluşturun

Devam edin ve bir MongoDB veritabanı oluşturun. Yapabilirsiniz yerel bir MongoDB veritabanı kurun, alternatif olarak, bulut tabanlı bir MongoDB hizmeti olan MongoDB Atlas üzerinde bir küme oluşturun.

Veritabanını oluşturduktan sonra, bağlantı URI'sini kopyalayın, bir .env Dosyayı projenizin kök dizinine kopyalayın ve aşağıdaki gibi ekleyin:

MONGO_URI=""

Son olarak, Flask uygulamanızdan veritabanı bağlantısını yapılandırın. Yeni bir tane oluştur araçlar/db.py projenizin kök dizininde şu kodla dosya:

itibaren pirmongo içe aktarmak MongoClient

kesinconnect_to_mongodb(mongo_uri):
müşteri = MongoClient (mongo_uri)
db = client.get_database("kullanıcılar")
geri dönmek db

Bu işlev, sağlanan bağlantı URI'sini kullanarak MongoDB veritabanına bir bağlantı kurar. Daha sonra yeni bir oluşturur kullanıcılar yoksa koleksiyon ve karşılık gelen veritabanı örneğini döndürür.

Flask Web Sunucusunu Oluşturun

Yapılandırılmış veritabanı ile devam edin ve bir app.py Dosyayı proje klasörünün kök dizinine yerleştirin ve Flask uygulamasının bir örneğini oluşturmak için aşağıdaki kodu ekleyin.

itibaren matara içe aktarmak şişe
itibaren route.user_auth içe aktarmak register_routes
itibaren utils.db içe aktarmak connect_to_mongodb
içe aktarmak işletim sistemi
itibaren dotenv içe aktarmak load_dotenv

uygulama = Şişe (__name__)
load_dotenv()

mongo_uri = os.getenv("MONGO_URI")
db = connect_to_mongodb (mongo_uri)

register_routes (uygulama, veritabanı)

eğer __isim__ == '__ana__':
app.run (hata ayıklama=Doğru)

Kimlik Doğrulama API Uç Noktalarını Oluşturma

Flask uygulamanızda kullanıcı kimlik doğrulamasını uygulamak için, kimlik doğrulamayla ilgili işlemleri gerçekleştiren gerekli API uç noktalarını tanımlamanız çok önemlidir.

Ancak önce kullanıcıların verileri için modeli tanımlayın. Bunu yapmak için yeni bir model/user_model.py dosyasını kök dizine kopyalayın ve aşağıdaki kodu ekleyin.

itibaren pymongo.koleksiyon içe aktarmak Toplamak
itibaren bson.nesne kimliği içe aktarmak Nesne Kimliği

sınıfkullanıcı:
kesin__içinde__(self, koleksiyon: Koleksiyon, kullanıcı adı: str, şifre: str):
self.collection = koleksiyon
self.username = kullanıcı adı
self.password = şifre
kesinkaydetmek(kendi):
kullanıcı_verisi = {
'Kullanıcı adı': self.kullanıcı adı,
'şifre': self.şifre
}
sonuç = self.collection.insert_one (user_data)
geri dönmek str (sonuç.inserted_id)

@statikyöntem
kesinbul_by_id(koleksiyon: Koleksiyon, user_id: str):
geri dönmek koleksiyon.find_one({'_İD': Nesne Kimliği (user_id)})

@statikyöntem
kesinfind_by_username(koleksiyon: Koleksiyon, kullanıcı adı: str):
geri dönmek koleksiyon.find_one({'Kullanıcı adı': Kullanıcı adı})

Yukarıdaki kod bir kullanıcı veri modeli olarak hizmet veren ve kullanıcıyla ilgili işlemleri gerçekleştirmek için bir MongoDB koleksiyonuyla etkileşim kurmak için çeşitli yöntemler tanımlayan sınıf.

  1. bu kaydetmek yöntemi, sağlanan kullanıcı adı ve parola ile yeni bir kullanıcı belgesini MongoDB koleksiyonuna kaydeder ve eklenen belgenin kimliğini döndürür.
  2. bu bul_by_id Ve find_by_username yöntemleri, sırasıyla sağlanan kullanıcı kimliğine veya kullanıcı adına göre kullanıcı belgelerini koleksiyondan alır.

Kimlik Doğrulama Yollarını Tanımlayın

  1. Kayıt yolunu tanımlayarak başlayalım. Bu rota, MongoDB kullanıcıları koleksiyonuna yeni kullanıcı verileri ekleyecektir. Kök dizinde yeni bir tane oluşturun. yollar/user_auth.py dosya ve aşağıdaki kod.
    içe aktarmak jwt
    itibaren işlev araçları içe aktarmak sarar
    itibaren matara içe aktarmak jsonify, istek, make_response
    itibaren modeller.user_model içe aktarmak kullanıcı
    içe aktarmak şifrelemek
    içe aktarmak işletim sistemi

    kesinregister_routes(uygulama, veritabanı):
    koleksiyon = db.users
    uygulama.config['GİZLİ ANAHTAR'] = os.urandom(24)

    @app.route('/api/register', method=['POST'])
    kesinkayıt olmak():

    kullanıcı adı = request.json.get('Kullanıcı adı')
    şifre = request.json.get('şifre')

    mevcut_kullanıcı = User.find_by_username (koleksiyon, kullanıcı adı)
    eğer mevcut kullanıcı:
    geri dönmek jsonify({'İleti': 'Kullanıcı adı zaten var!'})

    hashed_password = bcrypt.hashpw (password.encode("utf-8"), bcrypt.gensalt())
    new_user = Kullanıcı (koleksiyon, kullanıcı adı, hashed_password.decode("utf-8"))
    user_id = new_user.save()

    geri dönmek jsonify({'İleti': 'Kullanıcı başarıyla kaydoldu!', 'Kullanıcı kimliği': Kullanıcı kimliği})

  2. Kimlik doğrulama sürecini yönetmek ve kullanıcı kimlik bilgilerini doğrulamak için oturum açma işlevini uygulayın. Kayıt yolu altına aşağıdaki kodu ekleyin.
     @app.route('/api/login', method=['POST'])
    kesingiriş yapmak():
    kullanıcı adı = request.json.get('Kullanıcı adı')
    şifre = request.json.get('şifre')
    user = User.find_by_username (koleksiyon, kullanıcı adı)
    eğer kullanıcı:
    eğer bcrypt.checkpw (şifre.encode("utf-8"), kullanıcı['şifre'].kodlama("utf-8")):
    belirteç = jwt.encode({'Kullanıcı kimliği': str (kullanıcı['_İD'])}, uygulama.config['GİZLİ ANAHTAR'], algoritma="HS256")

    yanıt = make_response (jsonify({'İleti': 'Giriş başarılı!'}))
    yanıt.set_cookie('jeton', jeton)
    geri dönmek cevap

    geri dönmek jsonify({'İleti': 'Geçersiz kullanıcı adı veya şifre'})

    Oturum açma uç noktası iki şey yapar: sağlanan kullanıcı kimlik bilgilerini doğrular ve başarılı bir kimlik doğrulamanın ardından o kullanıcı için benzersiz bir JWT oluşturur. Bu belirteci, başarılı bir oturum açmayı gösteren bir JSON yükü ile birlikte yanıtta bir tanımlama bilgisi olarak ayarlar. Kimlik bilgileri geçersizse, bunu belirtmek için bir JSON yanıtı döndürür.
  3. Sonraki API istekleriyle birlikte iletilen JSON Web Belirteçlerini (JWT'ler) doğrulayan bir dekoratör işlevi tanımlayın. Aşağıdaki kodu içine ekleyin register_routes işlev kodu bloğu.
    kesinbelirteç_gerekli(F):
    @sarma (f)
    kesindekore edilmiş(*args, **kwargs):
    belirteç = request.cookies.get('jeton')

    eğerOlumsuz jeton:
    geri dönmek jsonify({'İleti': "Jeton eksik!"}), 401

    denemek:
    veri = jwt.decode (token, app.config['GİZLİ ANAHTAR'], algoritmalar=["HS256"])
    current_user = User.find_by_id (koleksiyon, veri['Kullanıcı kimliği'])
    hariç jwt. Süresi DolmuşİmzaHatası:
    geri dönmek jsonify({'İleti': "Jetonun süresi doldu!"}), 401
    hariç jwt. GeçersizTokenError:
    geri dönmek jsonify({'İleti': "Geçersiz belirteç!"}), 401

    geri dönmek f (current_user, *args, **kwargs)

    geri dönmek dekore edilmiş

    Bu dekoratör işlevi, sonraki API isteklerinde geçerli bir JWT belirtecinin varlığını sağlar. Simgenin eksik, süresinin dolmuş veya geçerli olup olmadığını kontrol eder ve varsa uygun bir JSON yanıtı döndürür.
  4. Son olarak, korumalı bir rota oluşturun.
     @app.route('/api/users', method=['GET'])
    @token_gerekli
    kesinget_users(şu anki kullanıcı):
    kullanıcılar = liste (collection.find({}, {'_İD': 0}))
    geri dönmek jsonify (kullanıcılar)

Bu uç nokta, kullanıcı verilerini veritabanından alma mantığını yönetir, ancak istemcinin, verilere erişmek için geçerli bir belirteç içermesi için istek göndermesini gerektirir.

Son olarak, geliştirme sunucusunu döndürmek için aşağıdaki komutu çalıştırın.

şişe koşusu

Kayıt, oturum açma ve korunan kullanıcıların uç noktasını test etmek için Postman veya başka bir API istemcisi kullanabilirsiniz. istek gönder http://localhost: 5000/api/ve bu API uç noktalarının işlevselliğini doğrulamak için yanıtları gözlemleyin.

Belirteç Kimlik Doğrulaması Kusursuz Bir Güvenlik Önlemi mi?

JSON Web Belirteçleri, web uygulamanız için kullanıcıların kimliğini doğrulamanın sağlam ve etkili bir yolunu sağlar. Ancak, belirteç kimlik doğrulamasının kusursuz olmadığını anlamak önemlidir; daha büyük bir güvenlik bulmacasının yalnızca bir parçası.

Belirteç kimlik doğrulamasını diğer en iyi güvenlik uygulamalarıyla birleştirin. Sürekli olarak izlemeyi ve tutarlı güvenlik uygulamaları benimsemeyi unutmayın; Flask uygulamalarınızın genel güvenliğini önemli ölçüde artıracaksınız.