Как справиться с истечением срока действия OAuth access_token с помощью клиента узла Asana?

Используя модуль NodeJS Асаны ( https://github.com/Asana/node-asana) с OAuth, как мне обработать истечение срока действия access_token? Предоставляет ли клиент какой-то механизм, который я должен использовать, чтобы обнаружить это? Предоставляет ли он что-то, что я должен использовать, чтобы получить новый access_token с использованием refresh_token? Я не смог найти никакого обсуждения refresh_token в документации.


Я зарегистрировал свое приложение и смог успешно получить учетные данные с помощью API-интерфейса Client.app.accessTokenFromCode. Что-то вроде этого:

function handleOauthCallback(req, res) {
    var client = Asana.Client.create({
        clientId: CLIENT_ID,
        clientSecret: CLIENT_SECRET,
        redirectUri: computeRedirectUrl(req)
    });
    client.app.accessTokenFromCode(req.query.code).then(function(credentials) {
        // store credentials
    }
}

Я храню весь объект учетных данных, который возвращается после этого вызова, а затем создаю клиента с использованием этих учетных данных. Что-то вроде этого:

var client = Asana.Client.create({
    clientId: CLIENT_ID,
    clientSecret: CLIENT_SECRET,
    redirectUri: computeRedirectUrl(req)
});
var storedCredentials = getStoredCredentials();
client.useOauth({ credentials : storedCredentials });

Теперь, когда у меня есть клиент, который инициализирован с учетными данными, которые я получил от Asana (который включает access_token и refresh_token), как мне обработать истечение срока действия access_token? Нужно ли мне самому проверять, действует ли он по-прежнему, и запрашивать новый токен, используя токен обновления? Или клиент обработает это для меня автоматически? Если клиент обрабатывает его, как мне узнать, когда он получает новый токен доступа?

Обновить

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

1 ответ

Решение

(Я работаю в Асане). Это отличный вопрос, и мы должны добавить ответы к документации.

dispatcher может быть передана опция под названием handleUnauthorized который является обратным вызовом для запуска, когда он получает 401 (который, если вы начали с хорошими учетными данными, должен происходить только после истечения срока действия вашего токена). Это задокументировано в коде.

Поведение по умолчанию этой опции заключается в вызове Dispatcher.maybeReauthorize, который сделает внутренний запрос на получение нового токена доступа, если у него есть токен обновления.

Поэтому, если вы просто хотите, чтобы диспетчер прозрачно обновил токен доступа, вам не нужно ничего делать, он должен "просто работать"! Но если вы хотите перехватить этот процесс, вы можете передать handleUnauthorized в опциях отправки и затем делайте что хотите, возможно, включая вызов метода по умолчанию.

Если вы хотите увидеть новый токен доступа, хорошо.. Authenticator класс является абстрактным, и мы не предоставили надежного способа извлечь из него учетные данные; возможно мы можем добавить это. Если вам это действительно нужно, вы можете предположить, что это аромат oauth с чем-то вроде:

handleUnauthorized: function() {
  return Dispatcher.maybeReauthorize.call(dispatcher).then(
      function(reauthorized) {
        if (reauthorized) {
          onCredentials(dispatcher.authenticator.credentials);
        }
        return reauthorized;
      });
}

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

Другие вопросы по тегам