2016-09-16 5 views
5

У меня есть серверное приложение, и я пытаюсь идентифицировать пользователя, который в данный момент зарегистрировался на этом сервере. Я успешно прошел проверку подлинности пользователя на моем веб-приложение, как это:Firebase Verifying ID Tokens

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; 
    }); 

Я тогда отправить userJsonToken к моему серверу через вызов Ajax, и я могу видеть маркер, когда я отладки, так что маркер быть правильно направляется в сервер.

В моем серверном приложении я делаю это:

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); 
} 

Тогда я:

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()); 
     } 
    }); 

На данный момент, OnFailureListener становится называется. Я получаю исключение java.lang.IllegalArgumentException без каких-либо объяснений о том, почему и что произошло. В любом случае, я могу видеть журналы на Firebase, которые проливают свет на то, что произошло? Благодаря

Это полная ошибка:

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

Вы когда-нибудь находили разрешение на это? Теперь я тоже вижу ту же ошибку, и я смущен тем, как ее отлаживать, учитывая, что исключение не дает никакой информации вообще – RvPr

ответ

0

Ран в эту проблему сам, и после того, как не найти ответ здесь, решил разобраться в самом исходном коде.

/** 
* 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); 
    ... 

В частности, это была линия, что вызвало ошибку в вашем случае:

Preconditions.checkArgument(secondDot != -1); 

Очевидно, что если ваш маркер не имеет по крайней мере 2 точки, он будет производить IllegalArgumentException здесь, без любое сообщение об ошибке, разъясняющее, почему эта ошибка была выбрана.

В моем случае я ударил эту ошибку, потому что я использовал поддельный токен, который я приготовил вручную, для целей тестирования. Я ожидал увидеть ошибку типа «ошибка декодирования». Конечно же, после добавления 2 точки в моем поддельную лексеме, я затем запустить в сообщение гораздо более описательных ошибок:

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.

Очень жаль, что команда Firebase не включает в себя сообщение более описательных ошибки для первых 2 предварительных условия, поскольку это лучше предупредит пользователей о том, что токен неверен/неполный, и что нет ничего плохого в том, как они инициализировались или вызывались FirebaseAuth.

Смежные вопросы