我有一个Python服务,该服务导入了一个与PayPal API对话的库。有一个配置文件传递到库@receiver(post_save, sender=ModelClass)
def my_model_save(sender, instance, **kwargs):
# this code will be executed after an instance of ModelClass is saved.
Group(rate_key).send({
"text": "my message"
})
中,其中包含PayPal API用户名和密码。
使用用户名和密码调用PayPal API令牌端点将返回用于在付费电话期间进行身份验证的令牌。但是,此令牌持续90分钟,应重新使用。
此服务的多个实例在不同的服务器上运行,它们都需要共享一个秘密令牌。
存储9分钟令牌的最佳方法是什么?
答案 0 :(得分:5)
尽管您可以将其持久保存在数据库中,因为它仅可使用90分钟,但您可以考虑使用Redis之类的内存中数据存储。设置非常简单,并且有各种Python clients available。
Redis特别支持setting a value时的过期时间,因此您可以确保将其保留一定的时间。当然,如果出于某种原因使密钥较早失效,您仍然应该适当地进行异常处理。
尽管如果您还没有使用键值存储,这可能会引入软件依赖性,但是从您的问题中尚不清楚该库的用途以及是否存在问题。
如果不能安装其他软件,则可以使用一个临时文件。但是,由于Python的tempfile似乎不支持直接设置临时文件的名称,因此您可能必须手动处理文件管理。例如:
import os
import time
import tempfile
# 90 minutes in seconds. Setting this a little lower would
# probably be better to account for network latency.
MAX_AGE = 90 * 60
# /tmp/libname/ needs to exist for this to work; creating it
# if necessary shouldn't give you much trouble.
TOKEN_PATH = os.path.join(
tempfile.gettempdir(),
'libname',
'paypal.token',
)
def get_paypal_token():
token = None
if os.path.isfile(TOKEN_PATH):
token_age = time.time() - os.path.getmtime(TOKEN_PATH)
if token_age < MAX_AGE:
with open(TOKEN_PATH, 'r') as infile:
# You might consider a test API call to establish token validity here.
token = infile.read()
if not token:
# Get a token from the PayPal API and write it to TOKEN_PATH.
token = 'dummy'
with open(TOKEN_PATH, 'w') as outfile:
outfile.write(token)
return token
根据环境,您可能希望研究限制此临时文件的权限。但是,无论您如何持久保存令牌,此代码都应该是一个有用的示例。在文件系统上粘贴这样的东西不会让我很兴奋,但是如果您已经具有用于在磁盘上请求令牌的PayPal凭据,那么将令牌写入临时存储就不会有什么大碍了。
答案 1 :(得分:0)
您可以将令牌存储为system variable。
import os
# Store token
os.environ['PAYPAL_API_TOKEN'] = <...>
# Retrieve token
token = os.environ['PAYPAL_API_TOKEN']
但是请注意安全隐患:其他进程可以读取令牌。
答案 2 :(得分:-1)
仅供参考:PayPal访问令牌将在9小时而不是90分钟后过期:
“ expires_in”:32400
这次以秒为单位:https://developer.paypal.com/docs/api/get-an-access-token-postman/