Authentication Tokens
Token คือข้อมูลที่ใช้ในการยืนยันตัวตน โดยมักจะอยู่ในรูปแบบ string ที่เข้ารหัสไว้ มีหลายประเภทตามการใช้งาน
1. JSON Web Tokens (JWT)
Token ที่เก็บข้อมูลในรูปแบบ JSON และเข้ารหัสด้วย base64 พร้อมลายเซ็นดิจิทัล
javascript
// JWT implementation example
import jwt from 'jsonwebtoken';
class JWTService {
static generateToken(payload) {
return jwt.sign(
payload,
process.env.JWT_SECRET,
{ expiresIn: '1d' }
);
}
static verifyToken(token) {
try {
return jwt.verify(token, process.env.JWT_SECRET);
} catch (error) {
return null;
}
}
static decodeToken(token) {
return jwt.decode(token);
}
}
2. Access & Refresh Tokens
ระบบ token คู่ โดย access token ใช้เข้าถึงระบบระยะสั้น และ refresh token ใช้ต่ออายุ access token
javascript
// Access & Refresh token management
class TokenManager {
static async createTokenPair(userId) {
const accessToken = jwt.sign(
{ userId },
process.env.ACCESS_TOKEN_SECRET,
{ expiresIn: '15m' }
);
const refreshToken = jwt.sign(
{ userId },
process.env.REFRESH_TOKEN_SECRET,
{ expiresIn: '7d' }
);
await db.refreshTokens.create({
data: {
token: refreshToken,
userId
}
});
return { accessToken, refreshToken };
}
static async refreshAccessToken(refreshToken) {
const payload = jwt.verify(
refreshToken,
process.env.REFRESH_TOKEN_SECRET
);
const storedToken = await db.refreshTokens.findUnique({
where: { token: refreshToken }
});
if (!storedToken) throw new Error('Invalid refresh token');
return this.generateAccessToken(payload.userId);
}
}
3. Bearer Token Authentication
การใช้ token ในการ authentication ผ่าน HTTP header
javascript
// Bearer token middleware
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader?.split(' ')[1];
if (!token) {
return res.status(401).json({
error: 'No token provided'
});
}
jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
if (err) {
return res.status(403).json({
error: 'Invalid token'
});
}
req.user = user;
next();
});
}
// Usage in routes
app.get('/protected', authenticateToken, (req, res) => {
res.json({ data: 'Protected resource' });
});
4. Token Security
การรักษาความปลอดภัยของ token และการจัดการ token ที่หมดอายุ
javascript
// Token security practices
class TokenSecurity {
static isTokenExpired(token) {
const decoded = jwt.decode(token);
return Date.now() >= decoded.exp * 1000;
}
static async revokeToken(token) {
await db.blacklistedTokens.create({
data: { token }
});
}
static async isTokenBlacklisted(token) {
const blacklisted = await db.blacklistedTokens.findUnique({
where: { token }
});
return !!blacklisted;
}
static rotateToken(oldToken) {
const payload = jwt.verify(
oldToken,
process.env.JWT_SECRET
);
return this.generateToken({
...payload,
iat: Date.now()
});
}
}