Axios ile Temel Kimlik Doğrulama nasıl gönderilir


119

Aşağıdaki kodu uygulamaya çalışıyorum ama bir şey çalışmıyor. İşte kod:

  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 hatası veriyor. Postman ile yaptığımda, Temel Kimlik Doğrulamayı ayarlama seçeneği var; bu alanları doldurmazsam 401 de döndürür, ancak doldurursam istek başarılı olur.

Neyi yanlış yaptığıma dair bir fikrin var mı?

Bunun nasıl uygulanacağına ilişkin API belgelerinin bir kısmı aşağıda verilmiştir:

Bu hizmet, bir kullanıcı oturumu oluşturmak için başlıktaki Temel Kimlik Doğrulama bilgilerini kullanır. Kimlik bilgileri, Sunucuya göre doğrulanır. Bu web hizmetini kullanmak, geçirilen kullanıcı kimlik bilgileriyle bir oturum oluşturur ve bir JSESSIONID döndürür. Bu JSESSIONID, web hizmeti çağrıları yapmak için sonraki isteklerde kullanılabilir. *

Yanıtlar:


173

Temel Kimlik Doğrulama için bir "kimlik doğrulama" parametresi vardır:

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

Kaynak / Dokümanlar: https://github.com/mzabriskie/axios

Misal:

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

4
merhaba, bunu tüm axios çağrılarına nasıl yerleştirebilirim? Tüm ajax çağrılarına Temel kimlik doğrulama eklemem gerekiyor. axios.defaults.auth = {kullanıcı adı: 'dd', şifre: '##'} bu benim için çalışmıyor.
hkg328


btw, bu tür şeyler için aksiyoların etrafına bir sarmalayıcı da yazabilirsiniz
luschn

Bunun için ambalaj yaptım. ama bu api bana 401 hatası veriyor
hkg328

1
@ hkg328 başlığı manuel olarak ayarlamak istiyorsanız username: password dizesini base64 olarak kodlamanız gerekir. 'btoa-lite'dan import btoa gibi bir şey; belirteç = btoa (kullanıcı adı + ':' + şifre); ardından başlığı 'Temel' + belirteç olarak ayarlayın;
shrumm

59

Sorunuzdaki kodun kimlik doğrulaması yapmamasının nedeni, yetkilendirmeyi başlıklara koyacak yapılandırmada değil veri nesnesinde göndermenizdir. Başına AXIOS docs , istek yöntemi takma için postgeçerli:

axios.post (url [, veri [, yapılandırma]])

Bu nedenle, kodunuzun çalışması için veriler için boş bir nesne göndermeniz gerekir:

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

Aynısı @luschn tarafından belirtilen auth parametresini kullanmak için de geçerlidir. Aşağıdaki kod eşdeğerdir, ancak bunun yerine auth parametresini kullanır (ve ayrıca boş bir veri nesnesi geçirir):

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
BU YARDIM
ETTİ

1
Kabul edilen cevap bu olmalıdır. Kabul edilen yanıt, belgelerin yalnızca bir kopyasıdır.
Sinister Beard


6

Bazı nedenlerden dolayı, bu basit sorun birçok geliştiriciyi engelliyor. Bu basit şeyle saatlerce uğraştım. Bu problem birçok boyutta:

  1. CORS (farklı etki alanlarında ve bağlantı noktalarında bir ön uç ve arka uç kullanıyorsanız.
  2. Arka Uç CORS Yapılandırması
  3. Axios'un temel kimlik doğrulama yapılandırması

CORS

Geliştirme için kurulumum localhost: 8081 üzerinde çalışan bir vuejs webpack uygulaması ve localhost: 8080 üzerinde çalışan bir spring boot uygulaması ile. Bu nedenle, ön uçtan rest API'sini çağırmaya çalışırken, tarayıcının uygun CORS ayarları olmadan yay arka uçtan bir yanıt almama izin vermesi mümkün değil. CORS, modern tarayıcıların sahip olduğu Alanlar Arası Komut Dosyası (XSS) korumasını gevşetmek için kullanılabilir. Bunu anladığım kadarıyla, tarayıcılar SPA'nızı bir XSS saldırısı olmaktan koruyor. Elbette, StackOverflow'daki bazı yanıtlar, XSS korumasını devre dışı bırakmak için bir krom eklentisi eklemeyi önerdi, ancak bu gerçekten işe yarıyor VE eğer öyleyse, kaçınılmaz sorunu daha sonra zorlayacaktı.

Arka uç CORS yapılandırması

İlkbahar önyükleme uygulamanızda CORS'u şu şekilde kurmanız gerekir:

İstemci isteğine yanıt olarak uygun üstbilgiler eklemek için bir CorsFilter sınıfı ekleyin. Access-Control-Allow-Origin ve Access-Control-Allow-Headers, temel kimlik doğrulama için sahip olunması gereken en önemli şeydir.

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

    }
...
}

Spring WebSecurityConfigurationAdapter'ı genişleten bir yapılandırma sınıfı ekleyin. Bu sınıfta CORS filtrenizi enjekte edeceksiniz:

@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());
    }
...
}

Denetleyicinize CORS ile ilgili herhangi bir şey koymanıza gerek yoktur.

Başlangıç ​​aşaması

Şimdi, ön uçta, Yetkilendirme başlığıyla axios sorgunuzu oluşturmanız gerekir:

<!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>

Bu yardımcı olur umarım.


noob CORS sorusu, bu sadece geliştirmede kullanılıyor, değil mi?
Len Joseph

Hayır, aynı zamanda ve çoğunlukla üretimde.
Erick Audet

5

Luschn ve pillravi tarafından verilen çözüm, yanıtta Strict-Transport-Security başlığı almadığınız sürece iyi çalışıyor .

WithCredentials: true eklemek bu sorunu çözecektir.

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

4

Node.js'de Axios kullanan bir örnek (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);

Proje dizininizde şunları yaptığınızdan emin olun:

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

Ardından, tarayıcınızı kullanarak Node.js REST API'sini şu adreste test edebilirsiniz: http://localhost:5000/search?queryStr=xxxxxxxxx

Referans: https://github.com/axios/axios


3

Temel kimlik doğrulama yapmaya çalışıyorsanız, şunu deneyebilirsiniz:

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}`
},
})

Bu benim için çalıştı. umarım yardımcı olur

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.