1

我正在使用基于令牌的 lambda 授权器,如下所述: https ://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html

现在我仍在使用标题道具所在的玩具示例tokenHeader

我的获取如下:

export function logout() {
    return (dispatch, getState) => {
      return fetch('https://account-api.example.com/v1/logout', {
        method: 'GET',
        headers: {
          'Access-Control-Request-Method': 'GET',
          'Access-Control-Request-Headers': 'Content-Type, Authorization',
          'Content-Type': 'application/json',
          'tokenHeader':'allow',
        },
        credentials: 'include'
      })
        .then((response) => {
          return response.json().then((body) => {
            return {
              status: body.statusCode,
              payload:body.payload,
            };
          },
          );
        })
        .then((response) => {
          console.log("response", response)
          if (response.status !== 200) {
            dispatch({ type: 'LOGOUT_ERROR', payload: response.payload.error});
          }
          if (response.status === 200) {
            dispatch({ type: 'LOGOUT_SUCCESSFUL', payload: response.payload });
          }
        })
        .catch(error => {
          dispatch({ type: 'LOGOUT_FAILED', payload: String(error)});
        })
    };
  }

当我查看网络选项卡时'tokenHeader':'allow',我的请求中缺少标头,导致授权方发出 401 - 我需要做些什么来防止此标头被剥离?

请求缺少 tokenHeader 标头

旁注:此请求适用于邮递员

API 网关配置(不确定这是否相关):

选项
请求 选项方法请求 响应 选项集成响应

获取
请求 GET 方法请求 响应 获取集成响应

我不想忽略 CORS 并在两者之间发送数据account-api.example.comdev.example.com所以请不要回答指示删除/忽略 cors——我的目标是正确实现 cors。

4

2 回答 2

1

问题中的详细信息显示自定义标头未在 CORS 预检OPTIONS请求中发送。这是意料之中的——您在前端代码中设置的任何自定义标头都不会包含在 CORS 预检OPTIONS请求中。你无法阻止这种行为。

所以底线是:如果您使用的身份验证机制依赖于将特定标头添加到请求中,您需要将服务器配置为不要求OPTIONS请求的自定义标头 - 因为 CORS 协议要求服务器允许OPTIONS未经任何身份验证的请求.

更详细地说,正在发生的事情是这样的:

  1. 您的代码告诉您的浏览器它想要发送带有自定义tokenHeader标头的请求。
  2. 您的浏览器说,好的,带有tokenHeader标头的请求要求我进行 CORS 预检OPTIONS以确保服务器允许带有tokenHeader标头的请求。
  3. 您的浏览器将不带headerOPTIONS的请求发送到服务器,因为检查的全部目的是查看是否可以包含该 header。tokenHeaderOPTIONS
  4. 您的服务器看到OPTIONS请求,但不是以表明它允许tokenHeader请求中的标头的方式响应它,而是使用 401 拒绝它,因为它缺少标头。
  5. 您的浏览器期望 CORS 预检得到 200 或 204 响应,但得到的是 401 响应。因此,您的浏览器会停在那里,并且永远不会尝试GET来自您的代码的请求。
于 2019-11-15T04:32:30.770 回答
-1

您可能需要对 AWS 控制台执行此方法

https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html

于 2019-11-14T22:33:17.503 回答