Как отформатировать signedUserToken для синча?

Я пытаюсь интегрировать Sinch в свое веб-приложение ROR, и у меня возникают трудности с форматированием подписанного UserToken для запуска 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». Таким образом, доступ к источнику «http://localhost:3000» запрещен. В ответе был код состояния HTTP 500.

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

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

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


person Dorkside    schedule 07.02.2015    source источник
comment
Не забудьте удалить ключ приложения и секрет из своего поста!   -  person mravca    schedule 08.02.2015
comment
Если вы использовали одно из приведенных ниже решений, отметьте этот ответ как принятый! Или, если у вас есть другое решение, поделитесь им.   -  person mravca    schedule 04.05.2015


Ответы (2)


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

'userTicket' : "#{@signedUserTicket}",
person Magnus Lundstedt    schedule 09.02.2015

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

person cjensen    schedule 09.02.2015
comment
Я пробовал всевозможные комбинации вокруг этой проблемы с haml и придерживался своего исходного форматирования, единственного, которое не возвращает недопустимый символ (символ иногда бывает «:» или «&»). - person Dorkside; 10.02.2015