axiosで基本認証を送信する方法


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エラーが返されます。Postmanでそれを行う場合、基本認証を設定するオプションがあります。これらのフィールドに入力しない場合も401が返されますが、入力した場合、リクエストは成功します。

私が間違っていることはありますか?

これは、これを実装する方法のAPIのドキュメントの一部です。

このサービスは、ヘッダーの基本認証情報を使用してユーザーセッションを確立します。資格情報はサーバーに対して検証されます。このWebサービスを使用すると、渡されたユーザー資格情報でセッションが作成され、JSESSIONIDが返されます。このJSESSIONIDは、Webサービス呼び出しを行うための後続の要求で使用できます。*

回答:


152

基本認証には「auth」パラメーターがあります。

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

ソース/ドキュメント:https : //github.com/mzabriskie/axios

例:

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

4
こんにちは、すべてのaxios呼び出しにどのように設定できますか?すべてのajax呼び出しに基本認証を追加する必要があります。axios.defaults.auth = {ユーザー名: 'dd'、パスワード: '##'}これは私には機能しません。
hkg328 '20


ところで、それらの種類の
axiosの

そのためのラッパーを作りました。しかし、そのAPIは私に401エラーを与えます
hkg328

1
@ hkg328ヘッダーを手動で設定する場合は、文字列username:passwordをbase64にエンコードする必要があります。'btoa-lite'からbtoaをインポートするようなもの; トークン= btoa(ユーザー名+ ':' +パスワード); 次に、ヘッダーを「Basic」+トークンに設定します。
シュラム

54

質問のコードが認証されない理由は、authをヘッダーではなく、構成ではなくデータオブジェクトで送信するためです。パー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で言及されているauthパラメータを使用する場合も同様です。次のコードは同等ですが、代わりにauthパラメータを使用します(空のデータオブジェクトも渡します)。

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
THIS HELPED、THANKS
superrcoop

1
これは受け入れられる答えになるはずです。受け入れられた答えは、ドキュメントの複製です。
ひげ

5

いくつかの理由で、この単純な問題が多くの開発者をブロックしています。私はこの単純なことで何時間も苦労しました。この問題は多くの次元と同じです。

  1. CORS(異なるドメインおよびポートでフロントエンドとバックエンドを使用している場合。
  2. バックエンドCORS構成
  3. Axiosの基本認証構成

CORS

開発のための私のセットアップは、localhost:8081で実行されているvuejs webpackアプリケーションとlocalhost:8080で実行されているSpring Bootアプリケーションを使用しています。そのため、フロントエンドからREST APIを呼び出そうとする場合、適切なCORS設定なしに、ブラウザーがSpringバックエンドから応答を受信できるようにする方法はありません。CORSを使用して、最新のブラウザーが持っているクロスドメインスクリプト(XSS)保護を緩和できます。私がこれを理解しているように、ブラウザはSPAをXSSによる攻撃から保護しています。もちろん、StackOverflowに対するいくつかの回答は、XSS保護を無効にするクロムプラグインを追加することを提案しましたが、これは実際に機能します。

バックエンドCORS構成

Spring BootアプリでCORSを設定する方法は次のとおりです。

CorsFilterクラスを追加して、クライアント要求への応答に適切なヘッダーを追加します。Access-Control-Allow-OriginとAccess-Control-Allow-Headersは、基本認証で最も重要なものです。

    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を拡張する構成クラスを追加します。このクラスでは、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());
    }
...
}

CORSに関連するものをコントローラーに配置する必要はありません。

フロントエンド

次に、フロントエンドで、Authorizationヘッダーを使用してaxiosクエリを作成する必要があります。

<!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の質問、これは開発でのみ使用されますよね?
レンジョセフ

いいえ、それはまた、ほとんどが生産中です。
Erick Audet

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

参照:https : //github.com/axios/axios


3

luschnとpillraviによって提供されたソリューションは、応答でStrict-Transport-Securityヘッダーを受信しない限り正常に動作します。

withCredentials:trueを追加すると、その問題が解決します。

  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');
  });
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.