Node.js 如何获取远程公钥并定期存储在Apollo graphql服务器中?
我已经运行了Apollo graphql服务器。我想验证Firebase客户端发送的JWT。根据文件,我们可以提取公钥进行验证。它还提供了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: ({
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()
时添加了回调函数,它最终按需要工作。