Skip to content

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()
		});
	}
}

Released under the MIT License