Как мне хранить токен доступа из API третьей части

Привет, я использую meteorjs и сторонний API для создания пользователей в сторонней базе данных.

Я получаю токены доступа с oauth2, а срок действия токенов составляет 2 часа. После получения токена доступа с помощью асинхронной функции я использую его несколькими разными методами.

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

как лучше всего их безопасно хранить и использовать глобально на сервере?

Спасибо заранее


person mcnk    schedule 11.12.2018    source источник
comment
Хороший намек - как Meteor хранит токен аутентификации, когда ваш пользователь вошел в систему. Вы можете имитировать эту концепцию для других токенов.   -  person Jankapunkt    schedule 12.12.2018


Ответы (2)


RFC6819 - Модель угроз и соображения безопасности определяет несколько векторов угроз и меры противодействия. В этом разделе 5.3.3. «Хранить секреты в безопасном хранилище» - это рекомендации по хранению секретов.

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

Учитывая, что вы используете клиентское приложение на основе JavaScript, лучше всего хранить токен доступа в HTML5 web. хранилище.

Он позволяет вам получить доступ к токену всякий раз, когда это необходимо для ваших вызовов API. Кроме того, если реализация браузера безопасна (например: - Содержит все исправления безопасности и т. Д.), Это обеспечит безопасное хранилище, запрещающее доступ к другим приложениям. Кроме того, у вас есть возможность использовать sessionStorage, чтобы обеспечить дополнительную безопасность удаления токена доступа при закрытии вкладки.

person Kavindu Dodanduwa    schedule 12.12.2018
comment
Спасибо за ответ, но мне кажется, что я неправильно сформулировал вопрос. В моем случае клиент - это сервер. Таким образом, браузер не задействован, и, к сожалению, на сервере нет sessionStorage. и есть только один пользователь, использующий api, и этот пользователь является сервером. - person mcnk; 12.12.2018

В итоге я использую глобальную переменную для хранения токена на сервере;

token = '';

Meteor.methods({
  refreshToken: function () {
    token = getToken();
  ...
});

и сейчас

token

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

    const EXPIRATION_WINDOW_IN_SECONDS = 300;
    const expirationTimeInSeconds = token.expires_at.getTime() / 1000;
    const expirationWindowStart = expirationTimeInSeconds - EXPIRATION_WINDOW_IN_SECONDS;
    const nowInSeconds = (new Date()).getTime() / 1000;
    const shouldRefresh = nowInSeconds >= expirationWindowStart;
       if (shouldRefresh) {
           try {
               //refresh the token
           } catch (error) {
               console.log('Error refreshing access token: ', error.message);
           }
       }
person mcnk    schedule 12.12.2018