Axios के साथ Basic Auth कैसे भेजें


107

मैं निम्नलिखित कोड लागू करने की कोशिश कर रहा हूं, लेकिन कुछ काम नहीं कर रहा है। यहाँ कोड है:

  var session_url = 'http://api_address/api/session_endpoint';
  var username = 'user';
  var password = 'password';
  var credentials = btoa(username + ':' + password);
  var basicAuth = 'Basic ' + credentials;
  axios.post(session_url, {
    headers: { 'Authorization': + basicAuth }
  }).then(function(response) {
    console.log('Authenticated');
  }).catch(function(error) {
    console.log('Error on Authentication');
  });

यह एक 401 त्रुटि लौटा रहा है। जब मैं इसे पोस्टमैन के साथ करता हूं तो बेसिक ऑथ को सेट करने का विकल्प होता है; अगर मैं उन क्षेत्रों को नहीं भरता हूं तो यह 401 भी लौटता है, लेकिन यदि मैं करता हूं, तो अनुरोध सफल है।

किसी भी विचार मैं गलत क्या कर रहा हूँ?

इसे लागू करने के तरीके की एपीआई के डॉक्स का हिस्सा है:

यह सेवा उपयोगकर्ता सत्र स्थापित करने के लिए शीर्ष लेख में मूल प्रमाणीकरण जानकारी का उपयोग करती है। क्रेडेंशियल सर्वर के विरुद्ध मान्य हैं। इस वेब-सेवा का उपयोग करके पारित किए गए उपयोगकर्ता क्रेडेंशियल्स के साथ एक सत्र बनाएगा और एक JSESSIONID लौटाएगा। इस JSESSIONID का उपयोग वेब-सेवा कॉल करने के लिए बाद के अनुरोधों में किया जा सकता है। *

जवाबों:


153

बेसिक ऑथ के लिए "सामान्य" पैरामीटर है:

auth: {
  username: 'janedoe',
  password: 's00pers3cret'
}

स्रोत / डॉक्स: https://github.com/mzabriskie/axios

उदाहरण:

await axios.post(session_url, {}, {
  auth: {
    username: uname,
    password: pass
  }
});

4
हैलो, मैं इसे सभी अक्षीय कॉल में कैसे सेट कर सकता हूं? मुझे सभी ajax कॉलिंग में बेसिक को जोड़ना होगा। axios.defaults.auth = {उपयोगकर्ता नाम: 'dd', पासवर्ड: '##'} यह मेरे लिए काम नहीं कर रहा है।
hkg328

शायद यह मदद करता है: gist.github.com/EQuimper/dc5fe02dcaca4469091729e1313f78d1
luschn

btw, आप उन बातों के लिए axios के चारों ओर एक आवरण लिख सकते हैं
luschn

मैंने उसके लिए रैपर बनाया। लेकिन वह एपी मुझे 401 त्रुटि देता है
hkg328

1
@ hkg328 यदि आपको हेडर को मैन्युअल रूप से सेट करना है तो स्ट्रिंग यूजरनेम: पासवर्ड को बेस 64 पर एनकोड करना होगा। 'बोटो-लाइट' से आयात बोटा जैसा कुछ; टोकन = btoa (उपयोगकर्ता नाम + ':' + पासवर्ड); फिर हेडर को 'बेसिक' + टोकन पर सेट करें;
shrumm

54

आपके प्रश्न का कोड प्रमाणित नहीं होने का कारण यह है कि आप डेटा ऑब्जेक्ट में ऑउटफिट भेज रहे हैं, कॉन्फ़िगरेशन में नहीं, जो इसे हेडर में डाल देगा। प्रति Axios डॉक्स , अनुरोध विधि उर्फ के लिए postहै:

axios.post (url [, data [, config]])

इसलिए, आपके कोड को काम करने के लिए, आपको डेटा के लिए एक खाली वस्तु भेजने की आवश्यकता है:

