提问者:小点点

使用自定义令牌向管理员FBDB发出REST请求


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

这些PATCH请求过去是由我们的服务器使用admin声明向Firebase发出的,基于以下内容:https://www.firebase.com/docs/rest/guide/user-auth.htm

对于新DB,我正在生成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")

带有此令牌的PATCH请求FirebaseDB失败,并在auth标头中缺少声明“孩子”。


共2个答案

匿名用户

在新的Firebase中,您需要直接使用服务帐户来创建管理访问凭据。这是一个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以使用服务帐户凭据获取访问令牌。

匿名用户

这相当于Michael Bleigh使用ruby googleauth模块的答案:

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环境变量设置为服务号JSON文件的路径。auth_client. sub的值来自JSON文件中的client_email

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

此外,向Firebase RESTAPI发出请求仍然是读者的练习。

参考文献

  • https://developers.google.com/api-client-library/ruby/auth/service-accounts#authorizingrequests
  • https://developers.google.com/identity/protocols/application-default-credentials#whentouse