未经授权发送 React 请求 header
React request is being sent without an Authorization header
我正在尝试在我的 headers.
中将不记名令牌传递给 fastify http 服务器
我将请求中的 headers 设置为:
...
const headers = {
Accept: 'application/json',
'Content-Type': 'application/json'
}
const token = localStorage.getItem('token')
if (token) {
headers['Authorization'] = `Bearer ${token}`
}
const newOptions = {
...options,
mode: 'no-cors',
headers
}
console.log('options:', newOptions)
return fetch(url, newOptions)
我的 console.log 打印:
options: {
mode: "no-cors",
headers: {
Accept: "application/json",
Content-Type: "application/json",
Authorization: "Bearer NQ9xQLmYtq92aT8JHHRd7DGZJ..."
}
}
在 Chrome 网络选项卡中,我查看了 headers,Authorization
在那里不存在。我的路由处理函数如下:
async function user(server, options) {
server.route({
method: 'GET',
url: '/user/:email',
handler: async (req, res) => {
const username = req.params.email
console.log('user email:', username)
console.log('headers:', req.headers)
res.send({
type: 'promoter'
})
}
})
}
当我在服务器上打印headers时,它也没有Authorization
,显示:
headers: { host: 'localhost:5000',
connection: 'keep-alive',
pragma: 'no-cache',
'cache-control': 'no-cache',
accept: 'application/json',
'sec-fetch-dest': 'empty',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36',
'sec-fetch-site': 'same-site',
'sec-fetch-mode': 'no-cors',
referer: 'http://localhost:3000/admin',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'en-US,en;q=0.9,ru;q=0.8' }
我错过了什么?
另一个有趣的问题是,当我 运行 来自 Postman
的请求时,它显示 200 响应代码,并且 fastify 将 200
打印到日志中。但是,运行ning 来自 saga/request 与:
return fetch(url, newOptions)
.then(checkStatus)
.then(parseJSON)
我在请求方法中得到 response.status
of 0
而不是 200
,而服务器日志仍然显示 "res":{"statusCode":200}
.
尝试将 withCredentials: true
和 credentials: 'include'
添加到您的选项中:
options: {
mode: "no-cors",
withCredentials: true, // <-- ADD THIS
credentials: 'include', // <-- AND THIS
headers: {
Accept: "application/json",
Content-Type: "application/json",
Authorization: "Bearer NQ9xQLmYtq92aT8JHHRd7DGZJ..."
}
}
参考:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials
我知道问题出在哪里了。
显然,我的 Chrome - Version 80.0.3987.106 (Official Build) (64-bit)
版本以及可能的其他浏览器和旧版本的 Chrome,也去掉了 authorization
header , 当它与 no-cors
模式结合使用时。启用 CORS
并设置适当的 header 可以解决问题。
我正在尝试在我的 headers.
中将不记名令牌传递给 fastify http 服务器我将请求中的 headers 设置为:
...
const headers = {
Accept: 'application/json',
'Content-Type': 'application/json'
}
const token = localStorage.getItem('token')
if (token) {
headers['Authorization'] = `Bearer ${token}`
}
const newOptions = {
...options,
mode: 'no-cors',
headers
}
console.log('options:', newOptions)
return fetch(url, newOptions)
我的 console.log 打印:
options: {
mode: "no-cors",
headers: {
Accept: "application/json",
Content-Type: "application/json",
Authorization: "Bearer NQ9xQLmYtq92aT8JHHRd7DGZJ..."
}
}
在 Chrome 网络选项卡中,我查看了 headers,Authorization
在那里不存在。我的路由处理函数如下:
async function user(server, options) {
server.route({
method: 'GET',
url: '/user/:email',
handler: async (req, res) => {
const username = req.params.email
console.log('user email:', username)
console.log('headers:', req.headers)
res.send({
type: 'promoter'
})
}
})
}
当我在服务器上打印headers时,它也没有Authorization
,显示:
headers: { host: 'localhost:5000',
connection: 'keep-alive',
pragma: 'no-cache',
'cache-control': 'no-cache',
accept: 'application/json',
'sec-fetch-dest': 'empty',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36',
'sec-fetch-site': 'same-site',
'sec-fetch-mode': 'no-cors',
referer: 'http://localhost:3000/admin',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'en-US,en;q=0.9,ru;q=0.8' }
我错过了什么?
另一个有趣的问题是,当我 运行 来自 Postman
的请求时,它显示 200 响应代码,并且 fastify 将 200
打印到日志中。但是,运行ning 来自 saga/request 与:
return fetch(url, newOptions)
.then(checkStatus)
.then(parseJSON)
我在请求方法中得到 response.status
of 0
而不是 200
,而服务器日志仍然显示 "res":{"statusCode":200}
.
尝试将 withCredentials: true
和 credentials: 'include'
添加到您的选项中:
options: {
mode: "no-cors",
withCredentials: true, // <-- ADD THIS
credentials: 'include', // <-- AND THIS
headers: {
Accept: "application/json",
Content-Type: "application/json",
Authorization: "Bearer NQ9xQLmYtq92aT8JHHRd7DGZJ..."
}
}
参考:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials
我知道问题出在哪里了。
显然,我的 Chrome - Version 80.0.3987.106 (Official Build) (64-bit)
版本以及可能的其他浏览器和旧版本的 Chrome,也去掉了 authorization
header , 当它与 no-cors
模式结合使用时。启用 CORS
并设置适当的 header 可以解决问题。