Доступ к сеансу в веб-сокете Mojolicious

Есть ли способ получить доступ к session в запросе веб-сокета в Mojolicious::Lite, например?

get '/' => sub {
  my $self = shift;
  $self->session->{foo} = 'bar';
  $self->render('index');
};

websocket '/ws' => sub {
  my $self = shift;
  $self->on(message =>
    sub {
      my ($self, $msg) = @_;
      my $foo = $self->session->{foo}; # <<<<< is actually empty
    }
  );
};

Любые подсказки?


person agranig    schedule 27.09.2012    source источник
comment
У меня тоже были проблемы с этим. Я не уверен, что это возможно. Возможно, сообщить об ошибке в трекере?   -  person Joel Berger    schedule 10.10.2012
comment
Я уже спрашивал в их списке рассылки, прежде чем опубликовать это здесь, но так и не получил ответа. В итоге я сохранил подписанное значение cookie в скрытом div, а затем отправил его вместе с каждым сообщением WS как часть протокола. В обработчике сообщений я проверяю наличие значения cookie, проверяю его подпись, а затем декодирую base64 и использую его как обычно.   -  person agranig    schedule 11.10.2012


Ответы (1)


В итоге я сохранил подписанное значение cookie в скрытом div, а затем отправил его вместе с каждым сообщением WS как часть «протокола». В обработчике сообщений я проверяю наличие значения cookie, проверяю его подпись, а затем декодирую его с помощью base64 и использую как обычно, вот так:

    sub decode_cookie {
      my ($self, $cookie_val) = @_;
      my $json = Mojo::JSON->new();
      my $secret = $self->stash->{'mojo.secret'};
      if ($cookie_val =~ s/--([^\-]+)$//) {
        my $sig = $1;
        #app->log->debug("cookie=".$cookie_val);
        #app->log->debug("sig=".$sig);
        my $check = Mojo::Util::hmac_sha1_sum $cookie_val, $secret;
        unless(Mojo::Util::secure_compare $sig, $check) {
          app->log->warn("invalid session cookie signature");
          return;
        }
      } else {
          app->log->warn("failed to extract cookie value");
          return;
      }
      my $session = $json->decode(Mojo::Util::b64_decode($cookie_val));
      unless($session) {
          app->log->warn("failed to b64-decode session cookie");
          return;
      }
      return $session;
    }

    websocket '/rtc' => sub {
      my $self = shift;
      my $json = Mojo::JSON->new;

      $self->on(message =>
        sub {
          my ($self, $data) = @_;
          app->log->debug("received WS message: ".$data);
          $data = $json->decode($data);

          my $session = decode_cookie($self, $data->{cval});
          # do whatever you have to here...
        }
      );
person agranig    schedule 11.10.2012