使用刷新令牌对Firebase管理员进行身份验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用刷新令牌对Firebase管理员进行身份验证相关的知识,希望对你有一定的参考价值。

我想使用刷新令牌对firebase-admin进行身份验证。以下是Firebase文档对此的说法:

Admin SDK还提供了一个凭据,允许您使用Google OAuth2刷新令牌进行身份验证:

var refreshToken; // Get refresh token from OAuth2 flow

admin.initializeApp({
  credential: admin.credential.refreshToken(refreshToken),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

Source

所以我尝试这样做:

const admin = require('firebase-admin')

admin.initializeApp({
  credential: admin.credential.refreshToken({
    refreshToken: '6/m-jebiu2398bydhl2lhjdUehkEWlhewer', // fake value for security
    clientId: '2398757349827-bkewjeo7b092j2083hodb0u923.apps.googleusercontent.com', // fake value for security
    clientSecret: 'ijboi3290u8eu2132', // fake value for security
    type: 'authorization_code'
  }),
  databaseURL: 'https://<database>.firebaseio.com/' // fake value for security
})

admin.database().ref('/test2').once('value')
  .then(snap => snap.val())
  .then(console.log.bind(console))

(我用Node.js运行它)

请注意,admin.credential.refreshToken需要一个对象。文档(指南和参考)不说这个。我只是通过查看firebase-admin的来源发现了这个事实(以及对象的形状)。

此代码不会抛出任何错误,但它不起作用。每隔几秒钟,控制台中就会出现一个警告,并且console.log永远不会调用.then。 (添加.catch不会改变任何东西,也不会触发.catch)。

FIREBASE WARNING: Provided authentication credentials for the app named "[DEFAULT]" are invalid. This usually indicates your app was not initialized correctly. Make sure the "credential" property provided to initializeApp() is authorized to access the specified "databaseURL" and is from the correct project.

在进行更多挖掘时,此警告来自@ firebase / database,而不是firebase-admin。当Firebase数据库拒绝身份验证(来自websocket连接)时,会发生此问题。

事实上,firebase-admin成功创建了一个访问令牌,只是数据库拒绝它。

我尝试了两种类型的刷新令牌:

  1. 从第三方Google应用程序(与数据库无关)创建的刷新令牌。当然我也提供了相关的客户ID /秘密。我认为谷歌用户必须能够访问该项目才能进行此类身份验证。此方法创建上述警告。
  2. 从Firebase项目(拥有数据库的项目)创建的刷新令牌。同样,客户端ID / secret来自创建刷新令牌的项目。这也会产生上述警告。

说了这么多,我有两个问题:

  1. 如果不是第三方应用程序或Firebase创建的Google应用程序,我应该在哪里获取客户端ID /机密和刷新令牌?
  2. 什么是传递给typeadmin.credential.refreshToken?一个空值抛出一个错误,但字面上任何其他字符串值似乎没有任何区别。 type似乎没有在firebase-admin的源代码中使用。

现在,您可能会问“为什么要使用刷新令牌对firebase-admin进行身份验证?”。如果项目的所有者/授权用户授予权限,我想创建一个可以访问任意数据库的Web应用程序。我相信这是最好的方法。

感谢您抽出宝贵时间阅读所有这些内容。我感谢您的任何建议!

答案

Admin SDK预期的刷新令牌格式特定于Google产品。这是gcloud SDK使用的文件格式。如果您安装了gcloud SDK并使用它执行了login,则会在~/.config/gcloud/application_default_credentials.json创建所需的刷新令牌文件。您可以将此文件路径或其内容对象传递给admin.credential.refreshToken()。按照惯例,type字段的值是authorized_user,但是Node SDK并不像你注意到的那样真正关心。

刷新令牌凭据使SDK能够作为单个用户进行身份验证。这在开发和测试期间非常有用(使用开发人员的凭据作为应用程序默认凭据的替代),但据我所知,它没有生产应用程序。您可能应该为您的用例使用服务帐户。

以下为我工作(使用我自己的刷新令牌访问我拥有的数据库):

const admin = require('firebase-admin')
admin.initializeApp({
  credential: admin.credential.refreshToken('~/.config/gcloud/application_default_credentials.json'),
  databaseURL: "https://<DB_NAME>.firebaseio.com",
});
admin.database().ref().once('value')
  .then(snap => {
    console.log(snap.val());
  })

以上是关于使用刷新令牌对Firebase管理员进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Firebase Google 身份验证获取带有刷新令牌的 YouTube 数据 API 访问令牌?

Firebase php-jwt 令牌刷新

如果有人窃取了您的 Firebase 身份验证刷新令牌,会发生啥情况?

使用 JWT 和刷新令牌对移动应用程序进行身份验证

使用 Moya 刷新身份验证令牌

使用 Firebase 身份验证进行身份验证后检索 Google 访问令牌