Sto provando a racchiudere l'autenticazione basata su JWT (JSON Web Token) per la protezione degli endpoint API utilizzando i token di accesso. Sto proteggendo questi endpoint richiedendo all'utente di avere un token di accesso valido per ottenere tali risorse.
Sto lottando, tuttavia, comprendendo l'uso di un token di aggiornamento.
Ho un endpoint / auth / login che accetta% richieste diPOST
:
class UserLogin(Resource):
def post(self):
data = parser.parse_args()
current_user = User.find_by_username(data['username'])
if not current_user:
return {'message': 'Unsuccessful. You do not have an account'}
if User.verify_hash(data['password'], current_user.password):
access_token = create_access_token(current_user)
refresh_token = create_refresh_token(current_user)
return {
'message': 'Login successful {}'.format(current_user.username),
'roles': 'Role: {}'.format(current_user.role),
'access token': access_token,
'refresh token': refresh_token
}
else:
return {'message': 'Something went wrong'}
Il punto finale controlla essenzialmente le credenziali in entrata per garantire che l'utente esista nel mio archivio utente. Se lo fanno, restituirò un token di accesso e aggiornamento. In caso contrario, verrà gestito un messaggio di errore sul lato client.
Ora, supponiamo che l'utente abbia effettuato l'accesso e provi ad accedere a una risorsa privata da un altro endpoint protetto richiedendo un token di accesso. Il client eseguirà una richiesta e l'endpoint protetto restituirà alcuni messaggi di errore che indicano che non hanno un token di accesso. Il client tenterà quindi di generare un nuovo token di accesso utilizzando il token di aggiornamento ottenuto all'accesso:
class TokenRefresh(Resource):
@jwt_refresh_token_required
def post(self):
current_user = get_jwt_identity()
access_token = create_access_token(identity=current_user)
return {'access token': access_token}
Colpendo la risorsa precedente genererà un nuovo token di accesso con una certa scadenza definita. Questo è il mio flusso attuale.
La mia domanda è, come devo conservare i token di aggiornamento per assicurarmi che vengano acceduti dall'utente autenticato? Dovrei avere qualche logica aggiuntiva nelle mie richieste di accesso che memorizzano il token di aggiornamento generato per quell'utente specifico?
In tal caso, dovrei quindi generare un nuovo token di aggiornamento e sovrascrivere il token di aggiornamento esistente collegato all'utente ogni volta che il client tenta di aggiornare il proprio token di accesso?
Al momento, ritengo che il mio processo possa essere compromesso se un utente malintenzionato riesce a ottenere il token di aggiornamento.