2017-06-17 4 views
0

Ich baue einen Java-Server mit Rest-API und ich benutze Firebase, um meine Benutzer zu authentifizieren.Synchronous verifyIdToken in Firebase Java

Wenn der Benutzer einen Reset Anruf er Firebase-Token, das ich die Überprüfung der nächsten Methode sendet:

FirebaseAuth.getInstance(firebaseApp).verifyIdToken(idToken) 
     .addOnSuccessListener(decodedToken -> { 
      // do some thing 
     }); 

Das Problem ist, dass wir reden über HTTP-Aufrufe, sind solche, die nicht synchron. Und während ich einen Workaround gefunden habe, um diese Methode synchron zu machen, bin ich neugierig, ob es eine native Firebase-API gibt, die mir das sofort zur Verfügung stellt.

Meine Arbeit um:

final Object hack = new Object(); 
synchronized (hack) { 
    FirebaseAuth.getInstance(firebaseApp).verifyIdToken(idToken) 
      .addOnCompleteListener(decodedToken -> { 
       // do some thing 
       synchronized (hack){ 
        hack.notifyAll(); 
       } 
      }); 
    try { 
     hack.wait(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Es gibt keine einfache Möglichkeit, asynchrone synchron zu machen. Aber es klingt wie ein [XY-Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Was ist der Grund, warum ein asynchroner Handler für Ihren Anwendungsfall nicht funktioniert? –

+0

Was genau muss hier synchron gemacht werden? –

+0

@ cricket_007 Ich bekomme eine Anfrage vom Client, und da es http ist muss ich synchron eine Antwort zurückgeben. Bevor ich das tun kann, muss ich Client-Token überprüfen. Also ich möchte die Token-Validierung synchron sein –

Antwort

5

Sie haben zwei Möglichkeiten (eines davon ist ein Beispiel für das Frühjahr):

  1. Sie geben einen DeferredResult:

    final DeferredResult<ResponseEntity<String>> deferredResult = new DeferredResult<>(5000l); 
    FirebaseAuth.getInstance().verifyIdToken(firebaseAuthToken) 
          .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() { 
           @Override 
           public void onSuccess(FirebaseToken decodedToken) { 
            deferredResult.setResult(decodedToken); 
           } 
          }); 
    return deferredResult; 
    
  2. Sie Kraft Firebase, um auf das zurückgegebene Token zu warten:

    try { 
         FirebaseToken decodedToken = Tasks.await(
           FirebaseAuth.getInstance().verifyIdToken(firebaseAuthToken)); 
    } catch (ExecutionException | InterruptedException e) { 
         log.error("Error: {}", e.getLocalizedMessage()); 
    } 
    
+0

Option 1 ist keine Option, Option 2 ist, was ich implementiert habe, aber ich wusste nicht, dass sie dafür eine native API haben, also schön! –