Поток паролей RingCentral OAuth только для сервера с HTTParty Ruby

В настоящее время я пытаюсь написать приложение для извлечения данных для RingCentral, чтобы сбрасывать CSV на AWS в рамках проекта хранилища данных. Я просмотрел несколько частей их документации, описывающих, как пройти аутентификацию с помощью потока паролей, но, судя по их примерам в документации здесь.

В примере, указанном в разделе «Поток паролей», есть заголовок проверки подлинности, который никогда не упоминается, а включенное значение взято автором из ничего, а затем никогда не упоминается в шагах проверки подлинности ниже. Я могу подтвердить, что мое приложение соответствует частным требованиям только для сервера с областью действия «Чтение журналов вызовов». Ниже приведен скриншот моих настроек: [Ссылка на изображение, потому что у меня недостаточно репутации...тьфу][2]

Используя учетные данные и конечную точку Sandbox для разработки, вот что я пробовал до сих пор:

url = 'https://platform.devtest.ringcentral.com/restapi/oauth/token'
headers = {'Content-Type'=>'application/x-www-form-urlencoded'}
body = {:grant_type=>"password", :username=>"13133982093", :password=><OUR_SANDBOX_PASSWORD>}
resp = HTTParty.post(url, headers: headers, body: URI.encode_www_form(body))

Печатный ответ:

#<HTTParty::Response:0x7ff29588a420 parsed_response={"error"=>"invalid_client", "error_description"=>"Invalid client: ", "errors"=>[{"errorCode"=>"OAU-153", "message"=>"Invalid client: ", "parameters"=>[{"parameterName"=>"client_id", "parameterValue"=>""}]}]}, @response=#<Net::HTTPBadRequest 400 Bad Request readbody=true>, @headers={"server"=>["nginx/1.10.2"], "date"=>["Tue, 20 Jun 2017 22:05:36 GMT"], "content-type"=>["application/json;charset=utf-8"], "transfer-encoding"=>["chunked"], "connection"=>["close"], "x-application-context"=>["application:8080"], "content-language"=>["en"], "www-authenticate"=>["Bearer realm=\"RingCentral REST API\", error=\"invalid_client\", error_description=\"Invalid client: \""], "rcrequestid"=>["96aaacb0-5604-11e7-97a9-005056bb594d"], "aceroutingkey"=>["sjc11-c01-ace01.c83d65c2-46d3-11e7-ab8e-005056a73f60"], "x-server-name"=>["sjc06-c01-hlb02"], "x-request-time"=>["0.010"], "x-upstream-server"=>["10.24.22.193:8080"], "x-upstream-status"=>["400"], "x-upstream-htime"=>["0.010"], "x-upstream-rtime"=>["1497996336.573"], "x-upstream-ctime"=>["0.000"], "x-tcpinfo"=>["1000, 500, 10, 28960"], "routingkey"=>["SJC11P01"]}> 

Я пытался найти в Google код ошибки OAU-153, и он полностью недокументирован. Я даже включил такие вещи, как заголовок авторизации, созданный из client_id и client_secret (также известный как app_key и app_secret), например: auth= {'Authorization': "Basic #{ Base64.encode64("#{client_id}:#{client_secret}") }"}

Что было включено в звонок вроде: resp = HTTParty.post(token_url, headers: headers, body: URI.encode_www_form(token_body), auth: auth)

Но это по-прежнему вызывало ту же ошибку, что и выше, с error_description "Invalid Client: " и error_code OAU-153.

Кроме того, из-за требований проекта Ring Central Ruby SDK вызывает конфликты зависимостей с очень важными драгоценными камнями в моем текущем приложении, поэтому нам приходится писать новый код аутентификации для этого источника данных.

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

1) Правильно ли я подхожу к этому? Я выбрал правильные роли и разрешения для этого приложения? Нужно ли мне создавать новый с другими настройками Auth Flow и Privacy?

2) Использую ли я для этого правильные инструменты? Возможно, HTTParty виноват в том, как он отправляет мои запросы? Копание в репозитории не выявило многого за то время, которое я потратил.

РЕДАКТИРОВАТЬ:

Мы внесли изменения в проект, которые позволили нам использовать SDK для аутентификации следующим образом:

client = RingCentralSdk::REST::Client.new do | config |
    config.app_key = ENV['RC_CLIENT_ID']
    config.app_secret = ENV['RC_CLIENT_SECRET']
    config.server_url = @server_url
    config.username = @account_num
    config.password = @password
    config.extension = @extension_id

Затем мы сохраняем информацию о токене в виде хэша, выполнив: token_hash = client.token.to_hash

Пример хеша можно увидеть ниже:

