Как запросить файл JSONP через jQuery AJAX из API Upwork, который использует аутентификацию OAuth 1.0?

Мне нужно запросить файл JSONP из Upwork API через jQuery AJAX. API Upwork использует аутентификацию OAuth 1.0.

Я новичок в Oauth, но читал об этом в последние несколько дней, и я вообще понимаю, как это работает, но было очень трудно реализовать его в этом конкретном сценарии/среде. Стучал головой в течение нескольких дней, и поддержка API Upwork не очень помогла : (

мне нужно пройти через все необходимые шаги в OAuth 1.0 и получить параметры OAuth, переданные с url-адресом запроса. Пожалуйста, помогите!

вот что я сделал до сих пор:

// My Upwork API key and secret
var api_key = 'xxx',
    api_secret = 'xxx';


// TO-DO
// OAuth 1.0 authentication


// TO-DO
// required oauth parameters
// https://developers.upwork.com/?lang=node#authentication_required-oauth-10-parameters
var oauth_consumer_key = '',
    oauth_signature = '',
    oauth_nonce = '',
    oauth_signature_method = '',
    oauth_timestamp = '',
    oauth_token = '';


// Compose request url with required oauth parameters
var url  = "https://www.upwork.com/api/profiles/v2/search/jobs.json?q=java&callback=?";
url += "&oauth_consumer_key="+oauth_consumer_key;
url += "&oauth_signature="+oauth_signature;
url += "&oauth_nonce="+oauth_nonce;
url += "&oauth_signature_method="+oauth_signature_method;
url += "&oauth_timestamp="+oauth_timestamp;
url += "&oauth_token="+oauth_token;


// Ajax request
// https://developers.upwork.com/?lang=node#getting-started_cross-domain-requests
$.ajax({
  url: url,
  dataType: 'JSONP',
  success:function(json){
    alert("Success: "+json.server_time);
  },
  error:function(){
    alert("Error");
  },
});

CodePen:http://codepen.io/nunoarruda/pen/xZBEzB?editors=1010

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

1 ответов


TLDR я начинаю с описания процесса OAuth 1.0, чтобы убедиться, что приведенные ниже примеры кода и мои выводы будут ясны. Перейти к The code часть, если процесс OAuth ясен.

процесс OAuth 1.0

я использую следующие термины ниже (они отличаются от официальной терминологии, но, надеюсь, прояснят ситуацию):

  • App - ваше приложение
  • обслуживание - обслуживание вы спрашиваете данные из
  • User-пользователь, который предоставляет вам доступ к своим данным, хранящимся в сервисе

подготовка. Зарегистрируйте приложение в сервисе

вы получите ключ клиента и секрет, используемый для запуска процесса OAuth.

в случае Upwork, вы делаете это здесь -https://www.upwork.com/services/api/apply.

Шаг 1. Получите временный токен oauth.

этот запрос сделан вашим приложением к услуга. Ваше приложение передает client key, так что служба знает, кто спрашивает.

запрос подписывается с помощью client secret, служба также имеет его и может проверить, действительно ли это запрос из вашего приложения, а не от кого-то другого, кто украл ваш ключ клиента (это причина, по которой вы не должны никому показывать свой секрет).

сервер возвращает temporary oauth token + temporary oauth secret.

в случае Upwork вы посылаете этот запрос к https://www.upwork.com/api/auth/v1/oauth/token/request

Шаг 2. Попросить пользователя предоставить вам доступ.

ваше приложение просто перенаправляет пользователя на специальный URL, предоставленный службой.

служба показывает диалоговое окно, в котором пользователь может предоставить доступ для вашего приложения. Этот специальный URL включает temporary token Шаг 1, поэтому служба знает, какое приложение запрашивает доступ.

если у вас есть веб-приложение, вы просто открываете адрес в браузере. Затем служба перенаправляет обратно в приложение, используя oauth_callback (URL для перенаправления пользователя обратно). Служба также передает oauth_verifier до oauth_callback URL-адрес.

если у вас есть настольное приложение, оно должно запустить браузер, и Служба может показать oauth_verifier в виде строки, чтобы пользователь мог вручную скопировать ее и вставить обратно в приложение. В этом случае вы устанавливаете oauth_calback в специальный oob (внеполосная) значение. Эта часть (без перенаправления назад) строго не описана в спецификации, поэтому детали зависят от службы. Он может не поддерживаться вообще или поддерживаться каким-либо другим способом.

в случае доработки вы отправляете пользователя по URL https://www.upwork.com/services/api/auth?oauth_token= {временный токен}

Шаг 3. Получите реальный токен доступа oauth.

ваше приложение отправляет временный токен с шага 1 и oauth верификатор от шага 2 к сервису. Запрос снова подписан, но на этот раз с помощью client secret и temporary token secret. Служба отвечает с помощью маркера доступа + секрет.

в случае Upwork URL-адрес https://www.upwork.com/api/auth/v1/oauth/token/access

это 3 шага, чтобы получить реальный доступ к токингу и начать использовать API службы. Пример в спецификации также хорош и понятен,Регистрация это.

также обратите внимание, что OAuth 1.0 нельзя безопасно использовать в 100% клиентских приложениях. На шаге 1 вам нужно использовать private client secret который не должен быть известен никому (поэтому вы не должны помещать его в свой клиентский код). На Шаге 2 сервис перенаправит браузер обратно в oauth_callback и вы не можете справиться с этим на стороне клиента.

технически можно использовать клиентскую сторону oauth, если вы используете сценарий без обратного вызова, как для настольное приложение. В этом случае пользователю потребуется вручную скопировать верификатор обратно в приложение. Этот сценарий также должен поддерживаться Servcie (Upwork не поддерживает его, см. ниже).

Шаг 4. Используйте API сервиса

теперь, как только вы получите маркер доступа, вы можете сделать запросы API для получения данных, здесь вы отправляете оба своих client key и access token из Шага 3. Запросы подписываются с client secret + access token secret.

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

на oauth-1.0 a позволяет подписывать ваши запросы в узел.js и в клиентском javascript. Вам все равно нужно выполнить шаги oauth из вашего приложения, библиотека поможет вам только с подписанием.

код

я тестировал Step 1 из браузера javascript и Upwork не поддерживают этот сценарий. Если я отправляю обычный запрос POST с ajax, он возвращает " Access-Control-Allow-Originerror. And if I try this request usingJSONP', Upwork отвечает с ошибкой 404.

так нет JSONP поддержка api/auth/v1/oauth/token/request конечной точки.

шаги 1-3 должны выполняться с использованием серверной стороны (в любом случае аутентификация на стороне клиента будет небезопасной).

вот как выглядит запрос маркера (Step 1):

oauthTest.step1_tempToken = function() {
    var request_data = {
        url: 'https://www.upwork.com/api/auth/v1/oauth/token/request',
        method: 'POST',
        data: {}
    };
    request({
        url: request_data.url,
        method: request_data.method,
        form: oauthTest.oauth.authorize(request_data) // no token yet
    }, function(error, response, body) {
        var data = qs.parse(body);
        console.log(data);
    });
};

полный код здесь.

обратите внимание, что Upwork имеет библиотека nodejs, но я не использовал его только для того, чтобы делать все вручную. Запросы подписываются с помощью oauth-1.0 a.

на Step 2 выполняется в браузере, здесь вы просто открываете url как'https://www.upwork.com/services/api/auth?oauth_token=xxx ' и получите верификатор oauth. В сценарии реальной жизни ваше приложение будет указывать