【发布时间】:2017-06-25 04:29:33
【问题描述】:
我有一个共享托管计划,其中只有 PHP(没有 Java,没有 node.js)。我需要从我的 android 应用程序发送 firebase ID 令牌并通过 PHP-JWT 进行验证。
我正在关注教程:Verify Firebase ID tokens
上面写着:
“如果您的后端使用的语言没有官方 Firebase Admin SDK,您仍然可以验证 ID 令牌。首先,为您的语言找到第三方 JWT 库。然后,验证标头、有效负载,和 ID 令牌的签名。”
我找到了那个库:Firebase-PHP-JWT。在 gitHub 示例中;我看不懂
$key 部分:
`$key = "example_key";`
和
$token 部分:
`$token = array(
"iss" => "http://example.org",
"aud" => "http://example.com",
"iat" => 1356999524,
"nbf" => 1357000000
);`
我的问题:
- $key 变量应该是什么?
- 为什么 &token 变量是一个数组?将从移动应用发送的令牌是一个字符串。
- 如果有人可以发布使用 PHP-JWT 验证 Firebase ID 的完整示例,我将不胜感激。
编辑:
好吧,我明白了。 GitHub 示例展示了如何生成 JWT 代码(编码)以及如何对其进行解码。在我的情况下,我只需要解码由 firebase 编码的 jwt。所以,我只需要使用这段代码:
$decoded = JWT::decode($jwt, $key, array('HS256'));
在此代码部分中,$jwt 是 Firebase ID 令牌。对于 $key 变量文档说:
最后,确保 ID 令牌由与令牌的 Kid 声明对应的私钥签名。从https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com 获取公钥并使用 JWT 库来验证签名。使用来自该端点的响应的 Cache-Control 标头中的 max-age 的值来了解何时刷新公钥。
我不明白如何将这个公钥传递给解码函数。键是这样的:
“----- BEGIN CERTIFICATE ----- \ nMIIDHDCCAgSgAwIBAgIIZ36AHgMyvnQwDQYJKoZIhvcNAQEFBQAwMTEvMC0GA1UE \ nAxMmc2VjdXJldG9rZW4uc3lzdGVtLmdzZXJ2aWNlYWNjb3VudC5jb20wHhcNMTcw \ nMjA4MDA0NTI2WhcNMTcwMjExMDExNTI2WjAxMS8wLQYDVQQDEyZzZWN1cmV0b2tl \ nbi5zeXN0ZW0uZ3NlcnZpY2VhY2NvdW50LmNvbTCCASIwDQYJKoZIhvcNAQEBBQAD \ nggEPADCCAQoCggEBANBNTpiQplOYizNeLbs + r941T392wiuMWr1gSJEVykFyj7fe \ nCCIhS / zrmG9jxVMK905KwceO / FNB4SK + l8GYLb559xZeJ6MFJ7QmRfL7Fjkq7GHS \ N0 / sOFpjX7vfKjxH5oT65Fb1 + Hb4RzdoAjx0zRHkDIHIMiRzV0nYleplqLJXOAc6E \ n5HQros8iLdf + ASdqaN0hS0nU5aa / CPU / EHQwfbEgYraZLyn5NtH8SPKIwZIeM7Fr \ NNH + SS7JSadsqifrUBRtb // fueZ / FYlWqHEppsuIkbtaQmTjRycg35qpVSEACHkKc \ nW05rRsSvz7q1Hucw6Kx / dNBBbkyHrR4Mc / wg31kCAwEAAaM4MDYwDAYDVR0TAQH / \ nBAIwADAOBgNVHQ8BAf8EBAMCB4AwFgYDVR0lAQH / BAwwCgYIKwYBBQUHAwIwDQYJ \ nKoZIhvcNAQEFBQADggEBAEuYEtvmZ4uReMQhE3P0iI4wkB36kWBe1mZZAwLA5A + U \ niEODMVKaaCGqZXrJTRhvEa20KRFrfuGQO7U3FgOMyWmX3drl40cNZNb3Ry8rsuVi \ nR1dxy6HpC39zba / DsgL07enZPMDksLRNv0dVZ / X / wMrTLrwwrglpCBYUlxGT9RrU \ nf8nAwLr1E4EpXxOVDXAX8bNBl3TCb2fu6DT62ZSmlJV 40K+wTRUlCqIewzJ0wMt6\nO8+6kVdgZH4iKLi8gVjdcFfNsEpboOBoZqjipJ63l4A3mfxOkma0d2XgKR12KAfYX\ncAVPgihAPoNoUPJK0Nj+CmvNlUBXCrl9TtqGjK7AKi8=\n-----结束证书-\
在传递之前我需要将这个公钥转换成什么东西吗?我试图删除所有 "\n" 和 "-----BEGIN CERTIFICATE-----", "-----BEGIN CERTIFICATE -----"...但是没有运气。我仍然收到无效签名错误。有什么建议吗?
【问题讨论】:
-
Firebase 版本信息?请注意,您不会在 PHP 中验证令牌。您在那里铸造它们,将它们发送给客户,然后客户进行验证。
-
@Kato 我使用的是最新版本。 'com.google.firebase:firebase-auth:10.0.1'。我没明白你的意思。客户端在移动设备上登录后,firebase auth 会返回一个令牌。我想用 PHP 在服务器端验证这个令牌,以确保该令牌是否由 firebase 生成。如果验证没问题,我会授权客户。
-
@eren130,您知道公共验证密钥多久更改一次吗?我们应该将它们缓存一小时、一天还是一周?谢谢。
-
@andreszs "使用来自该端点的响应的 Cache-Control 标头中的 max-age 值来了解何时刷新公钥。"
标签: php android firebase firebase-authentication jwt