var session_url = 'http://api_address/api/session_endpoint';
var username = 'user';
var password = 'password';
var basicAuth = 'Basic ' + btoa(username + ':' + password);
axios.post(session_url, {}, {
  headers: { 'Authorization': + basicAuth }
}).then(function(response) {
  console.log('Authenticated');
}).catch(function(error) {
  console.log('Error on Authentication');
});

@Luschn द्वारा उल्लिखित ऑर्टिकल पैरामीटर का उपयोग करने के लिए भी यही सच है। निम्न कोड समतुल्य है, लेकिन इसके बजाय किसी अन्य पैरामीटर का उपयोग करता है (और खाली डेटा ऑब्जेक्ट भी पास करता है):

var session_url = 'http://api_address/api/session_endpoint';
var uname = 'user';
var pass = 'password';
axios.post(session_url, {}, {
  auth: {
    username: uname,
    password: pass
  }
}).then(function(response) {
  console.log('Authenticated');
}).catch(function(error) {
  console.log('Error on Authentication');
});

1
यह मदद
मिली

1
यह स्वीकृत उत्तर होना चाहिए। स्वीकृत उत्तर केवल दस्तावेज का एक डुप्लिकेट है।
सिनिस्टर बियर्ड

5

कुछ कारणों से, यह सरल समस्या कई डेवलपर्स को रोक रही है। इस साधारण सी बात से मैं कई घंटों तक जूझता रहा। कई आयामों के रूप में यह समस्या:

  1. CORS (यदि आप विभिन्न डोमेन एट पोर्ट पर फ्रंटएंड और बैकएंड का उपयोग कर रहे हैं।
  2. बैकेंड कॉर्स कॉन्फ़िगरेशन
  3. कुल्हाड़ियों का मूल प्रमाणीकरण विन्यास

CORS

डेवलपमेंट के लिए मेरा सेटअप लोक्यूहोस्ट: 8081 पर चलने वाले वीयूज वेबपैक एप्लिकेशन और लोकलहोस्ट पर चलने वाले स्प्रिंग बूट एप्लिकेशन के साथ है। इसलिए जब फ्रंट एपीआई से रेस्ट एपीआई को कॉल करने की कोशिश की जाती है, तो कोई रास्ता नहीं है कि ब्राउज़र मुझे उचित कॉर्स सेटिंग्स के बिना स्प्रिंग बैकएंड से प्रतिक्रिया प्राप्त करने देगा। आधुनिक ब्राउज़र में क्रॉस डोमेन स्क्रिप्ट (XSS) सुरक्षा को आराम करने के लिए CORS का उपयोग किया जा सकता है। जैसा कि मैं यह समझता हूं, ब्राउज़र आपके एसपीए को एक XSS द्वारा हमला होने से बचा रहे हैं। बेशक, StackOverflow पर कुछ उत्तरों ने XSS सुरक्षा को अक्षम करने के लिए एक क्रोम प्लगइन जोड़ने का सुझाव दिया था, लेकिन यह वास्तव में काम करता है और यदि ऐसा था, तो यह केवल बाद के लिए अपरिहार्य समस्या को धक्का देगा।

बैकेंड कॉर्स विन्यास

यहां बताया गया है कि आपको अपने स्प्रिंग बूट ऐप में CORS को कैसे सेट करना चाहिए:

क्लाइंट अनुरोध के जवाब में उचित हेडर जोड़ने के लिए CorsFilter वर्ग जोड़ें। पहुँच-नियंत्रण-अनुमति-उत्पत्ति और पहुँच-नियंत्रण-अनुमति-हेडर्स मूल प्रमाणीकरण के लिए सबसे महत्वपूर्ण बात है।

    public class CorsFilter implements Filter {

...
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;

        response.setHeader("Access-Control-Allow-Origin", "http://localhost:8081");
        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH");
        **response.setHeader("Access-Control-Allow-Headers", "authorization, Content-Type");**
        response.setHeader("Access-Control-Max-Age", "3600");

        filterChain.doFilter(servletRequest, servletResponse);

    }
...
}

