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

节点。Firebase Admin SDK的js身份验证服务器-JWT验证问题

金昂熙
2023-03-14

我正在进行一个项目,我们将在微服务架构中使用不同的服务,我们还希望使用一些Firebase服务。我正在开发一个身份验证服务器,它将铸造定制的JWT,用于Firebase和其他应用编程接口项目。

我们希望使用Firebase Auth SDK轻松与FB、谷歌、Twitter等集成,但我们需要用更多数据丰富用户的令牌。因此,我的思维过程是创建一个节点。使用Firebase Admin SDK执行此操作的JS auth服务器。流程如下:

  1. 用户使用客户端上最喜爱的提供商登录
  2. 如果登录成功,用户将从Firebase收到JWT。这将被发送到身份验证服务器进行验证
  3. 如果身份验证服务器可以使用admin SDK验证令牌,请创建一个包含更多数据的新自定义令牌,并将此新自定义令牌返回给客户端
  4. 让客户端使用新的自定义令牌重新验证,并使用它与Firebase以及我们的其他API项目(主要是在.NET Core中)进行通信

1-3步很好。当尝试在其他服务上验证自定义令牌时,会出现问题。

TL;博士:这里有两个问题:

  1. 验证使用Firebase节点颁发的自定义令牌时。JS Admin SDK,我应该使用什么作为公钥?是从谷歌公开的JWK中提取的密钥,还是从用于签名的私钥中提取的密钥

首先,我怀疑核实它的正确方法。(请原谅,我没有创建OAuth流的经验。)使用的算法是RS256,所以我应该能够使用公钥验证令牌。在我看来,有两种方法可以获得这把钥匙:

  1. 从私钥中提取公钥,并使用它进行验证。我可以这样做,并在auth服务器上的测试endpoint上成功验证,但我觉得这样做是不正确的
  2. 另一种,也是我认为更正确的方法,是使用令牌中的值在我的项目的谷歌“/.well-known/openid-configuration/”endpoint上查找JWK,即

https://securetoken。谷歌。com/[PROJECT ID]/。众所周知的/openid配置

检索正确的孩子(密钥ID)的指数和模,并从中创建公钥。

通过执行以下操作从admin SDK生成的令牌

admin.auth().createCustomToken(uid, additionalClaims).then(function(customToken)

对于一些自定义声明,如下所示:

标题:

{
  "alg": "RS256",
  "typ": "JWT"
}

有效载荷:

{
  "claims": {
    "premiumAccount": true,
    "someRandomInnerObject": {
      "something": "somethingRandom"
    }
  },
  "uid": "<uid for the user>",
  "iat": 1488454663,
  "exp": 1488458263,
  "aud": "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
  "iss": "firebase-adminsdk-le7ge@<PROJECT ID>.iam.gserviceaccount.com",
  "sub": "firebase-adminsdk-le7ge@<PROJECT ID>.iam.gserviceaccount.com"
}

不过,我似乎无法让方法2奏效。一个问题是生成的令牌没有头,因此不符合OpenID规范(AFAIK),这导致以下两个选项之一:

  1. 用上面的第一种方法。然而,这会导致问题——如果我出于某种原因需要撤销或重置身份验证服务器上的私钥,我需要这样做,并在所有其他服务上部署更改,使得解决方案不那么动态,更容易出错。
  2. 使用jwt.io提到的库之一手动生成类似的令牌,并将原始Firebase ID令牌中的孩子添加到其标题中。

2号的问题:

  • 那么,我应该把什么列为iss、aud和sub呢?与admin SDK的值相同吗?如果是这样,那不是“作弊”吗?因为他们不再是发行人了

我做后者的方式是这样的(以下是关于这个主题的博客指南):

>

使用lib生成公钥(来自mod exp的rsa pem)

使用密钥验证使用'官方'jwt库

上述操作会产生公钥:

-----开始RSA公钥---MIIBCgKCAQEAxXpo7ChLMnv1QTovmm9DkAnYgINO1WFBWGAVRt93ajftPpVNcxMT MAQI4Jf06OxFCQib94GyHxKDNOYiweVrHVYH9j/STF xbQwiPF/8L7 haC2WXMl2 TKTGMSLVEWWWWWWWF4COQV29OVCQWECBCAYCWVDDM1YKYKDRK0YOUL0YOYOKQ1GDCUUL/JHAFFZN6C8WPVI2YDHCHICH04BCBJ0BZGNK2KKKKZKKKK6rrIFGfHpcv8mWG1Awsu5qs33aFu1Qx/4LdMAuEsvX9f EmFZCUS8 trilqJbcsd/AQ9eOZLAB0BdKwIDAQAB------结束RSA公钥-----

有两件事似乎不对。一是密钥与我可以从私钥中提取的密钥不同。另一个问题是,我从私钥中提取的一个有以下注释:

-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY-----

没有“RSA”。这有关系吗?无论如何,它都无法验证。

最后,我是否完全误解了OpenID流?JWK是由私钥生成的,我也需要私钥来验证我的JWT吗?我是否应该在auth服务器上公开我自己的JWK,以便其他服务联系和使用,而不是谷歌的?我有点困惑Firebase Admin SDK做什么和不做什么,我想:-)

