1

sessionこのように、Mojolicious::Lite で websocket リクエスト内にアクセスする方法はありますか?

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
    }
  );
};

ヒントはありますか?

4

1 に答える 1

0

署名された 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...
        }
      );
于 2012-10-11T09:47:56.407 に答える