Firebase を使い始めたばかりです。React アプリ + Java バックエンド。
React 側の承認はうまく機能しますが、ユーザーの ID トークンをバックエンドに送信し、firebase ライブラリを使用していることを確認しようとすると、例外が発生します。
ドキュメントからすべてのコードを取得しました。
js クライアントで:
firebase.auth().currentUser.getToken(/* forceRefresh */ true).then(function(idToken)...
Java では、これは失敗します。
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdTokenAsync(idToken).get();
String uid = decodedToken.getUid();
私に与えます:
java.lang.IllegalArgumentException: null
at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:111) ~[google-http-client-1.22.0.jar:1.22.0]
at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:37) ~[google-http-client-1.22.0.jar:1.22.0]
at com.google.api.client.json.webtoken.JsonWebSignature$Parser.parse(JsonWebSignature.java:602) ~[google-http-client-1.22.0.jar:1.22.0]
at com.google.firebase.auth.FirebaseToken.parse(FirebaseToken.java:44) ~[firebase-admin-5.5.0.jar:na]
at com.google.firebase.auth.FirebaseAuth$2.call(FirebaseAuth.java:213) ~[firebase-admin-5.5.0.jar:na]
at com.google.firebase.auth.FirebaseAuth$2.call(FirebaseAuth.java:204) ~[firebase-admin-5.5.0.jar:na]
at com.google.firebase.tasks.Tasks$1.run(Tasks.java:82) ~[firebase-admin-5.5.0.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_151]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_151]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_151]
私が使用している - com.google.firebase - firebase-admin - バージョン 5.5.0
uid によるデータベース操作とユーザー検索は、Java バックエンドで問題なく動作します。
エラーを追跡するためにすべてのJavaソースをダウンロードしたところ、「ドット」チェックが失敗することがわかりました
Preconditions.checkArgument(secondDot != -1);
クラス JsonWebSignature パッケージ内 com.google.api.client.json.webtoken google-http-client-1.22.0.jar
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(tokenString.indexOf('.', secondDot + 1) == -1);
...
トークンの末尾にドットを追加すると、パスがチェックされ、ユーザーが元に戻ります。私は何か間違ったことをしているのだろうか..私のトークンは正しい形式ですか、それともJavaは有効性のチェックに熱心です
firebase js クライアントから受け取ったトークンの形式は「Header.Payload」で、JWS RFC の「Header.Payload.Signature」のように 2 番目のドットが含まれていません。
webtoken の検証に問題があり、2 番目のドットは仕様で要求されていませんか、それとも firebase lib がそのようなトークンのせいですか? それともどこか間違っていますか。
私が夢中になっているので、どんな助けも大歓迎です:)