एक कॉन्फ़िगरेशन क्लास जोड़ें जो स्प्रिंग वेबसिटीरिटीऑनफिगरेशन एडॉप्टर तक फैली हो। इस वर्ग में आप अपने CORS फ़िल्टर को इंजेक्ट करेंगे:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
...
    @Bean
    CorsFilter corsFilter() {
        CorsFilter filter = new CorsFilter();
        return filter;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.addFilterBefore(corsFilter(), SessionManagementFilter.class) //adds your custom CorsFilter
          .csrf()
          .disable()
          .authorizeRequests()
          .antMatchers("/api/login")
          .permitAll()
          .anyRequest()
          .authenticated()
          .and()
          .httpBasic()
          .authenticationEntryPoint(authenticationEntryPoint)
          .and()
          .authenticationProvider(getProvider());
    }
...
}

आपको अपने नियंत्रक में कोर्स से संबंधित कुछ भी डालने की आवश्यकता नहीं है।

फ़्रंट एंड

अब, दृश्यपटल में आपको प्राधिकरण शीर्षक के साथ अपनी अक्षीय क्वेरी बनाने की आवश्यकता है:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://unpkg.com/vue"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app">
    <p>{{ status }}</p>
</div>
<script>
    var vm = new Vue({
        el: "#app",
        data: {
            status: ''
        },
        created: function () {
            this.getBackendResource();
        },
        methods: {
            getBackendResource: function () {
                this.status = 'Loading...';
                var vm = this;
                var user = "aUserName";
                var pass = "aPassword";
                var url = 'http://localhost:8080/api/resource';

                var authorizationBasic = window.btoa(user + ':' + pass);
                var config = {
                    "headers": {
                        "Authorization": "Basic " + authorizationBasic
                    }
                };
                axios.get(url, config)
                    .then(function (response) {
                        vm.status = response.data[0];
                    })
                    .catch(function (error) {
                        vm.status = 'An error occured.' + error;
                    })
            }
        }
    })
</script>
</body>
</html>

उम्मीद है की यह मदद करेगा।


noob कोर सवाल, यह केवल विकास में उपयोग किया जाता है, है ना?
लेन

नहीं, यह भी है और ज्यादातर उत्पादन में है।
एरिक ऑडिट

3

Node.js में Axios का उपयोग करके एक उदाहरण (axios_example.js):

const axios = require('axios');
const express = require('express');
const app = express();
const port = process.env.PORT || 5000;

app.get('/search', function(req, res) {
    let query = req.query.queryStr;
    let url = `https://your.service.org?query=${query}`;

    axios({
        method:'get',
        url,
        auth: {
            username: 'xxxxxxxxxxxxx',
            password: 'xxxxxxxxxxxxx'
        }
    })
    .then(function (response) {
        res.send(JSON.stringify(response.data));
    })
    .catch(function (error) {
        console.log(error);
    });
});

var server = app.listen(port);

सुनिश्चित करें कि आप अपनी परियोजना निर्देशिका में हैं:

npm init
npm install express
npm install axios
node axios_example.js

फिर आप अपने ब्राउज़र का उपयोग करके Node.js REST API का परीक्षण कर सकते हैं: http://localhost:5000/search?queryStr=xxxxxxxxx

Ref: https://github.com/axios/axios


3

Luschn और pillravi द्वारा दिया गया समाधान तब तक ठीक काम करता है जब तक कि आपको प्रतिक्रिया में स्ट्रिक्ट-ट्रांसपोर्ट-सिक्योरिटी हेडर प्राप्त न हो ।

क्रेडिट के साथ जोड़ना : सच उस मुद्दे को हल करेगा।

  axios.post(session_url, {
    withCredentials: true,
    headers: {
      "Accept": "application/json",
      "Content-Type": "application/json"
    }
  },{
    auth: {
      username: "USERNAME",
      password: "PASSWORD"
  }}).then(function(response) {
    console.log('Authenticated');
  }).catch(function(error) {
    console.log('Error on Authentication');
  });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.