簡體   English   中英

帶有Ruby HTTParty的RingCentral OAuth僅服務器密碼流

[英]RingCentral OAuth Sever-Only Password Flow with Ruby's HTTParty

我目前正在嘗試為RingCentral編寫數據提取應用程序,以將CSV轉儲到AWS作為數據倉庫項目的一部分。 我已經閱讀了他們的文檔中的一些內容,概述了如何使用密碼流進行身份驗證,但是根據此處文檔中的示例,似乎缺少了一些內容。

在“密碼流”下面列出的示例中,有一個身份驗證標頭從未被提及,並且所包含的值被作者憑空拿出,然后在其下面的身份驗證步驟中從未提及。 我可以驗證我的應用程序是否滿足“讀取呼叫日志”范圍的“僅服務器專用”要求。 以下是我的設置的屏幕截圖:[鏈接到圖像,因為我的信譽不足...呃] [2]

使用沙盒憑據和端點進行開發,這是到目前為止我嘗試過的工作:

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導致與當前應用程序中非常重要的gem發生依賴關系沖突,因此我們必須為此數據源編寫新的Auth代碼。

在這一點上我迷路了。 我已經充分驗證了我的密鑰,用戶名和密碼是否正確。 我已將username電話號碼值包含在內,以進行格式化檢查。 我基本上只剩下兩個我無法回答的問題:

1)我是否正確地批准了? 我是否為此應用程序選擇了正確的角色和權限? 我需要使用不同的“身份驗證流程”和“隱私”設置來創建一個新的嗎?

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_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"]}>

此錯誤表明有兩件事,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的任何想法或想法,將不勝感激。 我寧願執行刷新,而不是一遍又一遍地重新驗證。

令人沮喪的是,RingCentral Ruby SDK的文檔中沒有記錄這些令牌刷新的方法,並且含糊地提到了有關“手動刷新”的內容。 我的要求或SDK的任何想法或想法,將不勝感激。 我寧願執行刷新,而不是一遍又一遍地重新驗證。

令牌刷新位於/docs/docs文件夾中的詳細文檔中,並且還發布在Ruby SDK的Read the Docs上 我將使這些文檔更加明顯。

可在此處找到文檔的令牌刷新部分:

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

關於呼叫日志請求,您可以直接使用帶有以下API調用的SDK進行請求。

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

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

對於accountIdextensionId路徑參數,可以使用~指示當前登錄用戶的帳戶和擴展名。 如果要指定accountIdextensionId ,請注意這些是后端ID值,並且與用戶撥打的主要公司電話號碼或extensionNumber不對應。 您可以通過調用account/~/extension API端點來檢索已登錄用戶的accountIdextensionId

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM