当前位置: 首页 > 知识库问答 >
问题:

将身份验证头从React JS发送到跨域节点(Express)API

羊舌庆
2023-03-14

我对CORS这个问题还不熟悉,正在努力找出问题所在。

我有两个应用程序:

  • 托管在上的react应用程序http://localhost:3000/

在响应应用端,我试图通过一个授权标头与令牌如下:

fetch('http://localhost:4000/api/address/add', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Authorization': 'bearer ' + Auth.getToken(),
  },  
  credentials: "include",
  body: JSON.stringify({
    data: "someData"
  })
})

但这是一个问题。我在节点(express)API端收到的标题如下:

{ host: 'localhost:4000',
  connection: 'keep-alive',
  'content-length': '22',
  origin: 'http://localhost:3000',
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
  'content-type': 'application/x-www-form-urlencoded',
  accept: '*/*',
  referer: 'http://localhost:3000/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1OTg5ODg1ZTM3YjVkYjBiODA5ZDNjN2QiLCJpYXQiOjE1MDIxODgxNTF9.5DLCAplQLN4IQcnbU1ldh5N2_Lr_7R6bCScsLdWDNE4',
  'accept-encoding': 'gzip, deflate, br',
  'accept-language': 'en-US,en;q=0.8',
  cookie: 'userid=By6Du-xf-; io=8TchJYAr6cHgAmnAAAAB' }

它缺少授权头,因此,我的身份验证失败,API不工作。

我错过了什么?

编辑:路由处理程序:

//address.js
const express = require('express');
const router = express.Router();
const Address = require('mongoose').model('Address');

router.get('/', (req, res, next) => {
  return Address.find({ userId : req.userId}, (userErr, addresses) => {
    if (userErr || !addresses) {
      return res.status(401).end();
    }

    return res.status(200).json({
      success: true,
      addresses: addresses
    });
  });
})


router.post('/add', (req, res, next) => {
  console.log("got here!")
  const addressData = {
    userId: req.userId,
    address: req.body.address.trim()
  };

  const newAddress = new Address(addressData);

  newAddress.save((err) => {
    if (err) { return res.status(401).end(); }

    return res.status(200).json({
      success: true,
      message: "Successfully added address."
    });
  });
})

module.exports = router;

然后我的索引路由文件:

//routes.js
const express = require('express');
const router = express.Router();

const authCheckMiddleware = require('../../middleware/auth-check');
router.use(authCheckMiddleware);

router.use('/address/', require('./address'));

共有1个答案

暨成双
2023-03-14

以下是对我有效的代码:

//react-app

fetch('http://localhost:4000/api/address/add', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Authorization': 'bearer ' + Auth.getToken(),
  },
  body: JSON.stringify({
    address: this.refs.address.value,
  })
})
.then(function(res) {
  console.log(res)
})

以及服务器中的cors配置。js文件

var express = require('express')
var cors = require('cors')
var app = express()
app.use(cors())

解码格式错误的JSON的额外好处:

//route.js
router.use(fixReactJSONBug);

router.use('/address/', require('./address'));
module.exports = router;

function fixReactJSONBug(req, res, next) {
  if (Object.keys(req.body).length > 0) {
    req.body = JSON.parse(Object.keys(req.body)[0])
  }

  return next();
}
 类似资料:
  • 在auth-routes示例中,api和nuxt一起启动并使用一个Node.js服务器实例。但是,有时我们应该使用jsonWebToken处理外部api身份验证问题。在这个例子中,将用最简单的方式解释。 官方 auth-module 如果要实现复杂的身份验证流程,例如OAuth2,我们建议使用官方 auth-module 结构 由于Nuxt.js同时提供服务器和客户端呈现,并且浏览器的cookie

  • 我试图在PhantomJS中打开一个需要HTTP身份验证的网页。我的脚本基于loadspeed.js示例: 我可以从渲染的page.jpg中看到,我每次都得到401分。我还使用Wireshark跟踪了HTTP会话,这表明GET请求中没有向给定URL发送身份验证标头。 我到底做错了什么?我刚刚开始使用PhantomJS,但我整个晚上都在寻找,没有走远...

  • 我试图将用于需要基本HTTP身份验证的第三方服务。我正在使用。以下是我到目前为止的结论:

  • 问题内容: 我的Web服务器托管在具有基本身份验证的Apache Tomcat 7中。我有Tomcat用户“ tomcat”,角色为“ tomcat”,密码为“ tomcat”。以下分别是我在客户端的web.xml文件和脚本片段。 Web.xml 客户端脚本: 我很确定Web服务和基本身份验证没有问题。但是从客户端脚本中,没有发送身份验证标头。我也尝试过 但是请求发送时没有身份验证头。任何帮助将不

  • 我有几个angular应用程序(在不同的子域中)和一个主angular应用程序(在主域中)。我使用@auth0/Angular2-jwt库来管理身份验证。它工作得很好,但对单点登录不起作用。我必须在每个子域登录,我需要这只做一次(在主域或任何子域)。 我尝试过为whitelistedDomains使用正则表达式,但它不起作用: 那么,如果用户登录到主域或任何子域,我如何对所有子域的用户进行身份验证

  • 我有一个问题,发送跨域会话cookie和搜索后,我得到了更困惑。最初,我在上有一个客户端(Next app),在上有一个api(Express)。发送和保存cookie在localhost上正常工作,但部署后,我遇到了一个问题,默认情况下将设置为。所以我把它改成了。但是我发现需要cookie集中的标志,所以我也改变了这一点。 将设置为后,将不再发送cookie。 如果设置了安全,并且您通过HTTP