2016-09-16 35 views
5

Tôi có ứng dụng máy chủ và tôi đang cố xác định người dùng hiện đã đăng nhập trên máy chủ đó. Tôi đã xác thực thành công người dùng trên ứng dụng web của tôi như thế này:Mã thông báo xác minh 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; 
    }); 

sau đó tôi gửi userJsonToken đến máy chủ của tôi qua một cuộc gọi ajax và tôi có thể thấy các dấu hiệu khi tôi gỡ lỗi để token đang được gửi đi một cách chính xác đến máy chủ.

Trong ứng dụng máy chủ của tôi, tôi đang làm điều này:

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

Sau đó, tôi làm:

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

Tại thời điểm này, các OnFailureListener là nhận được gọi. Tôi nhận được một java.lang.IllegalArgumentException không có giải thích về lý do tại sao hoặc những gì đã xảy ra. Có anyway tôi có thể xem các bản ghi trên Firebase sẽ làm sáng tỏ một số điều đã xảy ra? Cảm ơn

Đây là lỗi hoàn chỉnh:

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

Bạn đã bao giờ tìm thấy giải pháp cho điều này chưa? Bây giờ tôi đang nhấn chính xác cùng một lỗi là tốt, và đang bối rối như thế nào để gỡ lỗi nó, cho rằng ngoại lệ cho không có thông tin ở tất cả – RvPr

Trả lời

0

Ran vào vấn đề này bản thân mình, và sau khi không tìm thấy câu trả lời ở đây, đã quyết định nhìn vào mã nguồn của chính nó.

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

Đặc biệt, đây là dòng đã làm hiển thị các lỗi trong trường hợp của bạn:

Preconditions.checkArgument(secondDot != -1); 

Rõ ràng, nếu thẻ của bạn không có ít nhất 2 chấm, nó sẽ tạo ra một IllegalArgumentException đây, mà không bất kỳ thông báo lỗi nào giải thích lý do lỗi này được ném.

Trong trường hợp của tôi, tôi đã gặp phải lỗi này vì tôi đã sử dụng mã thông báo giả mạo do tôi tạo ra để thực hiện mục đích thử nghiệm. Tôi đã hy vọng sẽ thấy lỗi loại "mã thông báo mã hóa không thành công". Chắc chắn, sau khi thêm 2 dấu chấm để tôi giả-token, tôi sau đó chạy vào một thông báo lỗi đến nay mô tả nhiều hơn:

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.

Nó không may rằng đội căn cứ hỏa lực không bao gồm một thông báo lỗi mô tả hơn cho các 2 điều kiện tiên quyết đầu tiên, vì điều đó sẽ cảnh báo người dùng tốt hơn về thực tế là mã thông báo không đúng định dạng/không đầy đủ và không có gì sai với cách họ khởi tạo hoặc gọi FirebaseAuth.

Các vấn đề liên quan