如何获取远程 public 密钥并定期存储在 Apollo graphql 服务器中?
How to grab remote public key and store in Apollo graphql server periodically?
我有 运行 一个 Apollo graphql 服务器。我想验证 Firebase 客户端发送的 JWT。根据 this 文档我们可以获取 public 密钥来验证。它还提供 max-age
,直到我们可以存储密钥。我使用 Auth0-nodejs 进行 JWT 验证。我的问题是如何定期获取此 public 密钥并将其存储在 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) 需要在每次新请求时从远程服务器获取 public 密钥。这可能会减慢我的应用程序。我不确定如何定期从远程服务器获取数据并将其用于我服务器上的每个请求。
您可以懒惰地获取它们。类似于:
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 作业。
我有 运行 一个 Apollo graphql 服务器。我想验证 Firebase 客户端发送的 JWT。根据 this 文档我们可以获取 public 密钥来验证。它还提供 max-age
,直到我们可以存储密钥。我使用 Auth0-nodejs 进行 JWT 验证。我的问题是如何定期获取此 public 密钥并将其存储在 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) 需要在每次新请求时从远程服务器获取 public 密钥。这可能会减慢我的应用程序。我不确定如何定期从远程服务器获取数据并将其用于我服务器上的每个请求。
您可以懒惰地获取它们。类似于:
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 作业。