11const jwt = require ( 'jsonwebtoken' ) ;
22const { ethers } = require ( 'ethers' ) ;
3+ const { AuthService } = require ( '../src/services/auth.service' ) ;
34
45const JWT_SECRET = process . env . JWT_SECRET || 'your-secret-key' ;
56
7+ // Initialize enhanced authentication service
8+ const authService = new AuthService ( ) ;
9+
610// Generate nonce for SIWE
711const generateNonce = ( ) => {
812 return Math . random ( ) . toString ( 36 ) . substring ( 2 , 15 ) + Math . random ( ) . toString ( 36 ) . substring ( 2 , 15 ) ;
@@ -21,20 +25,25 @@ const verifySignature = (message, signature, address) => {
2125 }
2226} ;
2327
24- // Generate JWT token
28+ // Generate JWT token (using enhanced service)
2529const generateToken = ( address , tier = 'bronze' ) => {
26- return jwt . sign (
27- {
28- address : address . toLowerCase ( ) ,
29- tier ,
30- iat : Math . floor ( Date . now ( ) / 1000 )
31- } ,
32- JWT_SECRET ,
33- { expiresIn : '24h' }
34- ) ;
30+ const member = {
31+ id : address . toLowerCase ( ) ,
32+ email : ` ${ address . toLowerCase ( ) } @example.com` ,
33+ organizationId : 'default' ,
34+ role : 'user' ,
35+ permissions : [ 'read' ]
36+ } ;
37+
38+ return authService . generateAccessToken ( member ) ;
3539} ;
3640
37- // Verify JWT middleware
41+ // Generate refresh token
42+ const generateRefreshToken = ( address ) => {
43+ return authService . generateRefreshToken ( address . toLowerCase ( ) , null ) ;
44+ } ;
45+
46+ // Enhanced JWT verification middleware with rotation support
3847const authenticateToken = ( req , res , next ) => {
3948 const authHeader = req . headers [ 'authorization' ] ;
4049 const token = authHeader && authHeader . split ( ' ' ) [ 1 ] ;
@@ -46,16 +55,32 @@ const authenticateToken = (req, res, next) => {
4655 } ) ;
4756 }
4857
49- jwt . verify ( token , JWT_SECRET , ( err , user ) => {
50- if ( err ) {
51- return res . status ( 403 ) . json ( {
52- success : false ,
53- error : 'Invalid or expired token'
54- } ) ;
58+ try {
59+ const payload = authService . verifyAccessToken ( token ) ;
60+
61+ // Check if token needs rotation
62+ if ( authService . shouldRotateToken ( token ) ) {
63+ // Add rotation hint to response headers
64+ res . set ( 'X-Token-Rotation-Required' , 'true' ) ;
5565 }
56- req . user = user ;
66+
67+ req . user = {
68+ id : payload . sub ,
69+ email : payload . email ,
70+ organizationId : payload . organizationId ,
71+ role : payload . role ,
72+ permissions : payload . permissions ,
73+ sessionId : payload . sessionId ,
74+ jti : payload . jti
75+ } ;
76+
5777 next ( ) ;
58- } ) ;
78+ } catch ( error ) {
79+ return res . status ( 403 ) . json ( {
80+ success : false ,
81+ error : error . message || 'Invalid or expired token'
82+ } ) ;
83+ }
5984} ;
6085
6186// Tier-based access middleware
@@ -76,11 +101,70 @@ const requireTier = (requiredTier) => {
76101 } ;
77102} ;
78103
104+ // Token rotation endpoint handler
105+ const rotateTokens = async ( req , res ) => {
106+ const { refreshToken } = req . body ;
107+
108+ if ( ! refreshToken ) {
109+ return res . status ( 400 ) . json ( {
110+ success : false ,
111+ error : 'Refresh token required'
112+ } ) ;
113+ }
114+
115+ try {
116+ const tokens = await authService . rotateTokens ( refreshToken ) ;
117+
118+ res . json ( {
119+ success : true ,
120+ data : tokens ,
121+ message : 'Tokens rotated successfully'
122+ } ) ;
123+ } catch ( error ) {
124+ res . status ( 403 ) . json ( {
125+ success : false ,
126+ error : error . message || 'Token rotation failed'
127+ } ) ;
128+ }
129+ } ;
130+
131+ // Token revocation endpoint
132+ const revokeToken = ( req , res ) => {
133+ const authHeader = req . headers [ 'authorization' ] ;
134+ const token = authHeader && authHeader . split ( ' ' ) [ 1 ] ;
135+
136+ if ( ! token ) {
137+ return res . status ( 400 ) . json ( {
138+ success : false ,
139+ error : 'Token required'
140+ } ) ;
141+ }
142+
143+ try {
144+ const payload = authService . verifyAccessToken ( token ) ;
145+ authService . blacklistToken ( payload . jti ) ;
146+
147+ res . json ( {
148+ success : true ,
149+ message : 'Token revoked successfully'
150+ } ) ;
151+ } catch ( error ) {
152+ res . status ( 403 ) . json ( {
153+ success : false ,
154+ error : error . message || 'Token revocation failed'
155+ } ) ;
156+ }
157+ } ;
158+
79159module . exports = {
80160 generateNonce,
81161 nonces,
82162 verifySignature,
83163 generateToken,
164+ generateRefreshToken,
84165 authenticateToken,
85- requireTier
166+ rotateTokens,
167+ revokeToken,
168+ requireTier,
169+ authService // Export service for direct access
86170} ;
0 commit comments