2016-09-16 17 views
5

Mam aplikację serwera i próbuję zidentyfikować aktualnie zalogowanego użytkownika na tym serwerze. Mam pomyślnym uwierzytelnieniu użytkownika na mojej aplikacji internetowych, takich jak ten:Tokeny identyfikatorów weryfikacyjnych Firebase

var provider = new firebase.auth.GoogleAuthProvider();   
    firebase.auth().signInWithPopup(provider).then(function(result) { 
     userJsonToken = result.credential.accessToken; 
     user = result.user; 
    }).catch(function(error) { 
     // Handle Errors here. 
     var errorCode = error.code; 
     var errorMessage = error.message; 
     // The email of the user's account used. 
     var email = error.email; 
     // The firebase.auth.AuthCredential type that was used. 
     var credential = error.credential; 
    }); 

I następnie wysłać userJsonToken do mojego serwera za pośrednictwem wywołania AJAX i widzę token gdy debugować więc token jest poprawnie wysłana do serwer.

W mojej aplikacji serwera Robię to:

try (InputStream is = FirebaseUtil.class.getClassLoader().getResourceAsStream(FIREBASE_CREDENTIALS_JSON_FILE)) { 
    FirebaseOptions options = new FirebaseOptions.Builder().setServiceAccount(is).setDatabaseUrl(FIREBASE_DATABASE_URL).build();   
    FirebaseApp.initializeApp(options); 
} catch (IOException e) { 
    e.printStackTrace(System.err); 
} 

Potem zrobić:

FirebaseAuth.getInstance().verifyIdToken(idToken).addOnFailureListener(new OnFailureListener() {    
     @Override 
     public void onFailure(Exception ex) { 
      throw new AuthenticationServiceException(ex.getMessage(), ex); 
     } 
    }).addOnSuccessListener(new OnSuccessListener<FirebaseToken>() { 
     @Override 
     public void onSuccess(FirebaseToken token) { 
      System.out.println("Yeehaw"); 
     } 
    }).addOnCompleteListener(new OnCompleteListener<FirebaseToken>() {   
     @Override 
     public void onComplete(Task<FirebaseToken> arg0) { 
      System.out.println(arg0.isSuccessful()); 
     } 
    }); 

W tym momencie OnFailureListener nazywany jest coraz. Otrzymuję wyjątek java.lang.IllegalArgumentException bez wyjaśnienia, dlaczego i co się stało. Czy mimo to widzę logi w Firebase, które rzucają nieco światła na to, co się wydarzyło? Dzięki

Ta pełna błąd:

Caused by: java.lang.IllegalArgumentException 
at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:111) 
at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:37) 
at com.google.api.client.json.webtoken.JsonWebSignature$Parser.parse(JsonWebSignature.java:602) 
at com.google.firebase.auth.FirebaseToken.parse(FirebaseToken.java:81) 
at com.google.firebase.auth.FirebaseAuth$1.call(FirebaseAuth.java:143) 
at com.google.firebase.auth.FirebaseAuth$1.call(FirebaseAuth.java:140) 
at com.google.firebase.tasks.Tasks$1.run(Tasks.java:63) 
+0

Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? Teraz też trafiam dokładnie na ten sam błąd i jestem zdezorientowany, jak go debugować, zważywszy, że wyjątek nie daje żadnych informacji – RvPr

Odpowiedz

0

Ran się do tego problemu, a po nie znalezienia odpowiedzi tutaj, postanowił zajrzeć do samego kodu źródłowego.

/** 
* Parses a JWS token into a parsed {@link JsonWebSignature}. 
* 
* @param tokenString JWS token string 
* @return parsed {@link JsonWebSignature} 
*/ 
public JsonWebSignature parse(String tokenString) throws IOException { 
    // split on the dots 
    int firstDot = tokenString.indexOf('.'); 
    Preconditions.checkArgument(firstDot != -1); 
    byte[] headerBytes = Base64.decodeBase64(tokenString.substring(0, firstDot)); 
    int secondDot = tokenString.indexOf('.', firstDot + 1); 
    Preconditions.checkArgument(secondDot != -1); 
    ... 

W szczególności jest to linia, która wywołała błąd w przypadku:

Preconditions.checkArgument(secondDot != -1); 

Widocznie, jeśli token nie posiada co najmniej 2 punkty, będzie produkować IllegalArgumentException tutaj, bez jakikolwiek komunikat o błędzie wyjaśniający, dlaczego ten błąd został zgłoszony.

W moim przypadku uderzyłem w ten błąd, ponieważ użyłem fałszywego tokena, który wymyśliłem ręcznie, do celów testowych. Spodziewałem się błędu typu "błąd dekodowania tokena". Rzeczywiście, po dodaniu 2 punktów do mojego fałszywe-żeton, ja wtedy napotkasz wiele bardziej opisowy komunikat o błędzie:

Decoding Firebase ID token failed. Make sure you passed the entire string JWT which represents an ID token. See https://firebase.google.com/docs/auth/admin/verify-id-tokens for details on how to retrieve an ID token.

To niefortunne, że zespół Firebase nie obejmować bardziej opisowy komunikat o błędzie dla pierwsze 2 warunki wstępne, ponieważ mogłoby to lepiej poinformować użytkowników o tym, że token jest zniekształcony/niekompletny i że nie ma nic złego w sposobie inicjowania lub wywoływania FirebaseAuth.

Powiązane problemy