Хранение OAuth-токена в библиотеке Python

У меня был успех, делающий это следующим образом:

db.collection.update(  { _id:...} , { $set: { 'key.another_key' : new_info  } } );

У меня есть функция, которая динамически обрабатывает мои обновления профиля

function update(prop, newVal) {
  const str = `profile.${prop}`;
  db.collection.update( { _id:...}, { $set: { [str]: newVal } } );
}

Примечание: «Профиль» относится к моему реализация, это просто строка ключа, которую вы хотели бы изменить.

3
задан user7692855 23 March 2019 в 22:32
поделиться

1 ответ

Хотя вы можете сохранить это в базе данных, поскольку это действительно только в течение 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
ответ дан kungphu 23 March 2019 в 22:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: