客户端证书javascript请求

时间:2017-10-31 13:23:31

标签: javascript reactjs firefox nginx client-certificates

我们正在开发一个带有python烧瓶后端的反应应用程序。通常它一切正常,但是当它放在具有客户端证书要求的服务器后面时它几乎可以工作。它在Chrome中运行良好,而不是在Firefox中运行。

在浏览器中输入网址时会发送证书,在发出反应请求时不会发送该证书。

  1. 主要请求完成,页面显示。
  2. 加载页面时向后端发出请求,/ backend / version。
  3. 该请求失败,nginx说
  4. 
    
    <html>
    <head><title>400 No required SSL certificate was sent</title></head>
    <body bgcolor="white">
    <center><h1>400 Bad Request</h1></center>
    <center>No required SSL certificate was sent</center>
    <hr><center>nginx/1.10.3</center>
    </body>
    </html>
    &#13;
    &#13;
    &#13;

    1. 当我打开devtools并粘贴相同的url时,它工作正常。客户端证书由浏览器发送。
    2. 我们如何提出请求:

      const fetchVersion = () => (dispatch, getState) => {
        return dispatch({
        [CALL_API]: {
          endpoint: `${API_ROOT}/version`,
          method: 'GET',
          headers: {
            "Authorization": authHeader(),
          },
          types: [FETCH_VERSION_REQUEST,
            {
              type: FETCH_VERSION_SUCCESS,
              payload: (action, state, res) => {
                const contentType = res.headers.get('Content-Type');
                if (contentType && ~contentType.indexOf('json')) {
                  return res.json().then(json => json.response);
                }
              },
            },
            {
            type: FETCH_VERSION_FAILURE,
            meta: (action, state, res) => checkIfInvalidToken(action, state, res, dispatch),
          }
          ],
        },
      });
      };
      

      缺少什么?为什么Firefox不会像Chrome那样将证书附加到请求中?

1 个答案:

答案 0 :(得分:1)

您可以通过明确指定[CALL_API].credentialsinclude来尝试查看问题是否已解决

根据the documentation 默认值为omit,但firefox需要include始终发送Cookie,即使是跨域调用也是如此。

关于您问题中的示例,代码可能会变成:

  [CALL_API]: {
    endpoint: `${API_ROOT}/version`,
    credentials: 'include',
    method: 'GET',
    headers: {
      "Authorization": authHeader(),
    },
...and so on

在纯粹具有实验目的的实验室中,我认为我已经复制了您在Chrome和Firefox中报告的类似行为,在本实验中,credentials: 'include'解决了问题:video available here