Хранение OAuth-токена в библиотеке Python - PullRequest
3 голосов
/ 18 марта 2019

У меня есть служба Python, которая импортирует библиотеку, которая взаимодействует с PayPal API.Существует файл конфигурации, который передается в библиотеку __init__(), которая содержит имя пользователя и пароль PayPal API.

Вызов конечной точки токена API PayPal с именем пользователя и паролем вернет токен, используемый для аутентификации во время платного вызова.Однако этот токен длится 90 минут и должен быть использован повторно.

Существует несколько экземпляров этой службы, работающих на разных серверах, и все они должны совместно использовать этот один секретный токен.

Как лучше всего хранить этот 9-минутный токен?

Ответы [ 3 ]

5 голосов
/ 20 марта 2019

Несмотря на то, что вы можете сохранить это в базе данных, поскольку она действительна только в течение 90 минут, вы можете рассмотреть возможность использования хранилища данных в памяти, например Redis . Это очень просто настроить, и есть различные клиенты Python .

Redis, в частности, поддерживает время истечения, когда устанавливает значение , так что вы можете быть уверены, что оно будет храниться только в течение установленного периода времени. Конечно, вы все равно должны иметь обработку исключений на случай, если по какой-то причине ключ будет недействителен раньше.

Хотя это может привести к программной зависимости, если вы еще не используете хранилище значений ключей, из вашего вопроса не ясно, как эта библиотека предназначена для использования и, следовательно, является ли это проблемой.

Если установка другого программного обеспечения невозможна, вы можете использовать временный файл. Однако, поскольку 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, используемые для запроса токена на диске, запись токена во временное хранилище, вероятно, не будет большой проблемой.

0 голосов
/ 08 апреля 2019

Так же, как информация: срок действия токена доступа PayPal истекает через 9 часов, а не через 90 минут:

"expires_in": 32400

Это время в секундах: https://developer.paypal.com/docs/api/get-an-access-token-postman/

0 голосов
/ 22 марта 2019

Вы можете сохранить токен как системную переменную .

import os

# Store token
os.environ['PAYPAL_API_TOKEN'] = <...>

# Retrieve token
token = os.environ['PAYPAL_API_TOKEN']

Однако помните о последствиях безопасности: другие процессы могут прочитать токен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...