{"token_type"=>"bearer", "refresh_token_expires_in"=>604800, 
 "scope"=>"ReadCallLog", "owner_id"=>[COMPANY's OWNER_ID], 
 "endpoint_id"=>"N0UV835BQ2C_Bz2ofJA1Eg", 
 :access_token=> [REMOVED FOR SECURITY],
 :refresh_token=> [REMOVED FOR SECURITY], 
 :expires_at=>1498081681} 

Однако теперь я не могу выполнить 2 операции: простой аутентифицированный запрос или обновление токена.

Попытка простого запроса call-log:

uri = "https://platform.devtest.ringcentral.com/restapi/v1.0/account/<phone_num_with_pre_+>/extension/101/call-log"
headers = {"Accept"=>"application/json", "Authorization"=> "#{ token_hash[:access_token] }"} 
resp = HTTParty.get(uri, headers: headers)

Такой запрос вызывает у меня ошибку:

 #<HTTParty::Response:0x7fdf2b0ae800 parsed_response={"errorCode"=>"InvalidParameter", "message"=>"Resource for parameter [accountId] is not found", "errors"=>[{"errorCode"=>"CMN-102", "message"=>"Resource for parameter [accountId] is not found", "parameterName"=>"accountId"}], "parameterName"=>"accountId"}, @response=#<Net::HTTPNotFound 404 Not Found readbody=true>, @headers={"server"=>["nginx/1.10.2"], "date"=>["Wed, 21 Jun 2017 21:39:58 GMT"], "content-type"=>["application/json;charset=UTF-8"], "content-length"=>["290"], "connection"=>["close"], "rcrequestid"=>["2b66c9d6-56ca-11e7-b418-005056bb26b9"], "routingkey"=>["SJC11P01PAS02"], "x-error-id"=>["2b66c9d6-56ca-11e7-b418-005056bb26b9"], "content-language"=>["en-US"], "x-rate-limit-group"=>["heavy"], "x-rate-limit-limit"=>["10"], "x-rate-limit-remaining"=>["9"], "x-rate-limit-window"=>["60"]}>

Эта ошибка предполагает 2 вещи: 1) Мой параметр account_id введен неправильно, однако я скопировал номер песочницы непосредственно с портала разработчика RC для своего приложения, как с префиксом +, так и без него, и возникла та же ошибка, 2) Там нет записей call-log, поэтому сервер API считает, что ресурс не существует, и выдает ошибку.

Итак, я думаю, мой вопрос? Как я могу вообще развиваться против этой песочницы, если у меня нет данных для запроса? Есть ли простой способ сделать данные для этой учетной записи?

Попытка обновления потока токена:

ПРИМЕЧАНИЕ. Я просто вхожу в систему каждый раз, когда мне нужен токен в данный момент. Громоздкий, но не ужасный.

Выполните запрос:

uri = "https://platform.devtest.ringcentral.com/restapi/oauth/token"
refresh_headers = {"Accept"=>"application/json", "Content-Type"=>"application/x-www-form-urlencoded", 
                   "Authentication"=>"Basic [BASE64_ENCODED_APP_KEY:APP_SECRET_DELIMITED_COMBO]}
refresh_body = {:grant_type=>"refresh_token", :refresh_token=>"#{token_hash[:refresh_token]}"} 
resp = HTTParty.post(uri, headers: refresh_headers, body: URI.www_encode_form(refresh_body))

Заработать ошибку:

#<HTTParty::Response:0x7fdf3055d8d8 parsed_response={"error"=>"invalid_client", "error_description"=>"Invalid client: ", "errors"=>[{"errorCode"=>"OAU-153", "message"=>"Invalid client: ", "parameters"=>[{"parameterName"=>"client_id", "parameterValue"=>""}]}]}, @response=#<Net::HTTPBadRequest 400 Bad Request readbody=true>, @headers={"server"=>["nginx/1.10.2"], "date"=>["Wed, 21 Jun 2017 22:16:07 GMT"], "content-type"=>["application/json;charset=utf-8"], "transfer-encoding"=>["chunked"], "connection"=>["close"], "x-application-context"=>["application:8080"], "content-language"=>["en"], "www-authenticate"=>["Bearer realm=\"RingCentral REST API\", error=\"invalid_client\", error_description=\"Invalid client: \""], "rcrequestid"=>["3958edb2-56cf-11e7-8758-005056bb26b9"], "aceroutingkey"=>["sjc11-c01-ace01.c83d65c2-46d3-11e7-ab8e-005056a73f60"], "x-server-name"=>["sjc06-c01-hlb01"], "x-request-time"=>["0.000"], "x-upstream-server"=>["10.24.22.193:8080"], "x-upstream-status"=>["400"], "x-upstream-htime"=>["0.000"], "x-upstream-rtime"=>["1498083367.846"], "x-upstream-ctime"=>["0.000"], "x-tcpinfo"=>["1000, 500, 10, 28960"], "routingkey"=>["SJC11P01"]}> 

Плачьте тихо про себя...

:'-(

К сожалению, в документации для RingCentral Ruby SDK нет задокументированного метода обновления этих токенов, и туманно упоминается что-то о «ручном обновлении». Любые идеи или мысли по моим запросам или SDK будут оценены. Я бы предпочел выполнять обновления, а не повторять аутентификацию снова и снова.


person Mitch Main    schedule 20.06.2017    source источник
comment
вот ссылка на скриншот, который не работал snag.gy/rz2X0K.jpg   -  person Mitch Main    schedule 21.06.2017


Ответы (1)


К сожалению, в документации для RingCentral Ruby SDK нет задокументированного метода обновления этих токенов, и туманно упоминается что-то о «ручном обновлении». Любые идеи или мысли по моим запросам или SDK будут оценены. Я бы предпочел выполнять обновления, а не повторять аутентификацию снова и снова.

Обновление токена находится в подробной документации в папке /docs репозитория, а также опубликовано в Ruby SDK. Документы. Я постараюсь сделать эти документы более очевидными.

Раздел документации «Обновление токена» доступен здесь:

http://ringcentral-sdk-ruby.readthedocs.io/en/latest/usage/authorization/Authorization/#token-refresh

Что касается запроса журнала вызовов, вы можете сделать это напрямую с помощью SDK с вызовом API ниже.

client = RingCentralSdk::REST::Client.new do | config |
  # ...
end

client.http.get 'account/~/extension/~/call-log'

Для параметров пути accountId и extensionId вы можете использовать ~, чтобы указать учетную запись и расширение для текущего пользователя, вошедшего в систему. Если вы хотите указать accountId и extensionId, имейте в виду, что это значения внутреннего идентификатора, которые не соответствуют основному номеру телефона компании или extensionNumber, которые набирает пользователь. Вы можете получить accountId и extensionId для вошедшего в систему пользователя, вызвав конечную точку account/~/extension API.

person Grokify    schedule 12.07.2017