কীভাবে অক্ষর সহ বেসিক এথ পাঠাবেন


118

আমি নিম্নলিখিত কোডটি বাস্তবায়নের চেষ্টা করছি, তবে কিছু কাজ করছে না। কোডটি এখানে:

  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 ফেরত দেয়, তবে আমি যদি করি তবে অনুরোধটি সফল।

কোন ধারণা আমি কি ভুল করছি?

এটি কীভাবে এটি প্রয়োগ করতে হবে তার API এর ডক্সের একটি অংশ:

এই পরিষেবাটি ব্যবহারকারীর অধিবেশন স্থাপনের জন্য শিরোনামে বেসিক প্রমাণীকরণ তথ্য ব্যবহার করে। শংসাপত্রগুলি সার্ভারের বিরুদ্ধে বৈধ হয়। এই ওয়েব-পরিষেবাটি ব্যবহারকারীর শংসাপত্রগুলি পাস করার সাথে একটি সেশন তৈরি করবে এবং একটি JSESSIONID ফেরত দেবে। এই JSESSIONID পরবর্তী পরিষেবাগুলিতে ওয়েব-পরিষেবা কল করার জন্য ব্যবহৃত হতে পারে *

উত্তর:


172

বেসিক আথের জন্য একটি "লেখক" প্যারামিটার রয়েছে:

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

উত্স / দস্তাবেজ: https://github.com/mzabriskie/axios

উদাহরণ:

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

4
হ্যালো, আমি কীভাবে সমস্ত অক্ষরে কল করতে পারি? আমার সকল এজাক্স কলিংয়ে বেসিক লেখক যুক্ত করা দরকার। axios.defaults.auth = {ব্যবহারকারীর নাম: 'dd', পাসওয়ার্ড: '##'} এটি আমার পক্ষে কাজ করছে না।
hkg328

সম্ভবত এটি সহায়তা করে: gist.github.com/EQuimper/dc5fe02dcaca4469091729e1313f78d1
লুশ্ন

বিটিডব্লিউ, আপনি এই ধরণের জিনিসগুলির জন্য অক্ষের চারপাশে একটি মোড়ক লিখতে পারেন
luschn

আমি তার জন্য মোড়ক তৈরি করেছি। তবে সেই এপিআই আমাকে 401 ত্রুটি দেয়
hkg328

4
@ hkg328 আপনার স্ট্রিং ব্যবহারকারীর নাম এনকোড করা দরকার: পাসওয়ার্ডটি বেস 64 তে পাসওয়ার্ডের জন্য যদি আপনি ম্যানুয়ালি শিরোনাম সেট করতে চান। 'বিটিও-লাইট' থেকে আমদানি করার মতো কিছু; টোকেন = বিটিওএ (ব্যবহারকারীর নাম + ':' + পাসওয়ার্ড); তারপরে শিরোনামটি 'বেসিক' + টোকনে সেট করুন;
shrum

59

আপনার প্রশ্নের কোডটি প্রমাণীকরণ না করার কারণ হ'ল আপনি ডেটা অবজেক্টে লেখক প্রেরণ করছেন, কনফিগারেশনে নয়, এটি এটি শিরোনামে রাখবে। প্রতি axios ডক্স , অনুরোধ পদ্ধতি ওরফে জন্য postহল:

axios.post (url [, ডেটা [, কনফিগারেশন]])

অতএব, আপনার কোডটি কাজ করার জন্য আপনাকে ডেটার জন্য একটি খালি বস্তু প্রেরণ করতে হবে:

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');
});

@Lusn দ্বারা উল্লিখিত লেখক পরামিতি ব্যবহারের ক্ষেত্রেও এটি একই। নিম্নলিখিত কোডটি সমতুল্য, তবে পরিবর্তে এটি প্রমাণীকরণের প্যারামিটার ব্যবহার করে (এবং একটি খালি ডেটা অবজেক্টটিও পাস করে):

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');
});

4
এই সাহায্য, ধন্যবাদ
সুপারকুপ

4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। গৃহীত উত্তর হ'ল ডকুমেন্টেশনের একটি সদৃশ।
Sinister দাড়ি

5

