2014-03-29 3 views
1

Я пытаюсь настроить приложение node.js на использование API-интерфейса Elance с использованием OAuth2.0 Я использую passport.js для подключения к elance api и до сих пор могу получить код правильно. Прежде чем использовать методы api, мне необходимо получить request token using a post request.Токен уже использовал ошибку при получении доступа к токену

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

app.get('/callback', 
    passport.authenticate('elance', { failureRedirect: '/failure' }), 
    function(req, res) { 
    console.log('CODE : ' + req.query.code); // this is getting displayed properly 
var payload = { 
    code: req.query.code, 
    grant_type:'authorization_code', 
    client_id: auth.CLIENT_ID, 
    client_secret: auth.CLIENT_SECRET 
    }; 

request.post('https://api.elance.com/api2/oauth/token/', payload) 
    .then(function(response) { 
     var x = response.getBody(); 
     console.log('resp::::'+x); 
     res.redirect('/success'); 
    }); 
}); 

Я использую requestify выполнить запрос на почту и я не использую/вызова к серверу с временным кодом. Вот генерируется ошибка:

... [Sat, 29 Mar 2014 05:54:15 GMT] "GET /callback?code=F9t-zztOLJ3IOlbGXlsqous686HstXqkv7etrvEnF11Vg4M HTTP/1.1" - - "-" "Mozilla/5.0 (X11; Linux i686 on x86_64; rv:30.0) Gecko/20100101 Firefox/30.0" 
InternalOAuthError: Failed to obtain access token (status: 401 data: {"errors":[{"code":null,"description":"Code already used."}]}) 

ответ

0

Ниже приведены моменты, которые, как представляется, жизненно важное значение для того, чтобы получить маркер:

  1. Установка правильных значений типа содержимого и Content-Length.
  2. Запрос должен быть HTTPS-запросом.
  3. Метод должен быть POST.
  4. Я также установил и использовал Open SSL, чтобы избежать любой проблемы, вызванной небезопасными вызовами, производимыми сервером.
  5. Вызовы, сделанные с использованием Requestify, терпели неудачу каждый раз, даже когда я устанавливал идентичную информацию заголовка, указанную в № 1 выше. Как видно на прилагаемом скриншоте, он отлично работает с обычными вызовами запроса https.

JSON ответ от последующих запросов был получен из следующего кода:

var request = require("request"); 
var jobURL = 'https://api.elance.com/api2/jobs/my?access_token=' + _token; 

request(jobURL, function (error, response, body) { 
    res.write(body); 
    res.end(); 
}); 
1

Возможно, правильный способ реализации этого с Elance, чтобы написать strategy. Просто используйте один из других опубликованных как Facebook в качестве модели, или более простой, например, GitHub. Он должен быть достаточно простым и лучше инкапсулированным. Вот полный список: http://passportjs.org/, если вы хотите исследовать. Еще лучше, сделав этот модуль многоразовым, другие могут затем извлечь из него более стандартный способ.

Стратегии обмениваются кодом для токена. Вероятно, причина, по которой используется код, и вы получаете эту ошибку. Это часть стандартного потока OAuth2.

+0

Благодаря Eugenio, я начал работу над этим сейчас и опубликует результаты здесь –

+0

я сделал стратегию (https://github.com/SumitBisht/passport-elance), но проблема остается. Дальнейшие попытки создания приложения php, приведенного на веб-сайте elance, также не выполняются. Есть ли способ проверить статус сервера Oauth? –

+0

@Sumit - Я бы хотел, чтобы вы не отметили это как правильное, так как это не сработало для вас. Я долгое время пытался выяснить, что означает этот ответ, пока я не понял, что это неправильный ответ :-). –

0

У меня была такая же проблема, и мне пришлось работать с поддержкой Elance, чтобы понять ее. Эта ошибка возникла для меня, потому что для одного и того же пользователя из нескольких потоков/серверов с одним и тем же ключом API приходило несколько одновременных запросов.

В моем случае это был пул серверных потоков, которые выполняли фоновый рисунок, и нам нужно было синхронизировать логин, так что это произошло только один раз. Несколько потоков могут повторно использовать один и тот же access_token, просто не применяются для кода, а затем access_token/refresh_token параллельно.

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

+1

На самом деле, это не так на моем конце, поскольку я делал это от одного клиента, и не использовалось многопоточное/объединение, которое могло бы вызвать эту политику дублирования. Хотя ваш ответ полезен, для меня это было не так. –

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