署名された 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...
}
);