首页 > 解决方案 > (未经授权)从 localhost 请求时 - “node testRequest.js”时没有错误

问题描述

我正在抓取一个需要登录的网站。当我只运行本地测试功能来测试我的请求时,一切正常。

这是奇怪的部分。一切正常,当我在客户端运行我的脚本时,但是当它在我的本地主机服务器上的服务器端运行时,我在成功登录后得到一个错误。当我尝试向目标网站api。我得到的错误是:401(未经授权)错误。res msg 是:{Message: "Authorization has been denied for this request."}

我认为我试图抓取的网站正在阻止来自其他网站的外部 api 请求,这解释了当我在本地主机的服务器端运行脚本时出现的错误。

让我们假设是这种情况。我应该如何避免服务器从 corssorigin 阻止我的请求?


我在客户端运行它:https ://gyazo.com/ec8fb27ef9a679413eed04f5c4acf475

我在服务器端运行它:https ://gyazo.com/43096da6c5f381c0faa39ced92a0108c


请注意:在客户端运行脚本时一切正常,我没有收到任何错误,一切都按预期工作。

但是,当我从应用程序的服务器端运行完全相同的脚本时,事情开始变得很奇怪。我以某种方式能够成功登录,但此后我对其 api 的所有 GET 请求都会导致 401 未经授权的错误。


script.js - 随意使用我的用户名和密码登录。(缩进有点偏离。)

    const Async = require('simplify-async').simpleAsync;
    var request = require('request');
    var request = request.defaults({jar: true, headers: {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"}});

    const formData = {
        username: 'zinuku.public@gmail.com',
        password: 'Ryan1234',
        grant_type: 'password'
    };

    const options = {
        url: 'https://www.eovendo.com/token',
        form: formData,
        referer: 'https://www.eovendo.com/',
    };


    const callback = (err, res, body) => {
        if (err) {console.log(err, 'FAILED'); return}

        const info = JSON.parse(body);
        console.log(info);
        console.log('Succesfully logged in');


        const getBalance = () => {
            console.log('WE AR ENOW IN GET BALANCE');
            const promise = new Async();

            request.get({url: 'https://www.eovendo.com/api/Balance/GetBalance'}, (err, res, body) => {
                if (err) promise.reject(err);
                const balance = JSON.parse(body);
                console.log('>>>', balance);
                promise.resolve(balance)
            });
            return promise.promise;
        };

        getBalance()
                .catch(err => console.log(err))
                .then(res => {
                    console.log('balance func response, msg:', res)
                });
    };

    const eo_login = (options) => {
        request.post(options, callback);
    };

    eo_login(options);

标签: javascriptnode.jsauthenticationrequest

解决方案


我在这里假设您已经登录到该服务,但是您没有正确地将会话 ID 发送给它。当您登录并执行请求时,请查看浏览器的网络选项卡,查看发送到服务器的内容和接收的内容。通过模仿您的用户浏览器和他们的服务器之间的通信,您将能够登录和爬网。但是,如果他们不想让您这样做,请不要这样做。


推荐阅读