Giriş
Web uygulamalarında kullanıcı kimlik doğrulama, güvenlik açısından kritik bir bileşendir. JWT (JSON Web Token), web uygulamalarında kullanıcıların kimliğini doğrulamak ve oturum yönetimini sağlamak için oldukça popüler bir yöntemdir. Flask, küçük ve başlangıç seviyesi uygulamalardan kapsamlı sistemlere kadar birçok projede kullanılan hafif bir web çerçevesidir. Bu yazıda, Flask ile JWT kullanarak yapacağımız kullanıcı kimlik doğrulama sürecini adım adım inceleyeceğiz.
JWT Nedir?
JWT, JSON formatında verileri şifreleyerek güvenli bir şekilde taşımayı sağlayan bir yöntemdir. Temel olarak, üç bölümden oluşur: Header (Başlık), Payload (Yük) ve Signature (İmza). Header kısmı, token’ın türü ve algoritma hakkında bilgi verir. Payload kısmı, kullanıcıya ait bilgilerin yer aldığı kısımdır ve bu bilgiler, JWT’nin doğrulama ve yetkilendirme amacıyla kullanılmasını sağlar. Signature kısmı ise, token’ın güvenliğini sağlamak için kullanılabilecek bir imza oluşturur.
JWT’lerin önemli bir avantajı, stateless (durumsuz) olmalarıdır. Yani sunucu tarafında kullanıcı durumu hakkında herhangi bir bilgi saklamaya gerek yoktur. Token, kullanıcının kimliğini ve oturumunu temsil eder ve her istekte kullanıcıdan gelir. Böylece, sunucu sadece token’ı doğrulamakla yükümlüdür.
Özellikle RESTful API geliştirmeleri için vazgeçilmez bir yöntem olan JWT, farklı platformlarda uygulanabilirliği sayesinde geniş bir kullanım yelpazesine sahiptir.
Flask Uygulamasında JWT Kullanımı
Artık JWT’nin ne olduğunu anladığımıza göre, Flask uygulamalarında nasıl kullanılacağını görelim. Başlamadan önce, aşağıdaki temel kütüphaneleri yüklememiz gerekiyor:
- Flask: Web uygulamaları geliştirmek için.
- PyJWT: JWT oluşturmak ve doğrulamak için.
- Flask-RESTful: RESTful API’ler yaratmak için.
- Flask-Cors: CORS ayarları için.
Kütüphaneleri yüklemek için aşağıdaki komutu kullanabilirsiniz:
pip install Flask PyJWT Flask-RESTful Flask-Cors
Şimdi basit bir Flask uygulaması oluşturalım ve JWT entegre edelim.
Flask Uygulamamızın Yapılandırılması
Flask uygulaması için gerekli dosya yapısını oluşturalım. Aşağıdaki şekilde bir `app.py` dosyası oluşturalım:
from flask import Flask, jsonify, request
from flask_cors import CORS
import jwt
import datetime
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
CORS(app)
Burada, Flask uygulamamızı başlatıyoruz ve JWT’nin güvenliği için bir gizli anahtar belirliyoruz. CORS, farklı kaynaklardan gelen isteklere izin vermek için kullanılır.
Şimdi, token oluşturmak için bir route ekleyelim. Aşağıda, kullanıcı adını ve şifresini alarak bir JWT oluşturan bir route görebilirsiniz:
@app.route('/login', methods=['POST'])
def login():
auth = request.json
if not auth or not 'username' in auth or not 'password' in auth:
return jsonify({'message': 'Could not verify'}), 401
user = auth['username']
password = auth['password']
# Dummy authentication (use real authentication in production)
if user == 'myuser' and password == 'mypassword':
token = jwt.encode({'user': user, 'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)}, app.config['SECRET_KEY'])
return jsonify({'token': token})
return jsonify({'message': 'Could not verify'}), 401
Yukarıdaki kodda, kullanıcı adı ve şifre verilerini içeren bir POST isteği alıyoruz. Eğer bilgiler doğruysa, JWT oluşturup geri döndürüyoruz. Bu sadece örnek bir doğrulama, gerçek uygulamalarda bir veri tabanında ya da başka bir kimlik doğrulama sistemi ile kontrol edilmelidir.
JWT Kullanarak Korunan Route’lar Oluşturma
JWT kullanarak bir kullanıcının erişimini kısıtlayan bir route tasarlayalım. Böylece kimliği doğrulanmış kullanıcılar belirli verilere ulaşabilir. Aşağıdaki kod parçasında, JWT’yi doğrulayan bir route ekliyoruz:
def token_required(f):
@wraps(f)
def decorated(*args, **kwargs):
token = None
if 'Authorization' in request.headers:
token = request.headers['Authorization'].split()[1]
if not token:
return jsonify({'message': 'Token is missing!'}), 401
try:
data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
except:
return jsonify({'message': 'Token is invalid!'}), 401
return f(*args, **kwargs)
return decorated
@app.route('/protected', methods=['GET'])
@token_required
def protected():
return jsonify({'message': 'This is protected!', 'user': data['user']})
Burada, `token_required` adında bir dekoratör tanımlıyoruz. Bu dekoratör, her çağrıldığında JWT’yi kontrol eder. Eğer geçerli bir token yoksa veya token geçersizse 401 hatası döndürer. Eğer her şey yolundaysa, korunan route’a erişim sağlanır.
Hata Yönetimi ve Dosya Yapısı
Uygulamamızda, hatalar için basit bir yönetim yapalım. JWT ile sık karşılaşılan hataların yönetilmesi, kullanıcı deneyimini iyileştirir. Hataları daha iyi yönetebilmek için, Flask’da özel hata yöneticileri oluşturabiliriz:
@app.errorhandler(401)
def unauthorized(error):
return jsonify({'message': 'Unauthorized access'}), 401
@app.errorhandler(404)
def not_found(error):
return jsonify({'message': 'Resource not found'}), 404
Yukarıdaki kod ile, 401 ve 404 hataları için özel mesajlar döndürüyoruz. Bu, kullanıcıların neyle karşılaştığını daha iyi anlamalarına yardımcı olur.
Uygulamamızın dosya yapısını iyileştirmek ve kodu daha modüler hale getirmek için, uygulamanızı farklı modüllere ayırabilirsiniz. Örneğin, ayrı bir `auth.py` dosyası oluşturarak kimlik doğrulama işlemlerini burada tutabilirsiniz.
Sonuç
JWT, kullanıcı kimlik doğrulama süreçlerini yönetmek için güçlü bir araçtır ve Flask gibi hafif bir çerçeve ile birleştirildiğinde etkili bir şekilde kullanılabilir. Bu yazıda, JWT ile Flask uygulamalarında nasıl kullanıcı doğrulama işlemi yapılacağını adım adım öğrettik. Öğrendiğimiz bilgilerle, kendi projelerinizde kullanıcı kimlik doğrulama mekanizmaları geliştirebilir ve uygulamalarınızı daha güvenli hale getirebilirsiniz.
Kendinizi geliştirmeye devam edin! Yeni teknolojileri takip edin ve projelerinize uygulamaktan çekinmeyin. Herhangi bir sorunuz veya merak ettiğiniz konular varsa, yorumlarda sorabilirsiniz!
Gelecek yazılarda görüşmek üzere!