1

我正在尝试将 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 生成的请求?

问候,詹姆斯

4

2 回答 2

2

错误消息是由于 Firefox base64 解码器无法解码令牌,因为符号(例如 @)不在 base64 字符集中。这表明ticket实际上没有传递给start(),并且这行可能是不正确的;

'userTicket' : "#{@signedUserTicket}",
于 2015-02-09T12:11:43.930 回答
1

我不知道 HAML 但不应该 'userTicket' : "#{@signedUserTicket}" 是 'userTicket' : @signedUserTicket,

于 2015-02-09T10:33:12.547 回答