Как отформатировать подписанный пользовательский токен для синча?

Я пытаюсь интегрировать Sinch в мое веб-приложение ROR, и у меня возникают трудности с форматированием подписанного пользовательского токена для запуска sinchClient. Вот мой взгляд, используя хамл:

#{@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". Источник 'http:// localhost:3000', следовательно, не имеет доступа. Ответ имеет HTTP-код состояния 500.

(пространство перед localhost связано с новыми пользовательскими ограничениями на SO)

Я добавил Rack::Cors на свой сервер rails, чтобы попытаться разрешить междоменные запросы, если они исходят от моих собственных запросов, но, как бы я ни пытался сконфигурировать конфигурацию, кажется, что запрос никогда не содержит правильных заголовков. Я неправильно понимаю запросы CORS? Проблема возникает из запросов, генерируемых sinch.min.js?

С уважением, Джеймс

2 ответа

Сообщение об ошибке вызвано тем, что декодер Firefox base64 не может декодировать токен из-за символов (таких как @), которых нет в наборе символов base64. Это говорит о том, что билет на самом деле не передан в start(), и эта строка может быть неправильной;

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

Я не знаю HAML, но не должен 'userTicket': "#{@signatureUserTicket}", быть 'userTicket': @signedUserTicket,

Другие вопросы по тегам