使用php设置firebase v3自定义身份验证

Jea*_*ppe 7 php firebase google-cloud-platform firebase-authentication

我正在尝试使用谷歌的新firebase sdk设置自定义身份验证,遵循这些准则:https:
//firebase.google.com/docs/auth/server#use_a_jwt_library在samble代码中它说:

从JSON密钥文件中获取服务帐户的电子邮件地址和私钥

不幸的是我不知道从哪里得到这个json文件.如果我去我的firebase控制台(https://console.firebase.google.com/),我设法下载一个json文件,但它不包含任何电子邮件地址和私钥.

我设法在google云平台控制台(http://console.cloud.google.com)中找到一个包含电子邮件地址和私钥的json文件,进入"API Manager>凭据"菜单.令人惊讶的是我的firebase应用程序在那里展示 我将电子邮件和密钥复制并粘贴到示例代码中,然后我收到此错误:

警告:openssl_sign():提供的密钥参数不能强制转换为第183行/volume1/web/yeti/vendor/firebase/php-jwt/src/JWT.php中的私钥致命错误:带有消息的未捕获异常"DomainException" 'OpenSSL无法签署数据'在/volume1/web/yeti/vendor/firebase/php-jwt/src/JWT.php:185堆栈跟踪:#0/volume1/web/yeti/vendor/firebase/php-jwt/src/JWT.php(154):Firebase\JWT\JWT :: sign('eyJ0eXAiOiJKV1Q ...',NULL,'RS256')#1 /volume1/web/yeti/jwt.php(21):Firebase\JWT\JWT :: encode(Array,NULL,'RS256')#2 /volume1/web/yeti/jwt.php(24):create_custom_token('1234',false)#3 {main}抛出/ volume1/web /第185行的yeti/vendor/firebase/php-jwt/src/JWT.php

有人知道我做错了什么吗?

谢谢

MyU*_*low 7

你找到了解决方案吗?仍然遇到同样的问题!适用于HS256,不适用于RS256.这是google cloud的一种限制吗?


非常感谢 !@dbburgess

问题:使用了错误的密钥和电子邮件.这些应在与Firebase项目对应的Google Cloud凭据部分中生成.

解:

  • 转到"console.cloud.google.com".
  • 选择相关的Firebase项目.
  • 然后是'API Manager' - >'Credentials'.
  • '创建凭据' - >'服务帐户密钥' - >选择JSON.
  • 创建的文件将包含所需的"private_key"和"client_email".

填写值:

$ service_account_email ="autogeneratedemail@developer.gserviceaccount.com"; $ private_key ="----- BEGIN PRIVATE KEY ----- \nSoneVeryVeryLongKey = \n ----- END PRIVATE KEY ----- \n"; $ uid ='UserToUseInFirebaseRules'; $ is_premium_account = $ uid;

您不需要在"create_custom_token"函数中更改任何内容,也可以根据需要更改到期日期/时间.

然后调用函数:

create_custom_token($uid, $is_premium_account);
Run Code Online (Sandbox Code Playgroud)


dbb*_*ess 5

这就是我正在做的事情,而且效果很好。您在claims数组中提供的内容将显示auth在安全规则中。电子邮件和密钥来自创建服务帐户时获得的 json 文件(请参阅:开始之前部分)。

$userId = '1234';
$email = 'sample@email.com';
$key = 'giant_key_goes_here';

$payload = [
    'iss' => $email,
    'sub' => $email,
    'aud' => 'https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit',
    'iat' => time(),
    'exp' => time() + 60 * 60,
    'uid' => $userId,
    'claims' => [
        'uid' => $userId,
    ],
];

$token = JWT::encode($payload, $key, 'RS256');
Run Code Online (Sandbox Code Playgroud)

值得注意的是,密钥上的格式有点棘手......您的密钥将如下所示(只是一个示例密钥):

-----BEGIN PRIVATE KEY-----
MIICXAIBAAKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUp
wmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ5
1s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQABAoGAFijko56+qGyN8M0RVyaRAXz++xTqHBLh
3tx4VgMtrQ+WEgCjhoTwo23KMBAuJGSYnRmoBZM3lMfTKevIkAidPExvYCdm5dYq3XToLkkLv5L2
pIIVOFMDG+KESnAFV7l2c+cnzRMW0+b6f8mR1CJzZuxVLL6Q02fvLi55/mbSYxECQQDeAw6fiIQX
GukBI4eMZZt4nscy2o12KyYner3VpoeE+Np2q+Z3pvAMd/aNzQ/W9WaI+NRfcxUJrmfPwIGm63il
AkEAxCL5HQb2bQr4ByorcMWm/hEP2MZzROV73yF41hPsRC9m66KrheO9HPTJuo3/9s5p+sqGxOlF
L0NDt4SkosjgGwJAFklyR1uZ/wPJjj611cdBcztlPdqoxssQGnh85BzCj/u3WqBpE2vjvyyvyI5k
X6zk7S0ljKtt2jny2+00VsBerQJBAJGC1Mg5Oydo5NwD6BiROrPxGo2bpTbu/fhrT8ebHkTz2epl
U9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhMCQBGoiuSoSjafUhV7i1cEGpb88h5NBYZzWXGZ
37sJ5QsW+sJyoNde3xH8vdXhzU7eT82D6X/scw9RZz+/6rCJ4p0=
-----END PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

您可能需要做一些花哨的格式化,这基本上就是我所做的:

$key = "-----BEGIN PRIVATE KEY-----\nMIICXAIBAAKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUp\nwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ5\n1s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQABAoGAFijko56+qGyN8M0RVyaRAXz++xTqHBLh\n3tx4VgMtrQ+WEgCjhoTwo23KMBAuJGSYnRmoBZM3lMfTKevIkAidPExvYCdm5dYq3XToLkkLv5L2\npIIVOFMDG+KESnAFV7l2c+cnzRMW0+b6f8mR1CJzZuxVLL6Q02fvLi55/mbSYxECQQDeAw6fiIQX\nGukBI4eMZZt4nscy2o12KyYner3VpoeE+Np2q+Z3pvAMd/aNzQ/W9WaI+NRfcxUJrmfPwIGm63il\nAkEAxCL5HQb2bQr4ByorcMWm/hEP2MZzROV73yF41hPsRC9m66KrheO9HPTJuo3/9s5p+sqGxOlF\nL0NDt4SkosjgGwJAFklyR1uZ/wPJjj611cdBcztlPdqoxssQGnh85BzCj/u3WqBpE2vjvyyvyI5k\nX6zk7S0ljKtt2jny2+00VsBerQJBAJGC1Mg5Oydo5NwD6BiROrPxGo2bpTbu/fhrT8ebHkTz2epl\nU9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhMCQBGoiuSoSjafUhV7i1cEGpb88h5NBYZzWXGZ\n37sJ5QsW+sJyoNde3xH8vdXhzU7eT82D6X/scw9RZz+/6rCJ4p0=\n-----END PRIVATE KEY-----\n";
Run Code Online (Sandbox Code Playgroud)

请注意,换行符变成了\n,并且全部都挤到了一行上。有多种方法可以实现它,但是......根据您得到的错误,类似这样的问题可能就是问题所在。


Jea*_*ppe 4

发现自己出了什么问题!文档中的示例 php 代码有错误。代替

return JWT::encode($payload, $private_key, "RS256");
Run Code Online (Sandbox Code Playgroud)

使用

return JWT::encode($payload, $private_key, "HS256");
Run Code Online (Sandbox Code Playgroud)

编辑:
实际上,这只是 google firebase 文档中的示例 php 代码,完全有问题。它正在向 php-jwt 传递一个空密钥。看来他们今天更新了并且运行良好:)

  • 这个令牌绝对不会被验证。Google 仅使用 RS256 JWT。 (3认同)