这个问题可能不适合胆小的人,但为了澄清我在我的代码中要做的事情,我想首先解释一下我如何期待我的身份验证系统正常运行 . 也就是说,我确实认为大部分编码工作已经完成,我只是想解决一些错误 .

我的网站GoodGameBuzz.com目前在其数据库中拥有约35,000名用户 . 我希望我的移动应用程序能够登录这些帐户中的任何一个并将新帐户写入网站数据库 . 理论上,它应该从数据库中获取帐户并将其重写到Google FireBase以便将来进行更快的身份验证,以及将其他数据附加到任何特定用户的能力,以便移动应用程序可以从firebase服务器获取数据优化和用户功能 . 创建帐户时,应将该数据重写到Website数据库,然后firebase数据库应从网站数据库中复制 .

值得一提的是,我的网站是一个WordPress网站,虽然这个信息与问题无关,因为我已经完全使用JWT验证系统设置了JSON后端 . 你会在这篇文章的底部找到我的代码;以下是我在JSON后端,Firebase指令和Node.js JWT库/说明之间访问的完整资源列表:

The Issues Brokendown Then Detailed

  • 我是否应遵循Firebase或Node.js库中有关JWT声明的说明?

  • 终端错误 - 无法读取undefined ||的属性'publicKey'它所说的“公钥”是什么/哪个?

  • 在有效载荷和选项之间划分JWT索赔;哪个声明在哪里重要?

1 例如,Firebase说要传递声明'alg'用于算法,而Node.js JWT库说要传递'algorithm' . 另一个例子是Firebase说'iat'和Node.js等价是'nbf'(我想?) . 正如您在下面的代码中看到的,我假设只是遵循Node.js库,但我不确定与auth_time(验证ID令牌链接)等firebase声明的等价物 .

2 Terminal Error Picture当我尝试使用JWKS包与网站签名时,这个问题与代码行33-43有关 . 它要求的公钥到底是什么?我之前尝试将'publicKey'更改为'cert',这是包含privatekey.pem的变量,我必须在代码中的较早行传递给jwt.sign . 我还尝试了'kid',来自(https://www.goo gleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com)的google keyid .

3 Node.js库说(与函数jwt.sign有关):

expiresIn,notBefore,audience,subject,issuer没有默认值 . 这些声明也可以分别直接用exp,nbf,aud,sub和iss在有效载荷中提供,但是你不能在两个地方都包含这些声明 . 请记住,exp,nbf和iat是NumericDate,请参阅相关的Token Expiration(exp声明)

Google Firebase说:

验证ID令牌的标头是否符合以下约束:alg,kid验证ID令牌的有效负载是否符合以下约束:exp,iat,aud,iss,sub,auth_time

MY CODE:

var admin = require('firebase-admin');
var refreshToken; // Get refresh token from OAuth2 flow

var serviceAccount = require('/home/ethreil/Desktop/codestudio/ggbsdk.json');
var uid = "some-uid";


admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: 'https://goodgamebuzz.firebaseio.com'

});

var fs = require('fs');
var cert = fs.readFileSync('/home/ethreil/Desktop/codestudio/privateKey.pem');
var jwt = require('jsonwebtoken');

var token = jwt.sign({ 
  expiresIn: 36000 ,
  audience: "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit" ,
  issuer: 'myemail@gmail.com' ,
  subject: 'myemail@gmail.com' ,
  iat: Math.floor(Date.now()) 
 } ,
 cert
  ,
 {
  algorithm: 'RS256' ,
  keyid: '7a3d1904f18e257948831eab803e12b7971e13ab' 
});

const kid = '7a3d1904f18e257948831eab803e12b7971e13ab';
var jwksClient = require('jwks-rsa');
var client = jwksClient({
  cache:true ,
  jwksUri: 'https://goodgamebuzz.com/wp-json/jwt-auth/v1/token/validate'
});

 var getKey = client.getSigningKey(kid, function(err, key) {
    var signingKey = key.publicKey || key.rsaPublicKey;
    callback(null, signingKey);
  });


jwt.verify(token, getKey, {
     algorithms: 'RS256' ,
   audience: 'goodgamebuzz' ,
   issuer: "https://securetoken.google.com/goodgamebuzz" ,
   subject: uid 

} ,
  function(err, decoded) {
  console.log(decoded) // bar
});