Node.js-如何使用JWT令牌通过网站数据库对移动Firebase用户进行身份验证?

时间:2018-06-22 18:43:47

标签: javascript node.js firebase firebase-authentication jwt

这个问题可能不是出于胆小,而是为了阐明我在代码中要执行的操作,我想开始解释我希望身份验证系统如何运行。也就是说,我确实相信大多数编码工作已经完成,我只是想消除一些错误。

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

也许值得一提的是,我的网站是WordPress网站,尽管此信息与问题无关,因为我已经完全使用JWT验证系统设置了JSON后端。您将在本文的底部找到我的代码;以下是我在JSON后端,Firebase指令和Node.js JWT库/指令之间访问的资源的完整列表:

  1. Node.js JWT Library/Instructions
  2. JWKS-RSA Repository
  3. Firebase - Create Custom Tokens
  4. Firebase - Verify ID Tokens
  5. GoodGameBuzz JSON Backend API
  6. GoodGameBuzz JSON JWT
  7. ht tps:// goodga mebuzz.com/wp-json/jwt-auth/v1/token/validate
  8. htt p://v2.wp-ap i.org /
  9. htt ps:// wordpres s.org/plugins/jwt-authentication-for-wp-rest-api /

随后细分的问题

  1. 我应该遵循JWT声明的Firebase或Node.js库说明吗?

  2. 终端错误-无法读取未定义||的属性'publicKey'它说的是什么/哪个“公钥”?

  3. 在有效负载和选项之间划分JWT声明;哪个索赔去哪有关系吗?

1 例如,Firebase说传递算法的声明“ alg”,而Node.js JWT库说传递“算法”。另一个示例是Firebase说“ iat”,而Node.js等效项是“ nbf”(我认为?)。正如您在下面的代码中看到的那样,我假定仅遵循Node.js库,但是我不确定与auth_time(验证ID令牌链接)等firebase声明等效。

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

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

  

expiresIn(不是之前),受众,主题,发行者没有默认值。这些声明也可以直接在有效负载中分别提供exp,nbf,aud,sub和iss,但您不能在两个地方都包含。   请记住,exp,nbf和iat是NumericDate,请参阅相关的令牌到期(exp声明)

Google Firebase说:

  

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

我的代码:

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
});

0 个答案:

没有答案