访问控制允许凭据错误--nodejs

Posted

技术标签:

【中文标题】访问控制允许凭据错误--nodejs【英文标题】:Access-Control-Allow-Credentials error -- nodejs 【发布时间】:2019-12-13 10:51:27 【问题描述】:

我收到了 cors 错误。我错过了什么吗?下面是我拥有的代码和我得到的错误。

应用信息

使用无服务器 npm === 将后端上传到 lambda,它创建了 api-gateway。

Mongodb 托管在 aws-ec2 实例上。

前端/React 托管在 s3 存储桶上。

非常感谢!

Access to fetch at '[node.js api-url, which is hosted on api-gateway/lambda]' from origin '[front-end react-url, which is hosted on aws-s3 bucket]' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Credentials' header in the response is 'false' which must be 'true' when the request's credentials mode is 'include'.

Node.js 代码:

db.initialize();
initAxios(defaults);

const app = express();
if (process.env.ENV === 'production') 
  app.server = https.createServer(config.sslOptions, app);
 else 
  app.server = http.createServer(app);


app.use(cookieParser());

app.use(bodyParser.json());
app.use(bodyParser.urlencoded(
  extended: true,
));

app.use(expressSession(
  secret: process.env.JWT_SECRET_KEY,
  resave: true,
  saveUninitialized: true,
));

app.use(passport.initialize());
app.use(passport.session());


var corsOptions = 
  origin: function (origin, callback) 
    callback(null, true)
  ,
  credentials: true





app.use(cors(corsOptions));


// I added the below part so maybe it would work but it didn't :)
app.use(function(req, res, next) 
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
);
// I added the above part so maybe it would work but it didn't :)

app.use(morgan('combined', 
  stream: logger.stream
));

app.use(`/api/v$process.env.API_VERSION`, router);

前端反应代码:

export async function login(data) 

  return fetch(`[api-url]auth/login`, 
    method: 'POST',
    headers: 
      'Content-Type': 'application/json'
    ,
    credentials: 'include',
    // credentials: 'same-origin',
    body: JSON.stringify(
      username: data.username,
      password: data.password,
    ),
  )
    .then((response) => 
      return response.json()
    )
    .then(onSuccess)
    .catch(onFail)

之前是这样的:

app.use(cors(
  credentials: true,
  origin: true,
));

所以我转换成:

app.use(cors(corsOptions));

app.use(function(req, res, next) 
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
);

谢谢!

【问题讨论】:

【参考方案1】:

您的 API 端点是 API 网关,而不是 Lambda,因此您需要在实际网关上启用 CORS。

有多种方法可以做到这一点,但如果您使用无服务器框架进行部署,有一个非常好的启用 CORS 的教程here。

当你在 serverless.yml 中描述你的函数端点时,快速而肮脏的方法就是在 'events: -http:' 下添加 'cors: true'。

例子:

events:
  - http:
      path: product
      method: post
      cors: true

【讨论】:

我刚刚检查它已经启用:functions: app: handler: index.run events: - http: path: / method: ANY cors: true @MuhammadUsman 您是否在请求中使用 cookie 或某种形式的身份验证? @K Mo 不,但要确认我是否在 nodejs 代码中检查?但我正在使用会话:``` app.use(expressSession( secret: process.env.JWT_SECRET_KEY, resave: true, saveUninitialized: true, )); // 初始化 Passport 并从会话中恢复身份验证状态(如果有)。 app.use(passport.initialize()); app.use(passport.session()); ``` 您是否按照我的链接中的教程中的建议将标题“Access-Control-Allow-Origin”:“*”和“Access-Control-Allow-Credentials”添加到您的回复中回答? 我添加了这个:``` app.use(function(req, res, next) res.header("Access-Control-Allow-Origin", "*"); res.header ('Access-Control-Allow-Credentials', true); next(); ); ```

以上是关于访问控制允许凭据错误--nodejs的主要内容,如果未能解决你的问题,请参考以下文章

预检访问控制允许凭据

CORS $.ajax 会话 cookie(访问控制允许凭据和 withCredentials=true)

S3:AJAX POST 没有“访问控制允许来源”

捕获“访问控制允许来源不允许来源”错误

HTTP响应标头中“允许”和“访问控制允许方法”之间的区别?

即使在设置时也出现访问控制允许来源问题