5

Spring Security Oauth2'yi uygulamamdaki bir güvenlik katmanı olarak kullanıyorum. Eşzamanlı olarak async çağrıları görünene kadar her şey iyi çalıştı.Oauth2; Eş zamanlı olarak yapılan çoklu async API çağrıları sırasında süresi dolmuş AccessToken ile sorunu nasıl çözebilirim?

Birisi bana sonraki olayın nasıl ele alınacağını söyler:
1. İstemcinin süresi dolmuş olan bir accessToken'i var.
2. İstemci, api'ye eşzamanlı iki eşzamansız çağrı yapar (örneğin: Thread1, Thread2).
3. Thread1 bir hata alır: Thread2'den önce "accessToken süresi doldu".
4. refreshToken Thread1 kullanarak yeni bir accessToken = qqqqq alır.
5. Thread2 bir hata alır: "accessToken süresi doldu", Thread1 yeni accessToken = qqqqq ile sunucuya yeni bir çağrı yapar.
6. refreshToken Thread2'yi kullanarak yeni bir accessToken = wwwww alır ve accessToken = qqqqq öğesini kaldırır.
7. Burada, iş parçacığı1, etkin olmayan accessToken = qqqqq ile sunucuya bir çağrı yapar. Teorik olarak, her iki Threads'ı birbirini geçersiz kılarak döngü yapmak oldukça olasıdır.

Herhangi bir yardım için teşekkür ederiz, teşekkürler. istemci üzerinde kontrol var ise

cevap

7

o zaman erişim belirteci bir sürüm numarası ekleyebilirsiniz - bir iş parçacığı döndürülür sonra akım (son zamanlarda yenilenir) erişim belirteci eski sürüm numarasını kullanarak jeton erişimi yenilemek çalışırsa yerine.

public class AccessToken { 
    private int currentVersion; 
    private String accessToken; 

    private static AccessToken currentToken; 

    public static synchronized refresh(AccessToken token) { 
    if(token.currentVersion == currentToken.currentVersion) { 
     AccessToken newToken = // refresh token 
     newToken.currentVersion = currentToken.currentVersion + 1; 
     currentToken = newToken; 
    } 
    return currentToken; 
    } 
} 

istemci üzerinde herhangi bir kontrol yok ve/veya bu sunucu tarafı düzeltmek için tercih ediyorsanız, ardından birkaç seçenek vardır:

  1. istemci bir erişim belirteci kullanmasına izin ver iş parçacığı başına bir global erişim belirteci paylaşmalarını gerektirmek yerine, iş parçacığı başına.
  2. Erişim belirtecini her defasında bir defadan fazla yenilemeyi yasaklayın, 5 saniye deyin. Bu şekilde, istemci bir yenileme döngüsünde çalışsa bile, bazı ilerlemeleri yapabilmeleri gerekir.
  3. İstemcinin erişim belirtecini koşullu olarak güncelleyebilmesi için doğru akım belirtecinin sağlanmış olması durumunda belirtecin yalnızca yenilenmesini sağlayan bir yöntem belirtin (İstemcinin unutması durumunda hala geçerli yöntemi açığa çıkarmak için geçerli yöntemi açığa çıkarmanız gerekir) eski erişim belirteci).
+0

Çok teşekkür ederim. İstemci üzerinde denetime sahibim, bu yüzden "accessToken" sürümünü kullanacağım. Tekrar teşekkürler. –

+0

Java'm paslı ama örnek kodda hala bir yarış durumu var, değil mi? İki iş parçacığı, belirtecin geçerli sürüm olduğunu görebilir ve ardından bir diğerini üzerine yazarak bir yenilemeyi deneyebilir. – JimmidyJoo

İlgili konular