Java: classe de gestion des jetons chronométrés pour l'authentification API Web

Nous avons examiné l'implémentation du traitement exclusif (Java) lors du partage d'un jeton chronométré pour l'authentification API Web (en supposant un jeton d'accès OAuth2) entre plusieurs threads.

Spécifications de gestion des jetons

Les spécifications de la gestion des jetons supposent ce qui suit.

Code d'implémentation (Java)

La classe de gestion de jetons qui fonctionne avec les spécifications ci-dessus est implémentée comme suit.

public class TokenManager {

	//Motif singleton
	private static TokenManager instance = new TokenManager();
	private TokenManager() {}
	public static TokenManager getInstance() {
		return instance;
	}

    /*Le jeton et la date et l'heure de modification doivent être des variables volatiles afin que le dernier état puisse toujours être obtenu au moment de la référence.*/
    //Jeton chronométré
	private volatile String token = null;
    //Date et heure de mise à jour (horodatage UNIX) calculées à partir de la période de validité du jeton
   	private volatile long refreshAt = 0L;

    //La synchronisation n'est pas requise car le dernier état est acquis avec une variable volatile.
	public String getToken() {
		if (System.currentTimeMillis() >= refreshAt) {
			syncUpdateToken();
		}
		return this.token;
	}

    //Le traitement des mises à jour est synchronisé et contrôlé exclusivement (de sorte qu'un seul thread peut être exécuté à la fois)
	private synchronized void syncUpdateToken() {
        //Ne réexécutez pas le processus de mise à jour dans le thread suivant qui a appelé getToken pendant le processus de mise à jour
		if (System.currentTimeMillis() < refreshAt) {
			return;
		}

		//Processus de mise à jour des jetons
        //Pour vous assurer que vous obtenez le dernier jeton lorsque vous réussissez la vérification de la date d'expiration avec la méthode getToken
        // token ->Actualiser dans l'ordre de refreshAt.
		this.token = ...
		this.refreshAt = ...
	}
}

En rendant les variables d'instance (token, refreshAt) volatiles, il n'est pas nécessaire de synchroniser la méthode de référence de token (getToken) et le traitement de référence dans la date d'expiration du token peut être exécuté en parallèle.

Dans ce cas, étant donné que le thread suivant qui a appelé getToken pendant le processus de mise à jour appelle la méthode de mise à jour du jeton (updateToken), la date d'expiration est à nouveau vérifiée dans la méthode pour éviter un processus de mise à jour inutile du jeton.

Recommended Posts

Java: classe de gestion des jetons chronométrés pour l'authentification API Web
[Java] Package de gestion
Échantillon jusqu'à l'authentification OAuth 2.0 et l'acquisition de jetons d'accès (Java)
Créer une authentification par clé API pour l'API Web dans Spring Security
[Java] Mémo pour nommer les noms de classe
Une histoire sur la prise en charge de Java 11 pour les services Web
ChatWork4j pour l'utilisation de l'API ChatWork en Java
Opérations de conteneur Docker avec l'API Docker-Client pour Java
Générer du code client Java pour l'API SOAP de SalesForce
Rêver de créer facilement une API Web pour la base de données d'un système Java existant