在Python库中存储OAuth令牌

时间:2019-03-17 22:17:11

标签: python paypal oauth

我有一个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分钟令牌的最佳方法是什么?

3 个答案:

答案 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/