redux - 无法使用 axios 进行 post 请求,返回未经授权的 401 错误
问题描述
我使用 Redux、React 和 Node 从头开始创建了一个身份验证服务。一切正常,直到我将我的 Post 部分或 redux 连接到我的后端。我猜redux部分还可以。我的问题是当我发送授权承载令牌时。我可以使用失眠发帖。但是当我尝试使用网络应用程序发布时,我不能。这是我的行动:
export const createPost = ( formValues: any) => async(dispatch: any, getState: any) => {
const { userId } = getState().auth;
let token = userId
const headers = {
header: {
'Content-Type' : 'application/json',
'Accept' : 'application/json',
Authorization: `Bearer ${token}`
}
};
const response = await AlleSys.post('/posts', {...formValues, headers})
// dispatch({type: CREATE_POST, payload: response.data})
userId 是我的 JWT 令牌。
我已经在我的后端设置了 Cors
const corsOptions ={
origin:'http://localhost:3000',
credentials:true, //access-control-allow-credentials:true
optionSuccessStatus:200
}
app.use(cors(corsOptions))
在失眠时,我使用的是与我的应用程序相同的不记名令牌,所以问题不在于 JWT。
解决方案
从 Nodejs 服务器或 Insomnia 使用 GET、POST、PUT、DELETE 查询端点将导致在检查 OPTIONS 之前调用。
但是浏览器会将 HTTP 请求限制在同一个域中,这会使您遇到 CORS 问题。由于 Insomnia 不是浏览器,而 CORS 只是浏览器安全限制,因此它没有受到限制。
从您正在使用的 CORS 的文档中:
某些 CORS 请求被认为是“复杂的”并且需要初始 OPTIONS 请求(称为“飞行前请求”)。“复杂”CORS 请求的一个示例是使用除 GET/HEAD/POST 之外的 HTTP 动词(例如 DELETE)或使用自定义标头的请求。要启用预飞行,您必须为要支持的路线添加一个新的 OPTIONS 处理程序:
所以我认为你应该在所有路由之前包含 app.options('*', cors()) 并将其放在文件顶部以首先处理。
推荐阅读
- java - 如何判断一段java代码是否是heap-allocation-free的?
- twilio - 无论实际结果如何,Twilio 始终返回“进行中”
- python - 如何在 python 测试中模拟 subprocess.check_call 异常
- flex-lexer - 设置 %option prefix= 时如何让 automake 识别 flex 生成的非默认文件名
- regex - 如何在标题右侧正则表达式匹配(删除)任意一系列以逗号分隔的两字母语言代码?
- python-3.x - 字典列表:合并、排序和挑选前 (n) 个条目
- sql - 如果不存在,则将 Table1 中的数据插入到 Table2 中,否则更新 table2 中的数据以匹配 Table1。在任何一种情况下,从 Table1 中删除
- asp.net-core - 错误 MSB3644:找不到框架“.NETFramework,Version=v5.0”的参考程序集
- parsing - 找出调用哪个命令的有效方法?
- sql - MS-Access - 根据条件合并两个表之间的数据