Частные каналы с Pusherapp (с использованием Rails) - PullRequest
4 голосов
/ 23 февраля 2011

Я только что прошел через привет мир для Pusherapp.Теперь я хочу создать частные каналы, чтобы пользователи могли только читать сообщения, которые они должны читать.

Документы Pusher дают только некоторые подробности о том, как это сделать, и я в некотором роде потерян.

Из документов :

... Библиотека Pusher JS возвращает socket_id при подключении к Pusher.

При попытке подписаться начастный канал, он отправляет обратно AJAX-запрос на ваш сервер с параметрами channel_name и socket_id в качестве параметров.

URL-адрес по умолчанию для этого http://yourserver.com/pusher/auth. ...

class PusherController < ApplicationController
  def auth
    if current_user
      response = Pusher[params[:channel_name]].authenticate(params[:socket_id])
      render :json => response
    else
      render :text => "Not authorized", :status => '403'
    end
  end
end

Учитывая уникальный идентификатор пользователя (current_user.id), как я могу аутентифицировать этого пользователя, чтобы он / она подписался на соответствующий канал?

Спасибо

1 Ответ

10 голосов
/ 24 февраля 2011

Этот пост в блоге о реализации, кажется, объясняет вещи немного больше: https://pusher.com/docs/client_api_guide/client_private_channels

Схема авторизации основана на идея, что, а не реализация пользовательского пользователя аутентификация и добавление сложности и заявить, чтобы подтолкнуть, мы должны доверять существующий уровень аутентификации предложенный вашей заявкой. Мы тоже хотел убедиться, что кто-то читает данные, отправленные из вашей заявки на браузер не сможет подключиться на канал в качестве этого пользователя, и поэтому не может включать в себя какие-либо секреты на странице HTML.

Похоже, что бизнес-логика вашего приложения должна аутентифицировать пользователя и решить, что он должен получить доступ к частному каналу.

Их диаграмма показывает:

enter image description here

После проверки подлинности приложение запрашивает подписку пользователя. Pusher отвечает с помощью socket_id. Затем они подключаются с помощью этого.

Вот как они это описывают:

Как показано на этой диаграмме, уникальный Идентификатор сокета генерируется и отправляется браузер от Pusher. Это отправлено ваше приложение (1) через AJAX запрос, который разрешает пользователю доступ к каналу против вашего существующая система аутентификации. Если успешно ваше приложение возвращает строка авторизации для браузера подписал с тобой секрет пушера. Это отправлено Pusher через WebSocket, который завершает авторизацию (2) если строка авторизации совпадает.

Пример внизу поста в блоге уточняет:

Предположим, у вас есть канал с именем project-3, к которому у пользователей A и B есть доступ, но нет C. Вы хотели бы сделать этот канал частным, чтобы пользователь C не мог прослушивать частные события. Просто отправьте события в private-project-3 и подпишитесь на него в браузере. Пока вы используете последний javascript (версия 1.3 или выше), вы увидите, что к вашему приложению делается запрос POST к / pusher / auth. В настоящее время это не удастся, и поэтому запрос на подписку не будет сделан для сокета.

Итак, для меня это звучит так: 1) Запрос на подписку отправляется в Pusher 2) Нажмите POST для вашего метода / auth, чтобы определить, может ли пользователь получить доступ к каналу. 3) Если ваша бизнес-логика позволяет пользователю получить доступ к этому каналу, метод auth возвращает ответ «ok»:

auth = Pusher[params[:channel_name]].socket_auth(params[:socket_id])

    content_type 'application/json'
    return JSON.generate({
      :auth => auth
    })

Я не использовал сам Pusher, но его модель, похоже, отражает структуру других моделей на основе push. Надеюсь, это поможет!

...