API 需要授权的请求 return CORS 错误

API Requests that need Authorization return CORS error

初始问题

我正在开发一个通过 API 访问数据的 Web 应用程序 (react)。 API 出于开发原因在我本地计算机上的 docker 容器上运行。简单的 GET 请求(通过 axios)让我遇到了 CORS 并发症(...has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.)。

一些研究通过 运行 在另一个容器中的 nginx 反向代理解决了我的问题。我基本上使用 this configuration 作为 nginx 服务器。

新问题

随着我构建应用程序的进展,我需要将 JWT 发送到 API 以访问和更改一些条目。需要再次发送 JWT 的请求会收到 CORS 错误消息。

API 检查 JWT 签名(RS256 生成)。我只需要将它转发到 API 服务器。

ALSO:来自控制台的 JWT 的简单 curl 请求正在运行。

配置


const axiosConfig = {
    responseType: "json",
    withCredentials: false,
    mode: "no-cors",
    headers: {
        'Access-Control-Allow-Origin': "*",
        'Access-Control-Allow-Credentials': true,
        'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE,PATCH,OPTIONS',
        'Content-Type': 'application/json',
        'Authorization': 'Bearer <JWT as string>',
    },
};

const apiGetRequest = async (route, callback) => {
    try {
        const apiUrl = URL + route;
        axios.get(apiUrl, {
            axiosConfig
        })
            .then(res => {
                callback(res);
            })
            .catch(function (error) {
                console.log(error);
            });

    } catch (error) {
        console.log(error);
    }
}
version: "3.9"

services:

    db:
        image: mariadb:latest
        container_name: db
        env_file:
            - ./mariadb/.env
        volumes:
            - ./mariadb/create-schema-docker.sh /docker-entrypoint-initdb.d
            - db-data:/var/lib/mysql
        ports:
            - 3306:3306

    rest:
        image: mds4ul/station-registry:latest
        container_name: api
        environment:
            - DB_HOST=db
            - CONTEXT_PATH=api
        env_file:
            - ./rest/.env
        depends_on:
            - db
        ports:
            - 80:8080

volumes:
    db-data:

问题

  1. 为什么需要 jwt 的请求会出现 CORS 错误,而不需要 jwt 的请求却不会?
  2. 我必须更改哪一部分才能使这项工作正常进行?

所以回答另一个问题来解决我的一个令人尴尬的简单问题。

我切换到具有以下配置的 express.js 代理服务器:

const express = require('express')
const app = express()
const axios = require('axios')
const cors = require('cors')
var bodyParser = require('body-parser')

app.use(cors({
    origin: '*'
}))
app.use(bodyParser.json())

require('dotenv').config()

const headers = {
    "X-Authorization": <token>,
}

app.get(':endpoint([\/\w\.-]*)', function (req, res) {
    const endpoint = (process.env.API_BASE_URL).replace(/\/$/, "") + req.params.endpoint;
    axios.get(endpoint, { headers }).then(response => {
        res.json(response.data)
    }).catch(error => {
        res.json(error)
    })
})
app.listen(3001)

我想我只是无法弄清楚这个用例的 nginx 配置。因此 express.js 我现在可以访问需要授权的资源。