JSON Web Token (JWT), taraflar arasında güvenli bir şekilde bilgi iletmek için kullanılan kompakt ve kendi kendine yeterli bir JSON nesnesi standardıdır. JWT'ler genellikle kimlik doğrulama ve bilgi değişimi için kullanılır.
Bir JWT genellikle şöyle görünür:
xxxxx.yyyyy.zzzzz
Üç bölümden oluşur ve noktalar (.) ile ayrılır:
Header genellikle iki bölümden oluşur: token türü (JWT) ve kullanılan imzalama algoritması (örneğin, HMAC SHA256 veya RSA).
Örnek:
{
"alg": "HS256",
"typ": "JWT"
}
Payload, iddiaları (claims) içerir. İddialar, kullanıcı hakkında ve ek meta veriler hakkında açıklamalardır.
Örnek:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true,
"iat": 1516239022
}
Signature, JWT'nin göndereninin kim olduğunu doğrulamak ve mesajın yol boyunca değiştirilmediğini garanti etmek için kullanılır.
Node.js'de JWT'lerle çalışmak için jsonwebtoken
paketini kullanacağız.
Kurulum:
npm install jsonwebtoken
Node.js'de JWT oluşturmanın yolu:
const jwt = require('jsonwebtoken');
const payload = {
sub: '1234567890',
name: 'John Doe',
admin: true
};
const secretKey = 'your-secret-key';
const token = jwt.sign(payload, secretKey, { expiresIn: '1h' });
console.log(token);
Bu, 1 saat sonra süresi dolacak bir token oluşturur.
Bir JWT'yi doğrulamak için:
const jwt = require('jsonwebtoken');
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'; // JWT'niz burada
const secretKey = 'your-secret-key';
try {
const decoded = jwt.verify(token, secretKey);
console.log(decoded);
} catch(err) {
console.error('Geçersiz token:', err.message);
}
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
app.post('/login', (req, res) => {
// Kullanıcı kimlik bilgilerini doğrula
const user = { id: 1, username: 'john' };
const token = jwt.sign({ userId: user.id }, 'secret-key', { expiresIn: '1h' });
res.json({ token });
});
app.get('/protected', authenticateToken, (req, res) => {
res.json({ message: 'Korunan yol başarıyla erişildi' });
});
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (!token) return res.sendStatus(401);
jwt.verify(token, 'secret-key', (err, user) => {
if (err) return res.sendStatus(403);
req.user = user;
next();
});
}
app.listen(3000, () => console.log('Sunucu 3000 portunda çalışıyor'));
const jwt = require('jsonwebtoken');
// Sunucu A: Kullanıcı bilgileriyle bir token oluşturma
const userInfo = {
id: 123,
name: 'Alice',
role: 'admin'
};
const token = jwt.sign(userInfo, 'shared-secret-key');
// Bu token'ı Sunucu B'ye gönder
// Sunucu B: Token'ı doğrulama ve kullanma
try {
const decoded = jwt.verify(token, 'shared-secret-key');
console.log('Alınan kullanıcı bilgileri:', decoded);
// Kullanıcı bilgilerini kullanarak işlemler yapın
} catch(err) {
console.error('Geçersiz token:', err.message);
}
Yenileme token'ları kullanma örneği:
const jwt = require('jsonwebtoken');
function generateTokens(userId) {
const accessToken = jwt.sign({ userId }, 'access-secret', { expiresIn: '15m' });
const refreshToken = jwt.sign({ userId }, 'refresh-secret', { expiresIn: '7d' });
return { accessToken, refreshToken };
}
function refreshAccessToken(refreshToken) {
try {
const decoded = jwt.verify(refreshToken, 'refresh-secret');
const accessToken = jwt.sign({ userId: decoded.userId }, 'access-secret', { expiresIn: '15m' });
return accessToken;
} catch(err) {
throw new Error('Geçersiz yenileme token'ı');
}
}
// Kullanım
const { accessToken, refreshToken } = generateTokens(123);
// Erişim token'ı süresi dolduğunda, yenileme token'ını kullanarak yeni bir tane alın
const newAccessToken = refreshAccessToken(refreshToken);
Yaygın hataları işleme örneği:
const jwt = require('jsonwebtoken');
function verifyToken(token) {
try {
return jwt.verify(token, 'your-secret-key');
} catch(err) {
if (err instanceof jwt.JsonWebTokenError) {
// JWT geçersiz
console.error('Geçersiz JWT:', err.message);
} else if (err instanceof jwt.TokenExpiredError) {
// JWT süresi dolmuş
console.error('JWT süresi dolmuş:', err.message);
} else {
// Diğer hata
console.error('JWT doğrulama hatası:', err.message);
}
return null;
}
}
// Kullanım
const result = verifyToken('your-token-here');
if (result) {
console.log('Token geçerli:', result);
} else {
console.log('Token doğrulama başarısız');
}
2024 © Tüm hakları saklıdır - buraxta.com