我正在使用Firebase函数为我们的商店开发一个运输工具。当购物者请求购物车中的运费时,商店向Firebase端点发出POST请求,其中包含商品和地址信息。Firebase功能"包"这些项目,将数据发送到第三方运费API,并将费率返回到购物车。我的问题是如何处理第三方API的刷新令牌。我们的访问令牌15分钟后到期。我们的商店通常每天只看到几十个购物者,但是购物车和结帐页面在每次页面加载时都会发出POST请求。我可以想到两种方法来处理刷新令牌,但不知道哪种方法最好。
- 对于每个向第三方API的请求,首先请求一个新的访问令牌。
- 每次调用Firebase端点时,根据Firebase数据库中记录的时间和令牌检查当前时间。如果时间已经过期,在请求第三方费率之前请求一个新的令牌。
第一个显然更容易,但大部分对我来说都是新的,所以我不知道性能差异,也不知道是否有一个通用的解决方案来解决这个问题。
感谢您的评论。我最终使用jsonwebtoken节点来解码访问令牌以获得过期时间。访问令牌、exp和刷新令牌被记录在firebase中。中间件函数根据数据库中的条目检查请求的时间,并在必要时请求新的访问令牌。如果它对遇到这个的人有帮助的话:
const rp = require("request-promise");
const jwt = require("jsonwebtoken");
let exp = "untested";
const document = admin.firestore().collection("tokens").doc("***");
function decodeExp(t) {
const jsonToken = jwt.decode(t);
decExp = jsonToken.exp;
}
async function tokenTest(req, res, next) {
const tokenEntry = await document.get();
const tokenData = tokenEntry.data();
const now = Date.now() / 1000;
if (now < tokenData.exp) {
req.token = tokenData.access_token;
next();
} else {
const options = {
url: "***/oauth/token",
method: "POST",
json: true,
headers: {
"Content-Type": "application/json",
},
body: {
grant_type: "refresh_token",
client_id: "***",
client_secret: "****",
refresh_token: tokenData.refresh_token,
},
};
async function newToken(o) {
try {
const response = await rp(o);
const aToken = response.access_token;
req.token = aToken;
decodeExp(aToken);
const updated = new Date().toString();
const entry = { access_token: aToken, exp: decExp, updated: updated };
await document.update(entry);
next();
} catch (err) {
console.error("Error:", err);
}
}
newToken(options);
}
}