我正在尝试将 Sinch 集成到我的 ROR webapp 中,并且在格式化 signedUserToken 以启动 sinchClient 时遇到了一些困难。这是我的观点,使用 haml :
#{@signedUserTicket}
%script{src: "//cdn.sinch.com/latest/sinch.min.js", type: "text/javascript"}
= javascript_tag do
$(function(){
$sinchClient = new SinchClient({
applicationKey: 'APP_KEY',
capabilities: {messaging: true, calling: true},
supportActiveConnection: true,
onLogMessage: function(message) {
console.log(message);
},
});
$sinchClient.start({
'userTicket' : "#{@signedUserTicket}",
});
});
无论我尝试在控制器中做什么格式,我最接近成功的是:
DOMException [InvalidCharacterError: "String contains an invalid character"
code: 5
nsresult: 0x80530005
location: http://cdn.sinch.com/latest/sinch.min.js:5]
如果我得到正确的信息并且可以抽出一些时间,我将不胜感激,甚至会构建一个 Rubygem 用于将 Sinch 集成到 Rails 中。
干杯,詹姆斯
编辑 :
我已经尝试了一些修改并且越来越接近(我认为)。InvalidCharacter 的问题来自尾随的 '=',这在 Javascript 中显然不能很好地解码。
我的新控制器现在是:
class SinchController < ApplicationController
skip_before_filter :verify_authenticity_token
before_filter :authenticate_user!
def client
username = current_user.username
applicationKey = "APP_KEY"
applicationSecret = "APP_SECRET_B64"
userTicket = {
"identity" => {"type" => "username", "endpoint" => username},
"expiresIn" => 3600,
"applicationKey" => applicationKey,
"created" => Time.now.utc.iso8601
}
userTicketJson = userTicket.to_json
userTicketBase64 = Base64.strict_encode64(userTicketJson).chop
digest = Digest::HMAC.digest(Base64.decode64(applicationSecret), userTicketJson, Digest::SHA256)
signature = Base64.strict_encode64(digest).chop
@signedUserTicket = (userTicketBase64 + ':' + signature).remove('=')
end
end
但现在我面临以下错误:
POST https://api.sinch.com/v1/instance 500(内部服务器错误)客户端:1 XMLHttpRequest 无法加载https://api.sinch.com/v1/instance。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问 Origin 'http://localhost:3000'。响应的 HTTP 状态代码为 500。
(localhost前面的空格是由于新用户对SO的限制)
我将 Rack::Cors 添加到我的 rails 服务器以尝试允许跨域请求,以防它来自我自己的请求,但无论我尝试什么配置,似乎请求都不会包含正确的标头。我是否误解了 CORS 请求?问题是否来自 sinch.min.js 生成的请求?
问候,詹姆斯