কিছু কারণে, এই সাধারণ সমস্যাটি অনেক বিকাশকারীকে অবরুদ্ধ করে চলেছে। আমি এই সাধারণ জিনিসটি নিয়ে বহু ঘন্টা লড়াই করেছি। এই সমস্যাটি অনেক মাত্রা হিসাবে:

  1. কর্স (যদি আপনি বিভিন্ন ডোমেন এবং পোর্টগুলিতে ফ্রন্টএন্ড এবং ব্যাকএন্ড ব্যবহার করেন।
  2. ব্যাকএন্ড CORS কনফিগারেশন
  3. অক্ষের প্রাথমিক প্রমাণীকরণ কনফিগারেশন

কর্স

উন্নয়নের জন্য আমার সেটআপটি লোকহোস্ট: 8081 এবং একটি স্প্রিং বুট অ্যাপ্লিকেশন চলমান লোকহোস্ট: 8080 এ চলছে এমন একটি ভয়েজ ওয়েবপ্যাক অ্যাপ্লিকেশন সহ। সুতরাং সীমান্ত থেকে রেস্ট এপিআই কল করার চেষ্টা করার সময়, ব্রাউজার আমাকে উপযুক্ত সিওআরএস সেটিংস ছাড়াই বসন্ত ব্যাকএন্ডের কাছ থেকে প্রতিক্রিয়া পেতে দেয় এমন কোনও উপায় নেই। আধুনিক ব্রাউজারগুলির ক্রস ডোমেন স্ক্রিপ্ট (এক্সএসএস) সুরক্ষা শিথিল করতে CORS ব্যবহার করা যেতে পারে। আমি যেমন এটি বুঝতে পারি, ব্রাউজারগুলি আপনার এসপিএকে কোনও এক্সএসএসের আক্রমণ থেকে রক্ষা করছে। অবশ্যই, স্ট্যাকওভারফ্লোতে কিছু উত্তর এক্সএসএস সুরক্ষা অক্ষম করার জন্য একটি ক্রোম প্লাগইন যুক্ত করার পরামর্শ দিয়েছে তবে এটি সত্যিই কাজ করে এবং যদি এটি হয় তবে কেবল পরবর্তী সময়ের জন্য অনিবার্য সমস্যাটিকে ধাক্কা দেবে।

ব্যাকএন্ড CORS কনফিগারেশন

আপনার বসন্ত বুট অ্যাপে আপনার কীভাবে সিওআর সেটআপ করা উচিত তা এখানে:

ক্লায়েন্টের অনুরোধের প্রতিক্রিয়ায় যথাযথ শিরোনাম যুক্ত করতে একটি কর্স ফিল্টার শ্রেণি যুক্ত করুন। অ্যাসেস-কন্ট্রোল-মঞ্জুরি-উত্স এবং অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-শিরোনামগুলি মৌলিক প্রমাণীকরণের জন্য সবচেয়ে গুরুত্বপূর্ণ বিষয়।

    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);

    }
...
}

একটি কনফিগারেশন ক্লাস যুক্ত করুন যা স্প্রিং ওয়েবসিকিউরিটি কনফিগারেশনএডাপ্টার প্রসারিত করে। এই শ্রেণিতে আপনি আপনার সিওআরএস ফিল্টারটি ইনজেক্ট করবেন:

@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 CORS প্রশ্ন, এটি কেবল উন্নয়নে ব্যবহৃত হয়, তাই না?
লেন জোসেফ

না, এটি এবং বেশিরভাগ উত্পাদনেও রয়েছে।
এরিক অডিট

4

লুস্ন এবং পিলরভি প্রদত্ত সমাধানটি কার্যকর হয় যদি না আপনি কোনও কঠোর-পরিবহন-সুরক্ষা পান প্রতিক্রিয়াতে শিরোনাম পান।

শংসাপত্রগুলির সাথে যুক্ত করা হচ্ছে : সত্যই সমস্যাটি সমাধান করবে।

  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');
  });

3

নোড.জেএস-তে অক্ষ ব্যবহার করে একটি উদাহরণ (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

তারপরে আপনি এখানে নিজের ব্রাউজারটি ব্যবহার করে নোড.জেস আরএসটি এপিআই পরীক্ষা করতে পারেন: http://localhost:5000/search?queryStr=xxxxxxxxx

রেফ: https://github.com/axios/axios


2

আপনি যদি বেসিক লেখার চেষ্টা করছেন তবে আপনি এটি চেষ্টা করতে পারেন:

const username = ''
const password = ''

const token = Buffer.from(`${username}:${password}`, 'utf8').toString('base64')

const url = 'https://...'
const data = {
...
}

axios.post(url, data, {
  headers: {
 'Authorization': `Basic ${token}`
},
})

এটি আমার পক্ষে কাজ করেছে। আশা করি এইটি কাজ করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.