1

使用Symfony Mercure,我想发送一个 cookie 授权:

我用这个命令启动我的 Mercure 服务器:

mercure/mercure.exe --jwt-key='...jwtToken...' --addr='localhost:3000' --allow-anonymous --cors-allowed-origins='https://127.0.0.1:8000'

这就是我尝试发送 Cookie 的方式withCredentials: true

const url = new URL('http://localhost:3000/.well-known/mercure')
url.searchParams.append('topic', 'https://bubble.com/message')

const eventSource = new EventSource(url, { withCredentials: true })

在我当前的页面https://127.0.0.1:8000/message中,在控制台中,我可以看到 cookie:

设置cookie:mercureAuthorization = ...cookieValue ...; 路径=/.well-known/mercure; 安全的; 仅限http;同一地点=松懈

但是 cookie 永远不会被发送。在我的控制台的网络选项卡中,我可以看到事件源请求http://localhost:3000/.well-known/mercure?topic=https%3A%2F%2Fbubble.com%2Fmessage,但从未传输过 cookie。

我尝试更改secure=falseand samesite=none,但从未传输过 cookie。

以下是来自事件源请求(Mercure Hub)的信息:

在此处输入图像描述

4

1 回答 1

1

我最近花了几个小时让它在 Chrome 下工作(在 Firefox 中,我在创建和发送 cookie 时没有任何问题):

  • 反应:127.0.0.1:3000
  • Symfony API:127.0.0.1:8000
  • 美居:127.0.0.1:5000

请注意,我无法使用 Localhost 地址使其工作(未设置/发送 cookie 以进行身份​​验证):

  1. 运行 Mercure 并为 Front App 分配来源(而不是“*”):
mercure --jwt-key=aVerySecretKey --addr=127.0.0.1:5000 --allow-anonymous --cors-allowed-origins=http://127.0.0.1:3000
  1. 在 React 中,请设置 Rest Api 地址:
REACT_APP_SERVER_ROOT=http://127.0.0.1:8000 
  1. 在 Symfony 中设置如下配置:
###> MERCURE_JWT_KEY ###
MERCURE_JWT_KEY=aVerySecretKey
###< MERCURE_JWT_KEY ###

###> symfony/mercure-bundle ###
MERCURE_PUBLISH_URL=http://127.0.0.1:5000/.well-known/mercure
MERCURE_JWT_TOKEN=your_secret_jwt_token
###< symfony/mercure-bundle ###
  1. 在 Symfony 中创建 CookieGenerator 并生成 Cookie,如下所示:
    $token = (new Builder())
    ->withClaim(
        'mercure',
         //Using UserId will help to define the targets on publish action
         ['subscribe' => ["http://127.0.0.1/user/{$user->getId()}"]]
    )
    ->getToken(new Sha256(), new Key($this->secret));

    //ATT: As you work in local environment Localhost, path needs to be '' 
    //otherwise Chrome won't setup the cookie. In Firefox this seems not to be a problem
    return Cookie::create('mercureAuthorization', $token, 0, '');
    //THIS WONT WORK: return Cookie::create('mercureAuthorization', $token, 0, '/.well-known/mercue');
  1. 最后在 React 中放置一个 eventSource,它将发送自动创建的 Cookie - 请记住添加 {withCredentials: true}
     // URL is a built-in JavaScript class to manipulate URLs
     const url = new URL('http://127.0.0.1:5000/.well-known/mercure');
     url.searchParams.append('topic', 'http://127.0.0.1/your_topic/{id}') ;

     const eventSource = new EventSource(url, {withCredentials: true});
     eventSource.onmessage = event => {
         console.log(JSON.parse(event.data));
     }

希望这对您有用并为您节省一些时间。

于 2020-04-20T10:57:54.370 回答