使用redis缓存oauth2令牌
#cache #redis #authentication

使用外部服务时,通常使用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


Wells Hall上的Unsplash

照片