Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何获取远程公钥并定期存储在Apollo graphql服务器中?_Node.js_Firebase_Graphql_Jwt_Apollo - Fatal编程技术网

Node.js 如何获取远程公钥并定期存储在Apollo graphql服务器中?

Node.js 如何获取远程公钥并定期存储在Apollo graphql服务器中?,node.js,firebase,graphql,jwt,apollo,Node.js,Firebase,Graphql,Jwt,Apollo,我已经运行了Apollo graphql服务器。我想验证Firebase客户端发送的JWT。根据文件,我们可以提取公钥进行验证。它还提供了max age,直到我们可以存储密钥为止。我使用Auth0 nodejs进行JWT验证。我的问题是如何定期获取此公钥并将其存储在Apollo server中的nodejs变量中,这样就不必为Apollo server中的每个请求从firebase获取密钥 const server = new ApolloServer({ schema, context: ({

我已经运行了Apollo graphql服务器。我想验证Firebase客户端发送的JWT。根据文件,我们可以提取公钥进行验证。它还提供了
max age
,直到我们可以存储密钥为止。我使用Auth0 nodejs进行JWT验证。我的问题是如何定期获取此公钥并将其存储在Apollo server中的nodejs变量中,这样就不必为Apollo server中的每个请求从firebase获取密钥

const server = new ApolloServer({
schema, context: ({ req }) => {
const token = req.headers.authorization;
const user = getAuthorizedUser(token);
return { user };
}
});

server.listen();

这里getAuthorizedUser(令牌)需要在每次新请求时从远程服务器获取公钥。这可能会减慢我的应用程序速度。我不知道如何定期从远程服务器获取数据,并将其用于我服务器上的每个请求。

您只需懒洋洋地获取数据即可。比如:

let keys
let expiresAt = 0

async function getPublicKeys () {
  if (expiresAt < Date.now()) {
    try {
      const { maxAge, publicKeys } = await getKeysFromFirebase()
    catch (e) {
      // Handle being unable to fetch the keys from Google -- either retry or throw
    }
    expiresAt = (maxAge * 1000) + Date.now() - arbitraryPadding
    keys = publicKeys
  }
  return keys
}
let键
设expiresAt=0
异步函数getPublicKeys(){
如果(到期时间<日期.现在()){
试一试{
const{maxAge,publicKeys}=wait getKeysFromFirebase()
捕获(e){
//句柄无法从Google获取密钥--重试或抛出
}
expiresAt=(最大值*1000)+Date.now()-arbitraryPadding
钥匙=公用钥匙
}
返回键
}

除此之外,您可以使用
setTimeout
,让应用程序在它们过期之前重新蚀刻它们——您只需要确保在进程退出时清除计时器。您还可以设置一个cron作业,只需定期将密钥写入文件。

您好,谢谢您为我指明了正确的方向。我有点新到graphql和node。此代码是否会定期重新获取密钥?是否可以访问所有请求的
密钥
,以便我可以验证所有incomin请求?您将呼叫(并等待)
getPublicKeys
来自上下文函数内部。在每次请求时,函数都会检查密钥是否过期。如果它们没有过期,它会返回内存中的内容(
keys
变量)。如果它们过期,它会从Firebase获取密钥(您必须自己提供这段代码)然后根据Firebase的响应更新
expiresAt
变量。然后它将最终返回
的值,该值现在已经更新。谢谢。最后我让它工作了。我在调用
getPublicKeys()
时添加了回调函数,它最终按需要工作。