使用外部服务时,通常使用oauth2代币作为授权模式。
oauth2代表“开放授权”,https://example.com/oauth2/token返回的结果通常是这样的:
{
access_token: 'access_token',
token_type: 'Bearer',
expires_in: 3600,
}
您想重复使用访问权限,直到其有效为止,而不是总是每次调用oauth2/token
端点。如果您要消费的外部服务很慢,则最多可以减少1/2秒。
使用redis缓存oauth2令牌
redis是一个内存密钥值数据库,可以让您在有效期的时间内保存一些数据。这是在有效期缓存数据的理想选择。
让我们看看如何使用Node和ioredis package使用REDIS读取和设置一些数据
import Redis from 'ioredis'
const redis = new Redis();
// save value stringified in a given key for some seconds
redis.setex(key, seconds, JSON.stringify(value));
// read the value of the key, it will return null if the key is expired
redis.get(key);
给定上面的2个命令,我们可以实现高订单功能,以使我们的oauth2Token
请求使用redis
const withAccessTokenCache = (oauth2TokenRequest, cacheKey = 'oauth2token') => async () => {
const cachedToken = await redis.get(cacheKey);
if (cachedToken) {
return JSON.parse(cachedToken);
}
const tokenResponse = await oauth2TokenRequest();
if (tokenResponse.access_token && tokenResponse.expires_in) {
await redis.setex(cacheKey, tokenResponse.expires_in, JSON.stringify(tokenResponse));
}
return tokenResponse;
}
withAccessTokenCache
将首先尝试从redis缓存中读取令牌,并且仅在当前的标记过期时才要求新令牌。
这是最后的示例:
const providerOAuth2Token = async () => {
const url = `https://example.com.br/oauth2/token`;
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
};
const response = await fetch(url, options);
return await response.json();
};
const providerOAuth2TokenWithCache = withAccessTokenCache(providerOAuth2Token);
总结
Woovi提供即时付款解决方案,因此我们需要尽快使我们的服务尽快。我们使用缓存来制作缓慢的外部服务以使其看起来很快。
您还在缓存什么?
woi
Woovi是一家创业公司,使购物者能够按照自己的意愿付款。为了实现这一目标,Woovi为商人提供即时付款解决方案接受订单。
如果您想与我们合作,我们是hiring!
照片