SME*_*SME 6 node.js firebase firebase-authentication
我有一个服务器应用程序,我正在尝试识别该服务器上当前登录的用户.我已经在我的网络应用程序上成功验证了用户,如下所示:
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;
});
Run Code Online (Sandbox Code Playgroud)
然后我通过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);
}
Run Code Online (Sandbox Code Playgroud)
然后我做:
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());
}
});
Run Code Online (Sandbox Code Playgroud)
此时,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)
Run Code Online (Sandbox Code Playgroud)
我自己也遇到了这个问题,在这里找不到答案后,决定研究源代码本身。
/**
* 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);
...
Run Code Online (Sandbox Code Playgroud)
特别是,这是在您的情况下触发错误的行:
Preconditions.checkArgument(secondDot != -1);
Run Code Online (Sandbox Code Playgroud)
显然,如果您的令牌没有至少 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。
| 归档时间: |
|
| 查看次数: |
966 次 |
| 最近记录: |