当前位置: 首页 > 知识库问答 >
问题:

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

叶明辉
2023-03-14

我正在尝试按照以下准则使用谷歌的新火力基础 sdk 设置自定义身份验证: https://firebase.google.com/docs/auth/server#use_a_jwt_library
在 samble 代码中它说:

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

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

我通过进入“API管理器”,在我的谷歌云平台控制台(http://console.cloud.google.com)中找到了一个包含电子邮件地址和私钥的json文件

警告:openssl_sign():无法将提供的密钥参数强制转换为/volume 1/web/yeti/vendor/Firebase/PHP-jwt/src/jwt . PHP第183行中的私钥致命错误:在/volume 1/web/yeti/vendor/Firebase/PHP-jwt/src/jwt . PHP中出现未捕获的异常“DomainException ”,并显示消息“openssl无法签署数据”,NULL,' RS 256 ')# 1/volume 1/web/yeti/jwt . PHP(21):Firebase \ JWT \ JWT::encode(Array,NULL,' RS 256 ')# 2/volume 1/web/yeti/jwt . PHP(24):create _ custom _ token(' 1234 ',false) #3 {main}在/volume 1/web/yeti/vendor/Firebase/PHP-jwt/src/jwt . PHP的第185行抛出

有人知道我哪里做错了吗?

谢谢。

共有3个答案

符正信
2023-03-14

发现我自己出了什么问题!留档中的示例php代码有错误。而不是

return JWT::encode($payload, $private_key, "RS256");

return JWT::encode($payload, $private_key, "HS256");

编辑 :
实际上,它只是来自谷歌Firebase Doc的示例php代码,完全有问题。 它正在向PHP-JWT传递一个空密钥。看起来他们今天更新了它,它工作正常:)

易研
2023-03-14

这就是我在做的事情,而且效果很好。您在<code>claims</code>数组中提供的是安全规则中<code>auth</code>上显示的内容。电子邮件和密钥来自创建服务帐户时获得的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');

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

-----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-----

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

$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";

请注意,换行符被转换为\n,并且都被粉碎到一行上。有多种方法可以完成它,但是…根据您得到的错误,这样的事情可能是问题所在。

章岳
2023-03-14

你找到解决方案了吗?仍然遇到同样的问题!适用于 HS256,不适用于 RS256。是谷歌云的限制吗?

非常感谢@德伯吉斯

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

解决方案:

  • 转到“console.cloud.google.com”。
  • 选择相关的 Firebase 项目。
  • 然后是“API 管理器” -

填充值:

$service_account_email=“autogeneratedemail@developer.gserviceaccount.com“;$private_key=”-----开始私钥-----\nOneVeryLongKey=\n-----结束私钥-----\n“;$uid='UserToUseInFirebaseRules';$is_premium_account=$uid;

您不需要更改“create_custom_token”函数中的任何内容,也可以根据您的需要更改到期日期/时间。

然后调用函数:

create_custom_token($uid, $is_premium_account);
 类似资料:
  • 在过去的几周里,我一直在努力掌握KeyClope,这样我就可以实现一种使用遗留提供商(基于Oracle,带有会话表和各种奇怪的东西)对用户进行身份验证的方法。我们计划在不久的将来解决这个问题,但目前我们必须解决这个问题,所以我们的想法是在前线使用KeyClope——利用它提供的主要好处,比如SSO——在需要身份验证的应用程序中省略传统的身份验证提供程序。 我读了一些关于构建自定义OIDC身份提供程

  • 问题内容: 这是我的情况: 一个Web应用程序对许多应用程序执行某种SSO 登录的用户,而不是单击链接,该应用就会向正确的应用发布包含用户信息(名称,pwd [无用],角色)的帖子 我正在其中一个应用程序上实现SpringSecurity以从其功能中受益(会话中的权限,其类提供的方法等) 因此,我需要开发一个 自定义过滤器 -我猜想-能够从请求中检索用户信息,通过自定义 DetailsUserSe

  • 问题内容: 我可以使用Google帐户在AppEngine中对用户进行身份验证的方式非常好。 但是,我需要使用 自定义的身份验证登录系统 。 我将有一个AppUsers表,其中包含用户名和加密密码。 我阅读了有关gae会话的内容,但在启动应用安全性方面需要帮助。 如何跟踪经过身份验证的用户会话?设置cookie? 初学者。 问题答案: 您可以使用cookie来做到这一点……其实并不难。您可以使用C

  • 我在spring MVC项目中实现了一个自定义身份验证提供程序。在我自己的重载authenticate()方法中,我实现了自己的身份验证,其中我构造了自己的UserPasswordAuthenticationToken()并返回对象。 现在,上述对象“UserPasswordAuthentictionToken”中的用户ID被匿名化,密码为null,权限设置为授予该用户的权限。 问题: 这是否会导

  • 我试图在一个反应式Spring Boot应用程序中配置一个Spring Security性,该应用程序具有一个Vuejs前端,在未经身份验证时将用户重定向到外部OpenID提供程序(用于身份验证)。在用户通过OpenID提供程序进行身份验证并重定向回应用程序(前端)后,将根据OpenID提供程序的响应创建用户名密码身份验证令牌(身份验证),并手动进行身份验证。 但是,在执行此操作时,应用程序似乎无

  • Postman上有没有办法在执行请求A之前预先执行请求B? 上下文:我创建了一个Symfony应用程序来管理一组web服务。大多数路由只有在用户完全通过身份验证后才能被调用(对于熟悉框架的人使用form_login和防火墙) 因此,我必须先打电话: 邮政 /login 用户名 密码 在能够呼叫之前 获取/某些_安全_路线 (返回 JSON 响应) 当我在Postman构建器中连续手动调用路由时,这