Axios: bitbucket.orgへの400の応答

作成日 2017年11月03日  ·  3コメント  ·  ソース: axios/axios

node: 8.9.0
axios: 0.16.2
  • nodejsで認証ヘッダーを設定するaxiosを使用すると、bitbucketで400エラーが発生します。
  • CURLで同じリクエストを使用すると機能します。

ただし、リモートサーバーへのCORS投稿に関する非常に大規模でブラウザ中心のディスカッションをロックしました。

  1. bitbucketは他のドメインからの通話を許可します
  2. 私は電話をかけるためにブラウザを使用していません
    axios
      .post(`https://bitbucket.org/site/oauth2/access_token`, {
        auth: {
          username: process.env.BITBUCKET_CLIENT_ID,
          password: process.env.BITBUCKET_CLIENT_SECRET
        },
        { grant_type: 'access_token' }
      })
      .then(response => {

        log('oauth.auth.response', response.data);
        const {
          access_token,
          refresh_token,
          token_type,
          scopes,
          expires_in
        } = response.data;
      });
...
$ curl -u $BITBUCKET_CLIENT_ID:$BITBUCKET_CLIENT_SECRET \
 https://bitbucket.org/site/oauth2/access_token \
-d grant_type=client_credentials

{"access_token": "magically-correct-response=", "scopes": "webhook repository team accou
nt", "expires_in": 3600, "refresh_token": "maigcally-correct-resfresh-token", "token_type": "bearer"}

最も参考になるコメント

axiosではなくサーバー側のAPIリクエストをrequire('request');に切り替えることで修正しました。

  require('request')
      .post(`https://bitbucket.org/site/oauth2/access_token`, {
        auth: {
          username: process.env.BITBUCKET_CLIENT_ID,
          password: process.env.BITBUCKET_CLIENT_SECRET
        },
        form: { grant_type: 'access_token' }
      }, (err, response, body) => {
        const data = JSON.parse(body);
        log('oauth.auth.response', data);
        const {
          access_token,
          refresh_token,
          token_type,
          scopes,
          expires_in
        } = data;
      });

全てのコメント3件

axiosではなくサーバー側のAPIリクエストをrequire('request');に切り替えることで修正しました。

  require('request')
      .post(`https://bitbucket.org/site/oauth2/access_token`, {
        auth: {
          username: process.env.BITBUCKET_CLIENT_ID,
          password: process.env.BITBUCKET_CLIENT_SECRET
        },
        form: { grant_type: 'access_token' }
      }, (err, response, body) => {
        const data = JSON.parse(body);
        log('oauth.auth.response', data);
        const {
          access_token,
          refresh_token,
          token_type,
          scopes,
          expires_in
        } = data;
      });

これはaxiosの問題であるため、axiosを使用して処理した方法は次のとおりです。

import axios from 'axios';
import * as qs from 'querystring';

export const Callback = async (req, res): Promise<void | never> => {
  const {
    BITBUCKET_CLIENT_ID,
    BITBUCKET_CLIENT_SECRET,
    BITBUCKET_CALLBACK_URL
  } = process.env;

  const { code: AUTH_CODE } = req.query;

  try {
    const data = await axios({
      url: 'https://bitbucket.org/site/oauth2/access_token',
      headers: {
        'Cache-Control': 'no-cache',
        'content-type': `application/x-www-form-urlencoded`,
      },
      auth: {
        username: BITBUCKET_CLIENT_ID,
        password: BITBUCKET_CLIENT_SECRET,
      },
      method: 'post',
      data: qs.stringify({
        grant_type: 'authorization_code',
        code: AUTH_CODE,
        redirect_uri: BITBUCKET_CALLBACK_URL,
      }),
    });

    // Do something

  } catch (e) {
    console.trace(error);
    return res.sendStatus(400);
  }
};

これはaxiosの問題であるため、axiosを使用して処理した方法は次のとおりです。

import axios from 'axios';
import * as qs from 'querystring';

export const Callback = async (req, res): Promise<void | never> => {
  const {
    BITBUCKET_CLIENT_ID,
    BITBUCKET_CLIENT_SECRET,
    BITBUCKET_CALLBACK_URL
  } = process.env;

  const { code: AUTH_CODE } = req.query;

  try {
    const data = await axios({
      url: 'https://bitbucket.org/site/oauth2/access_token',
      headers: {
        'Cache-Control': 'no-cache',
        'content-type': `application/x-www-form-urlencoded`,
      },
      auth: {
        username: BITBUCKET_CLIENT_ID,
        password: BITBUCKET_CLIENT_SECRET,
      },
      method: 'post',
      data: qs.stringify({
        grant_type: 'authorization_code',
        code: AUTH_CODE,
        redirect_uri: BITBUCKET_CALLBACK_URL,
      }),
    });

    // Do something

  } catch (e) {
    console.trace(error);
    return res.sendStatus(400);
  }
};

ありがとうございました!

このページは役に立ちましたか?
0 / 5 - 0 評価