我目前正在尝试为 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"]}>
我试过谷歌搜索错误代码 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_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 Developer Portal 为我的应用程序复制了沙箱编号,无论是否添加,都+
发生了同样的错误,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 的任何想法或想法将不胜感激。我宁愿执行刷新而不是一遍又一遍地重新验证。