如何格式化sinch的signedUserToken?

如何格式化sinch的signedUserToken?,sinch,Sinch,我正在尝试将Sinch集成到我的ROR webapp中,但在格式化signedUserToken以启动Sinch客户端时遇到了一些困难。 以下是我使用haml的观点: #{@signedUserTicket} %script{src: "//cdn.sinch.com/latest/sinch.min.js", type: "text/javascript"} = javascript_tag do $(function(){ $sinchClient = new SinchCl

我正在尝试将Sinch集成到我的ROR webapp中,但在格式化signedUserToken以启动Sinch客户端时遇到了一些困难。 以下是我使用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
类SinchController{“类型”=>“用户名”,“端点”=>username},
“expiresIn”=>3600,
“applicationKey”=>applicationKey,
“已创建”=>Time.now.utc.iso8601
}
userTicketJson=userTicket.to_json
userTicketBase64=Base64.strict_encode64(userTicketJson).chop
digest=digest::HMAC.digest(Base64.decode64(applicationSecret),userTicketJson,digest::SHA256)
签名=Base64。严格编码64(摘要)。印章
@signedUserTicket=(userTicketBase64+':'+签名)。删除('='))
结束
结束
但现在我面临以下错误:

POST 500(内部服务器错误) 客户端:1 XMLHttpRequest无法加载。请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“http://localhost:3000”。响应的HTTP状态代码为500

(localhost之前的空间是由于SO上的新用户限制造成的)

我在rails服务器中添加了Rack::Cors,以便在跨域请求来自我自己的请求的情况下尝试并允许跨域请求,但无论我尝试了什么配置,请求似乎从来没有包含正确的头。 我是否误解了CORS的要求?问题是否来自sinch.min.js生成的请求

问候,,
詹姆斯

我不认识哈姆,但不应该认识他 “用户票证”:“{@signedUserTicket}”,
be'userTicket':@signedUserTicket,

错误消息是由于Firefox base64解码器无法解码令牌,原因是base64字符集中没有符号(如@)。这表明该票据实际上没有传递到start(),该行可能不正确

'userTicket' : "#{@signedUserTicket}",

别忘了从帖子中删除你的应用程序密钥和密码!如果您使用以下解决方案之一,请将该答案标记为已接受!或者,如果您有不同的解决方案,请与我们分享。我尝试了围绕haml问题的各种组合,并坚持我的原始格式,这是唯一一种不会返回无效字符(字符有时是“:”或“&”)的格式。