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

获取ReactJS与基本认证返回401(未经授权)。飞行前请求未通过权限改造检查

车靖琪
2023-03-14

我是ReactJS的新手,但我现在正努力自学。当我尝试使用web应用程序上的fetch函数在我的RestAPI with MongoDB中添加数据do may数据库时,我遇到了一个问题。当我单击我的按钮时,它运行以下代码:

SubmitClick(){
    //console.log('load Get User page'); //debug only

    fetch('http://localhost:4000/users/', {
      method: 'POST',
      headers: {
        'Authorization': 'Basic YWRtaW46c3VwZXJzZWNyZXQ=',
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        email: 'deadpool@gmail.com',
        first_name: 'Wade',
        last_name: 'Wilson',
        personal_phone: '(11) 91111-2222',
        password: 'wolv3Rine'
      })
    })

    //this.props.history.push('/get'); //change page layout and URL
}

我在浏览器上收到以下消息:

选项http://localhost:4000/users/401(未经授权)

加载失败http://localhost:4000/users/: 对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许来源”标头。起源'http://localhost:3000因此,不允许访问。响应的HTTP状态代码为401。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源。

未捕获(在promise)TypeError:未能获取

我的RestAPI有基本的Auth,但我不知道应该在头中插入什么才能访问。当我配置授权选项卡时,我从Postman那里得到了这个“授权”:“Basic YWRtaW46c3VwZXJzZWNyZXQ=”,,它被自动添加到标题中。

我使用谷歌浏览器作为默认浏览器。

我的后端代码如下所示:

const express =     require('express');
const bodyParser =  require('body-parser');
const mongoose =    require('mongoose');
var basicAuth =     require('express-basic-auth')

const app = express();

mongoose.connect('mongodb://localhost/usersregs', { useMongoClient: true });
mongoose.Promise = global.Promise;

app.use(basicAuth({
    users: {
        'admin': 'supersecret',
        'adam': 'password1234',
        'eve': 'asdfghjkl'
    }
}))

app.use(bodyParser.json());

app.use(function(err, req, res, next){
    console.log(err);
    //res.status(450).send({err: err.message})
});

app.use(require('./routes/api'));  

app.listen(4000, function(){
    console.log('Now listening for request at port 4000');
}); 

共有2个答案

师谦
2023-03-14

您正试图从端口3000(您的客户端)访问端口4000(您的API或后端)。这违反了同源策略,即使您显然是从同一台机器上运行客户端和API。

要解决这个问题,最简单的方法是从与API相同的端口(端口4000)启动客户机。这应该允许您的主机看到您正在尝试从相同的域/端口访问资源,而不会强制执行飞行前请求。

如果这是不可能的,您将不得不为您的应用编程接口配置CORS,这个问题没有给出任何关于后端的细节,所以我目前无法指导您如何做到这一点。

当然,如果在生产环境中运行两个独立的服务器,这种方法显然不起作用,但这可能超出了这个问题的范围。

汪鸿波
2023-03-14

这可能与OP的问题不同,但我能够通过添加凭据模式使基本的身份验证保护fetches正常工作。。。

fetch(
    'http://example.com/api/endpoint',
    { credentials: "same-origin" }
)

请看这里:https://github.github.io/fetch/ 根据要求

 类似资料:
  • 我正在尝试登录基于cloudflare服务器的网站。我使用cloudserver绕过了登录问题,但我的下一个停止点是当我试图发送get请求以访问一些登录后令牌时。 我的代码: 这返回401作为答案: 它的标题是 好的,我首先试着给一个auth。这样地 我再次得到相同的错误,401,但这次响应的头确实有一个www身份验证,我应该质询 根据我所读到的内容,它是基本的意味着我必须在我的头文件中添加一个像

  • 所以,我试图用Tweepy喜欢一个推文,但是这个错误正在发生: 有什么想法吗?

  • 我正在使用postman,并尝试通过http://localhost:8180/auth/admin/realms/demo/users/{userID}更新用户的配置文件,但收到响应。 通过http://localhost:8180/auth/admin/realms/demo/users/{userID}发送带有Json内容类型和用户信息的Put请求。 不幸的是,我已经连续收到了401个回复。

  • 我有一个在Azure网站上运行的标准Web API,启用了Azure AD身份验证,当在浏览器中浏览API时,我可以通过浏览器登录并获得对API的访问权。 但是,WPF桌面应用程序在提交请求时接收到未经授权的响应: 更新: 我已经在一个Azure帐户中重新创建了这个环境,我可以访问这个帐户,但仍然收到一个未经授权的响应(在浏览器中运行良好)。

  • 我正在尝试使用基本身份验证获取url。我设置用户/密码如下所示。同样的凭证在邮递员中工作。 我认为凭据设置不正确。这里怎么了?错误:

  • 选项https://dev-01-api-apptracker2/管理员401(未经授权) 从源https://dev-01-web-apptracker2在'https://dev-01-api-apptracker2/Admin'访问XMLHttpRequest'已被CORS策略阻止:对起飞前请求的响应不通过权限改造检查:请求的资源上不存在'Access-Control-允许-Origin'标