我知道这是很多问题,但我认为它们都有联系。

我在研究中依赖的一些资源(当然除了官方的管理sdk文档):

  • jwt。io

共有1个答案

谢铭
2023-03-14

在使用自定义令牌重新验证Firebase客户端SDK之后,客户端实际上会使用自定义令牌中的声明生成一个新的ID令牌。您应该使用此ID令牌来验证向不同微服务发出的请求(此处有文档记录)。所以,是的,您的原始ID令牌将被丢弃,但会在其位置创建一个新的ID令牌。该ID令牌将每小时自动刷新一次。所以,你应该可以直接调用用户。getToken()在需要时获取有效的ID令牌。该方法代表您处理所有缓存。

 类似资料:
  • 我正在开发一个具有自己的身份验证和授权机制的REST应用程序。我想使用JSON Web Tokens进行身份验证。以下是有效且安全的实现吗? < li >将开发一个REST API来接受用户名和密码并进行认证。要使用的HTTP方法是POST,因此没有缓存。此外,在传输时还会有安全SSL < li >在认证时,将创建两个JWTs访问令牌和刷新令牌。刷新令牌将具有更长的有效期。这两个令牌都将写入coo

  • 我想用jwt流实现DocuSign服务集成身份验证。 我已经生成了有效的jwt(在jwt.io上验证),并且我可以根据https://docs.docusign.com/esign/guide/authentication/oa2_jwt.html#requesting-访问令牌 我在这篇博文中发现:https://www.docusign.com/blog/dsdev-docusign-deve

  • 它总是导致带有错误消息的catch块 登录失败:未知的用户名或错误的密码。失败:未知的用户名或错误的密码。 我确信给定的密码是正确的。 如何使用给定的密码验证用户名?

  • 在auth-routes示例中,api和nuxt一起启动并使用一个Node.js服务器实例。但是,有时我们应该使用jsonWebToken处理外部api身份验证问题。在这个例子中,将用最简单的方式解释。 官方 auth-module 如果要实现复杂的身份验证流程,例如OAuth2,我们建议使用官方 auth-module 结构 由于Nuxt.js同时提供服务器和客户端呈现,并且浏览器的cookie

  • 我正在使用预装的Visual Studio解决方案开发我的首批OAuth解决方案之一。 不过,同时我也希望我的服务器应用程序拥有“完全访问权限”。他们需要能够获得列表增加多个用户,删除东西等等。 下面是我的问题,我认为这些问题可以很容易地一起回答: 如何管理两个短期令牌(承载令牌?)连同永久令牌(API令牌?) 我在访问级别上有何不同,因此某些方法需要永久令牌? 在同一方法中,我在访问级别上有何不

  • 我必须说,我对整个模型非常困惑,我需要帮助把所有的浮动件粘在一起。 我不是在做Spring REST,只是简单的WebMVC控制器。 什么让人困惑?(错误之处请指正) 第三方身份验证 要针对第三方进行身份验证,我需要通过扩展AuthenticationProvider来拥有自定义提供程序 null 问题: 何时调用AbstractAuthenticationProcessingFilter#Suc