Flutter Firebase Auth-PHP服务器中的令牌验证问题

时间:2020-10-23 04:21:59

标签: php firebase flutter firebase-authentication jwt

我在Flutter应用中使用Firebase身份验证来管理用户(Facebook,Google,电子邮件...)。当用户登录我的应用程序时,我将Firebase令牌发送到我的PHP服务器,并在其中使用JWT验证了该令牌。

问题在于,尽管正确验证了电子邮件登录名生成的令牌,但Facebook或Google登录名生成的令牌失败,并显示“ SignatureInvalidException:签名验证失败”。

Flutter应用程序中的Facebook登录代码:

FirebaseAuth auth = FirebaseAuth.instance;
final LoginResult result = await FacebookAuth.instance.login();

final FacebookAuthCredential facebookAuthCredential = FacebookAuthProvider.credential(result.accessToken.token);
UserCredential user = await auth.signInWithCredential(facebookAuthCredential);

String token = await auth.currentUser.getIdToken();
print(token.toString());

https://jwt.io/调试器中正确验证了令牌的信息,因此标头和有效负载都很好。

在PHP服务器中(两种情况的代码相同):

  • 验证电子邮件和密码令牌(确定):

    stdClass对象([iss] => https://securetoken.google.com/project-123546 [aud] => project-123546 [auth_time] => 1603424825 [user_id] => S2gpfdsa156dsacdsfQ2z1 [sub] => S2gpfdsa156dsacdsfQ2z1 [iat] => 1603424825 [exp] => 1603428425 [email] => user@example.com [email_verified] => [firebase] => stdClass对象([identities] => stdClass对象([email] =>数组([0] => user@example.com))[sign_in_provider] =>密码))

  • 验证Facebook令牌(KO):

    致命错误:未捕获Firebase \ JWT \ SignatureInvalidException:服务器\供应商\ firebase \ php-jwt \ src \ JWT.php中的签名验证失败:122堆栈跟踪:#0 server \ token.php(18) :Firebase \ JWT \ JWT :: decode('eygswbdsasdJSUzI ...','----- BEGIN CERT ...',Array)#1 {main}抛出在服务器\供应商\ firebase \ php-jwt \ src中\ JWT.php在第122行

PHP代码:

$token = "...TOKEN-FROM-APP...";
$pkeys_raw = file_get_contents('https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com');
$pkeys = json_decode($pkeys_raw, true);
$decoded = JWT::decode($token, $pkeys, ["RS256"]);
print_r($decoded);

KeyID与https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com中的密钥匹配,但是我认为应用程序(或Firebase)未使用Facebook和Google登录名中的私钥正确地对令牌进行签名。但是,我在电子邮件和密码登录中也使用了auth.currentUser.getIdToken(),所以没有区别。

有什么办法解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

在Firebase的Flutter库中进行调查,我找到了解决此问题的方法。我把它张贴在这里,以防万一对某人有帮助。

该库很好,并且可以正确生成签名。 原因与该库完全无关-Android平台上Flutter / Dart中的debugPrint()没有足够的缓冲区来打印出整个令牌字符串。 因此问题出在print(token.toString());上,如果将令牌发送到服务器,它将被正确解码。

有关此问题的所有信息: https://github.com/FirebaseExtended/flutterfire/issues/2728