2015-07-15 2 views
2

Я получаю доступ к API, в котором вы сначала авторизуетесь, и вы получаете обратную маркер доступа, которую вы используете при последовательных вызовах. Через некоторое время (через несколько часов) истекает срок доступа к токену доступа. Поэтому я кэширую токен на сервере, чтобы любые пользователи, использующие веб-приложение, запускали вызовы API с использованием этого токена.Как обрабатывать вызовы API при завершении сеанса?

Но когда он истекает, я делаю рекурсивный вызов после обновления токена доступа. Так, например (в псевдо-JS):

function getDetails (id) { 
    data = HTTP.get(url, {params: ...}); 

    if (!data.success) { 
    updateToken(function() { 
     return getDetails(id); 
    }); 
    } else { /*.. we're good*/ } 
} 

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

  1. вызовов API
  2. (отказ)
  3. Обновление маркера
  4. вызовов API снова
+1

Что произойдет, если у них нет разрешения на использование API? Будет ли ваша функция вызывать переполнение стека? (Возможно, вам нужно только выполнить рекурсию один раз.) – royhowie

+0

Я вижу, что вы там делали! ;) Для аргумента предположим, что у них есть разрешение. Исходный токен доступа действителен, поскольку сервер Node.js авторизирован с секретным ключом/паролем. И да, моя проверка рекурсии позволяет только один уровень рекурсии. – CaptSaltyJack

+0

Мне тоже пришлось использовать api, api reddit. В основном после сообщения от api, если есть ошибка, вы проверяете, что такое ошибка, и если вы не аутентифицированы, как это произойдет, в конце концов вы попросите новый токен и обновите существующий токен к этому новому токену, а затем продолжите с того места, где вы остановились , Таким образом, у вас есть правильная идея, я не думаю, что есть другой способ, который создаются таким образом. –

ответ

1

Это именно то, как я поставил его. Однако, если у вас есть доступ к обещаниям (например, bluebird или babel.js), он становится еще лучше синтаксически. Вот ваш код переписан с обещаниями и ES6:

function getDetails (id) { 
    // the return is optional; return the promise if you want to chain to `getDetails` 
    return HTTP.get(URL, id, params) 
    .catch((err) => { 
     if (err.VALIDATION_ERROR) { 
      return updateToken().then(() => HTTP.get(URL, id, params)) 
     } else { 
      throw err 
     } 
    }).then((yourRequest) => { 
     // data here 
    }).catch((err) => { 
     // handle fatal error 
    }) 
} 
+0

Ницца! Я использую Meteor, поэтому я могу добавить пакет Babel, чтобы получить поддержку ES6. Я не знаю, почему я рекурсировал, когда я мог просто просто вызвать HTTP.get. – CaptSaltyJack

+1

Обратите внимание, что 'return getDetails (id)' в вашем исходном коде не будет работать, так как он вернет результат анонимной функции, переданной в 'updateToken'. – royhowie

+0

Виновен как заряженный. Я всегда совершаю эту ошибку. – CaptSaltyJack

0

Лучше всего было бы сохранить таймер, так как вы знаете, как долго сессия длится. То есть вы можете предварительно запросить новый токен до истечения срока действия текущего токена/сеанса. Использование этого метода также гарантирует, что у вас никогда не будет прерывания обслуживания (если, конечно, ваш запрос на новый токен не сработает). Помимо этого, похоже, у вас все остальное.

Конечно, вам по-прежнему необходимо реализовать код, который вы показали нам, чтобы иметь дело с неожиданным истечением срока действия сеанса (возможно, владельцы API решили аннулировать все сеансы из-за нарушения данных и т. Д.).

+0

Мне нравится эта идея. Но, к сожалению, я не всегда знаю тайм-аут сеанса. И даже если я это сделаю, если я должен перезапустить сервер Node.js, и он повторно авторизуется, все равно останется тот же самый токен, который был возвращен (например, с Salesforce), тогда сервер не будет знать, когда истекает срок действия. – CaptSaltyJack

+0

Как вы могли не знать тайм-аут? Если код API постоянно изменяется, длина сеанса должна оставаться довольно постоянной. Если сервер перезагрузится, вы можете по умолчанию запросить новый токен, а не использовать старый. –

+0

Как бы я не знал тайм-аут? Плохая документация API для одного. – CaptSaltyJack

Смежные вопросы