Как отформатировать подписанный пользовательский токен для синча?
Я пытаюсь интегрировать 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,