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

Posted

技术标签:

【中文标题】如何定期获取远程公钥并存储在 Apollo graphql 服务器中?【英文标题】:How to grab remote public key and store in Apollo graphql server periodically? 【发布时间】:2020-05-25 16:24:50 【问题描述】:

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

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

);

server.listen();

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

【问题讨论】:

【参考方案1】:

你可以懒洋洋地取它们。比如:

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

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

【讨论】:

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

以上是关于如何定期获取远程公钥并存储在 Apollo graphql 服务器中?的主要内容,如果未能解决你的问题,请参考以下文章

Heroku“权限被拒绝(公钥)致命:无法从远程存储库中读取”问题

如何使用 GraphQL 的 Apollo 客户端将获取的数据存储到 Redux 的存储中

如何将 Redux 应用程序转换为 GraphQL/Apollo?

如何将图像存储在文件服务器中并获取远程 URL 以响应本机应用程序

gitolite 如何将远程用户映射到存储库用户?

如何从存储在 iOS 钥匙串中的密钥中获取 DER 格式的公钥?