使用自定义令牌以pipe理员身份向FB DB发出REST请求

我正在迁移到新的数据库和3.0客户端库。 我正在更新生成自定义身份validation令牌的部分(在我们的服务器上),以执行PATCH更新Firebase数据库中的资源。

这些PATCH请求曾经由我们的服务器使用admin声明基于此: https : //www.firebase.com/docs/rest/guide/user-auth.htm

对于新的数据库,我生成的JWT令牌(使用ruby-jwt )是这样的:

 payload = { aud: "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit", claims: custom_claims.merge({ admin: true }), exp: now_seconds + (60 * 60), # Maximum expiration time is one hour iat: now_seconds, iss: service_account_email, sub: service_account_email, uid: uid } JWT.encode(payload, private_key, "RS256") 

具有此令牌的Firebase数据库的PATCH请求将失败: Missing claim 'kid' in auth header

这里是相当于使用Ruby的googleauth模块的Michael Bleigh的答案:

 require 'googleauth' scopes = [ 'https://www.googleapis.com/auth/userinfo.email', 'https://www.googleapis.com/auth/firebase.database'] auth = ::Google::Auth.get_application_default(scopes) auth_client = auth.dup auth_client.sub = "service-account-email-here@yourapp.iam.gserviceaccount.com" token = auth_client.fetch_access_token! 

您还需要将GOOGLE_APPLICATION_CREDENTIALS环境variables设置为您的服务帐户JSON文件的path。 auth_client.sub的值来自此JSON文件中的client_email

当然,如上所述,这仅在您控制的服务器应用程序中有效。

另外,向firebase REST API发出请求仍然是读者的一个练习。

引用

在新的Firebase中,您需要直接使用服务帐户来创buildpipe理访问凭据。 这是一个Node.js代码片断,展示了如何对数据库进行REST调用:

 // key.json is a service account key downloaded from the Firebase Console var key = require('./key.json'); var google = require('googleapis'); var request = require('request'); var DATABASE_URL = 'https://<databaseName>.firebaseio.com'; var jwtClient = new google.auth.JWT(key.client_email, null, key.private_key, [ 'https://www.googleapis.com/auth/userinfo.email', 'https://www.googleapis.com/auth/firebase.database' ]); jwtClient.authorize(function(err, tokens) { request({ url: DATABASE_URL + '/.json', method: 'GET', headers: { 'Authorization': 'Bearer ' + tokens.access_token } }, function(err, resp) { console.log(resp.body); }); }); 

要在Ruby中执行相同的操作,您可以查看使用服务帐户凭据获取访问令牌的googleauth gem 。