2016-09-16 145 views
5

我有一个服务器应用程序,我试图识别当前在该服务器上登录的用户。我已经成功地验证这样对我的web应用程序的用户:Firebase验证ID令牌

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

然后我通过Ajax调用发送userJsonToken到我的服务器,我可以看到令牌当我调试,因此令牌被正确发送到服务器。

在我的服务器应用程序我这样做:

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.

这是不幸的是,火力地堡队并没有包括对一个更具描述性错误信息前两个前置条件,因为这样会更好地提醒用户该令牌格式不正确/不完整,并且它们初始化或调用FirebaseAuth的方式没有任何问题。