質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

688閲覧

javascriptのXMLHttpRequestでcurlのpostコマンドが再現できない

tamina0624

総合スコア17

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2024/04/10 02:01

実現したいこと

以下のcurlコマンドをjavascriptで再現したいのですがうまくいきません。

curl

1curl --request POST \ 2 --url https://testdomain/oauth2/v1/token \ 3 --header 'accept: application/json' \ 4 --header 'cache-control: no-cache' \ 5 --header 'content-type: application/x-www-form-urlencoded' \ 6 --data 'grant_type=authorization_code&client_id=0oabygpxgk9lXaMgF0h7&redirect_uri=yourApp%3A%2Fcallback&code=CKA9Utz2GkWlsrmnqehz&code_verifier=M25iVXpKU3puUjFaYWg3T1NDTDQtcW1ROUY5YXlwalNoc0hhakxifmZHag'

発生している問題・分からないこと

postmanで試した結果、正しい結果を取得できることは確認できましたが
javascriptで正しい結果を得ることができません。

該当のソースコード

javascript

1 var restAPIURL=this.baseURL+"oauth2/v1/token"; 2 var req = new XMLHttpRequest(); // HTTPでファイルを読み込むためのXMLHttpRrequestオブジェクトを生成 3 req.open("POST",restAPIURL, false); // アクセスするファイルを指定 4 req.setRequestHeader("Accept","application/json"); 5 req.setRequestHeader("cache-control","no-cache"); 6 req.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 7 8 var postData='grant_type=authorization_code' 9 +'&redirect_uri='+encodeURIComponent(this.config.redirectUri) 10 +'&code='+this.config.authorization_code 11 +'&code_verifier='+code_verifier; 12 13req.send(encodeURIComponent(postData));

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

以下の参考にしているページを張ります。

https://developer.okta.com/docs/guides/implement-grant-type/authcodepkce/main/?_gl=1%2a1eox44n%2a_ga%2aMTM4ODUxMDU4Ny4xNzEyNzEzODE4%2a_ga_QKMSDV5369%2aMTcxMjcxMzgxNy4xLjEuMTcxMjcxMzgyMS41Ni4wLjA.&_ga=2.44795940.1465596206.1712713818-1388510587.1712713818

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2024/04/10 02:15

そもそも論ですが、そのトークンは書いて大丈夫なものでしょうか? (回答すると質問自体が削除されづらくなってしまうので、問題がないことを確認してから回答に移りたい、という感覚です)
tamina0624

2024/04/10 02:26

はい、書いてはいけないものは削除しています。
maisumakun

2024/04/10 03:01

> javascriptで正しい結果を得ることができません。 具体的に、どうなっているのですか?
tamina0624

2024/04/10 03:26

以下のようなエラーが発生します。 {"error":"invalid_client","error_description":"Browser requests to the token endpoint must use Proof Key for Code Exchange."}
maisumakun

2024/04/10 03:58

> 以下のようなエラーが発生します。 書かれたメッセージから調べてみたこと、試したことなどはありませんか?
tamina0624

2024/04/10 05:22

ありがとうございます。 postmanでヘッダにOrigin要素を追加したところ同じエラーを確認できました。
Lhankor_Mhy

2024/04/10 06:58

ご解決ということでよろしいでしょうか?
tamina0624

2024/04/11 04:06

はい、解決しました。ご協力ありがとうございました。
guest

回答3

0

js

1req.send(encodeURIComponent(postData));

この encodeURIComponent() が余計かもしれません。

FormDataURLSearchParams を使うとエスケープ処理をいちいち書かなくて済みます。

js

1let postData = new FormData(); 2postData.append('grant_type', 'authorization_code'); 3postData.append('redirect_uri', this.config.redirectUri); 4postData.append('code', this.config.authorization_code); 5postData.append('code_verifier', code_verifier); 6req.send(postData);

投稿2024/04/10 03:16

int32_t

総合スコア21927

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tamina0624

2024/04/10 04:06

ダメでした。以下のエラーが出ます。 {\"error\":\"invalid_client\",\"error_description\":\"Browser requests to the token endpoint must use Proof Key for Code Exchange.\"}" code_verifierパラメータを認識していないように見えます。
int32_t

2024/04/10 04:17

> code_verifierパラメータを認識していないように見えます。 では変数 code_verifier の内容が間違っているのではないでしょうか。 ブラウザの開発者ツールで何が送られているか確認できるので、意図した値になっているか確認してください。
tamina0624

2024/04/10 04:25

はい、値をconsoleに出力して、postmanで同じパラメータで試すとうまくいきます。。。
int32_t

2024/04/10 04:31

JavaScript の方では client_id パラメータを設定していないように見えますが、そこは大丈夫なのでしょうか。
tamina0624

2024/04/10 04:42

はい、postmanを確認したところclient_idがない状態で動いていました。
guest

0

javascriptで正しい結果を得ることができません。

相手サーバがCORSに対応していなければ、ブラウザJavaScriptから結果を取得することはできません。

投稿2024/04/10 02:48

maisumakun

総合スコア146543

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tamina0624

2024/04/10 02:53

cors対応されているようです。
maisumakun

2024/04/10 03:56

それは失礼いたしました。
guest

0

ベストアンサー

調整版

javascript

1const req = new XMLHttpRequest(); 2const data={ 3grant_type:'authorization_code', 4redirect_uri:'sampleURI', 5code:'sampleCode', 6code_verifier:'sampleVerifierテスト', 7}; 8 9const postData=Object.entries(data).map(x=>`${encodeURIComponent(x[0])}=${encodeURIComponent(x[1])}`).join('&'); 10req.open('POST',restAPIURL); 11req.setRequestHeader("Accept","application/json"); 12req.setRequestHeader("cache-control","no-cache"); 13req.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 14req.onload = function() { 15 console.log(JSON.parse(this.response)); 16}; 17req.send(postData);

きょうび、fetchで送るほうが楽だとおもいます。
fetchの場合データはformDataで格納すればエンコードも必要ありません

参考

参考までにUSP版も

javascript

1const req = new XMLHttpRequest(); 2const data={ 3grant_type:'authorization_code', 4redirect_uri:'sampleURI', 5code:'sampleCode', 6code_verifier:'sampleVerifierテスト', 7}; 8const postData = Object.entries(data).reduce((x,y)=>(x.append(y[0],y[1]),x),new URLSearchParams()); 9req.open('POST',restAPIURL); 10req.responseType = 'json'; 11req.setRequestHeader("Accept","application/json"); 12req.setRequestHeader("cache-control","no-cache"); 13req.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 14req.onload = function() { 15 console.log(this.response); 16}; 17console.log(postData); 18req.send(postData);

投稿2024/04/10 02:45

編集2024/04/10 06:10
yambejp

総合スコア117632

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tamina0624

2024/04/10 04:06

ダメでした。以下のエラーが出ます。 {\"error\":\"invalid_client\",\"error_description\":\"Browser requests to the token endpoint must use Proof Key for Code Exchange.\"}" code_verifierパラメータを認識していないように見えます。
yambejp

2024/04/10 06:11

参考までにusp版も追記しています。 サーバー側の解釈の問題もあるので検証環境がない限りコレ以上の補足は難しいですね (私の環境ではただしく動作するので)
tamina0624

2024/06/04 08:01

原因が別問題でしたが、当初知りたかった内容にピンポイントで答えを出していただいたのでベストアンサーとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問