使用来自php的自定义令牌进行Firebase身份验证

使用来自php的自定义令牌进行Firebase身份验证,php,firebase,google-cloud-platform,jwt,php-jwt,Php,Firebase,Google Cloud Platform,Jwt,Php Jwt,我有一个PHP应用程序,我正在尝试生成一个令牌来验证用户,以便他们可以从浏览器访问Firebase 我已经从Firebase控制台中的服务帐户生成了一个私钥,并使用Firebase/php jwt库。当尝试从javascript使用signInWithCustomToken方法访问时,我总是会收到错误> 自定义令牌格式不正确。请参阅文档 生成令牌的代码是: use Firebase\JWT\JWT; require_once("php-jwt-master/src/JWT.php&q

我有一个PHP应用程序,我正在尝试生成一个令牌来验证用户,以便他们可以从浏览器访问Firebase

我已经从Firebase控制台中的服务帐户生成了一个私钥,并使用Firebase/php jwt库。当尝试从javascript使用
signInWithCustomToken
方法访问时,我总是会收到错误>

自定义令牌格式不正确。请参阅文档

生成令牌的代码是:

use Firebase\JWT\JWT;

require_once("php-jwt-master/src/JWT.php");

$service_account_email = "firebase-adminsdk-ierut@......iam.gserviceaccount.com"; // Dots are app name

$key = "-----BEGIN PRIVATE KEY-----\n..........\n-----END PRIVATE KEY-----\n"; // Dots are private key from the downloaded file

$time = time();

$token = array( 'iat' => $time,
                'exp' => $time + 3000,
                'uid' => '1',
                'aud' => 'https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit',
                'iss' => $service_account_email,
                'sub' => $service_account_email
               );
               

$jwt = JWT::encode($token, $key, 'HS256');
javascript代码是:

function login(){

  var token = document.getElementById("token").value;

  firebase.auth().signInWithCustomToken(token)      
    .then((user) => {           
      console.log("Autenticado");         
    })      
    .catch((error) => {         
      var errorCode = error.code;
      var errorMessage = error.message;
      
      console.log(errorCode + " - " + errorMessage);          
    });
}
我已经用jwt.io工具检查了jwt,它似乎是正确的


我不确定密钥格式,我尝试过在文件中的单行中使用头和“\n”,也尝试过不使用“\n”,并在多行变量中使用返回值“我能理解为什么这可能会有点混乱,因为一些文档和代码相互矛盾。即使是
firebase/php jwt/src/jwt.php
文件也提到
HS256
是一个很好的例子

JWT类
. . .
公共静态$supported\u algs=数组(
'ES256'=>数组('openssl','SHA256'),
'HS256'=>数组('hash_hmac','SHA256'),
'HS384'=>数组('hash_hmac','SHA384'),
'HS512'=>数组('hash_hmac','SHA512'),
'RS256'=>数组('openssl','SHA256'),
'RS384'=>array('openssl','SHA384'),
'RS512'=>array('openssl','SHA512'),
);
然而,根据文件,它明确提到:

Google OAuth 2.0授权服务器支持的唯一签名算法是使用SHA-256哈希算法的RSA。这在JWT头的alg字段中表示为
RS256

我在Linux机器上通过以下文档对此进行了测试:

我安装了所有要求:

$sudo apt update-y&&sudo apt upgrade-y
$sudo apt安装php libapache2 mod php
$sudo systemctl start apache2
$sudo apt安装php cli解压
$curl-sShttps://getcomposer.org/installer -o composer-setup.php
$HASH=`curl-sShttps://composer.github.io/installer.sig`
$php-r“如果(hash_文件('SHA384','composer setup.php')=='$hash'){echo'安装程序已验证';}否则{echo'安装程序已损坏';取消链接('composer-setup.php');}echo php_EOL;”
$sudo php composer-setup.php--install dir=/usr/local/bin--filename=composer
$composer需要firebase/php jwt
我创建了一个
jwt auth.php
文件:


已解决,将算法名称从HS256更改为RS256!。谢谢。

谷歌云对签名的JWT不使用HS256。第一步是使用RS256。这应该是一条评论,确认您收到的正确答案。