代码之家  ›  专栏  ›  技术社区  ›  rk_Tinelli

使用基本身份验证返回401(未经授权)获取ReactJS。飞行前请求未通过访问控制检查

  •  2
  • rk_Tinelli  · 技术社区  · 7 年前

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

    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/ :对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“access control Allow Origin”标头。原点' http://localhost:3000 因此不允许访问。响应的HTTP状态代码为401。如果不透明响应满足您的需要,请将请求的模式设置为“无cors”,以获取禁用cors的资源。

    未捕获(承诺中)TypeError:无法获取

    我的RestAPI有基本的Auth,但我不知道应该在头文件中插入什么才能访问。我知道了 'Authorization': 'Basic YWRtaW46c3VwZXJzZWNyZXQ=', 从Postman开始,当我配置授权选项卡时,它会自动添加到标题中。

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

    我的后端代码如下:

    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 回复  |  直到 7 年前
        1
  •  6
  •   rob5408    7 年前

    这可能与OP的问题不同,但我能够获得基本的身份验证保护 fetch 只需添加凭据模式即可工作。。。

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

    请参见此处: https://github.github.io/fetch/ 根据要求>选项

        2
  •  2
  •   Josh Siegl    7 年前

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

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

    如果不可能,您必须配置 CORS 对于你的API,这个问题没有给出任何关于后端的细节,所以我现在无法指导你如何做到这一点。

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