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

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

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

Angularは、JavaScriptフレームワークです。AngularJSの後継であり、TypeScriptベースで実装されています。機能ごとに実装を分けやすく、コードの見通しが良いコンポーネント指向です。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

3245閲覧

scriptからのPOSTがCORSにひっかかる。HTMLのfromからのPOSTはできるのに...

Kunoki

総合スコア11

Angular

Angularは、JavaScriptフレームワークです。AngularJSの後継であり、TypeScriptベースで実装されています。機能ごとに実装を分けやすく、コードの見通しが良いコンポーネント指向です。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/10/12 00:45

現在Angualrのアプリケーションを作っています。その中で、GithubのOAuth認証を行う動作があり、POSTを行う箇所があります。
参考にしているページ:
https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/

取り合えずPOST動作をHTMLのformで実装しました。

HTML

1<form action="{{this.apiService.OAuthURL2}}" method="post"> 2 <div> 3 <label for="client_id">client_id</label> 4 <input name="client_id" id="client_id" value="{{this.apiService.clientId}}"> 5 </div> 6 <div> 7 <label for="client_secret">client_secret</label> 8 <input name="client_secret" id="client_secret" value="{{this.apiService.clientSecret}}"> 9 </div> 10 <div> 11 <label for="code">code</label> 12 <input name="code" id="code" value="{{this.apiService.redirect_code}}"> 13 </div> 14 <div> 15 <label for="redirect_url">redirect_url</label> 16 <input name="redirect_url" id="redirect_url" value="{{this.apiService.redirectUrl}}"> 17 </div> 18 <div> 19 <label for="state">state</label> 20 <input name="state" id="state" value="{{this.apiService.state}}"> 21 </div> 22 <div> 23 <button>アクセストークンを取得</button> 24 </div> 25</form>

この場合、ボタンを押すと、access_tokenというファイルのダウンロードが始まり、その中にアクセストークンがありました。
HTMLのformでアクセストークンの取得に成功したため、scriptのほうで取得する処理を実装しました。

Angular

1 OAuth2() { 2 var httpObj = this.http.post( 3 this.OAuthURL2, 4 new HttpParams() 5 .set('client_id', this.clientId) 6 .set('client_secret', this.clientSecret) 7 .set('code', this.redirect_code)// default is empty 8 .set('redirect_url', "http://localhost:4200") 9 .set('state', this.state), // default is true 10 { 11 headers: new HttpHeaders({ 12 'Content-Type': 'application/x-www-form-urlencoded' 13 }) 14 } 15 ); 16 httpObj.subscribe(this.OAuth2Next, this.RequestError); 17 }

ことのきブラウザ側のエラーでは、下記のように表示されてしまいます。

Failed to load https://github.com/login/oauth/access_token: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access.

HTMLのformもクライアントで、scriptも結局はクライアントからのhttp requestなので変わらないと思うのですが、scriptのほうで実装する場合はエラーになってしまいます。

http requestの中身をchromeのデバッガーから参照して違いを探したところ違ったのは、
HTMLのほうのRequest Headerに、Chahe-Control, Connection, Content-Length, Cookie,Host, Uqgrade-Insecure-Requests があることぐらいでした。

なぜscriptのほうだけ、
"No 'Access-Control-Allow-Origin' header is present on the requested resource."
とでてきてPOSTできないのでしょうか

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

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

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

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

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

guest

回答3

0

ベストアンサー

HTMLからはどこのURLにでもリンク(href=とか、src=とか、action=とか)できます。
なぜならそれがWWWだから。

CORSについてはご存じのようなので、何故Javascriptで出来ないかは略。

投稿2018/10/12 03:42

otn

総合スコア84555

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

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

Kunoki

2018/10/12 13:51

ご回答いただいてありがとうございます。 下記のサイトでおっしゃっている内容の説明を読んで理解しました。 https://qiita.com/nanocloudx/items/f49600b705be9d53a9b5 そうですよね、HTMLのscriptタグ(jqueryのリンクとか)がCORSに引っかかってないですもんね。 ありがとうございます
guest

0

こんにちは。
恐らくですが、サーバ側のアクセス許可ができていないことが原因ではないでしょうか。自分ではNodejs(Express)しかコンフィグレーションしたことがないので、他サーバの例をお答えできないのですが、ご利用のサーバのCORS許可方法を調べられてはどうでしょうか。

投稿2018/10/12 01:49

BlueMoon

総合スコア1339

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

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

Kunoki

2018/10/12 13:52

ご回答ありがとうございます。 サーバー側はgithubで信用できるサーバーなので、クライアント側も問題だとおもっています
guest

0

コード等詳しく見てないのでハズレかもしれませんが、条件の違いで、一方はシンプルなリクエストで良いが、上手くいかない方はプリフライトリクエストが必要ということはないですか?

ハズレだったらすみません。

でも、何にせよ、Fiddler などのキャプチャツールを使って要求・応答ヘッダをキャプチャし、うまくいく場合 / いかない場合の違いを調べてみないことには話が始まらないと思います。

是非 Fiddler を入手してやってみてください。

シンプルなリクエスト/プリフライトリクエストが何か、Fiddler で何を見ることができるのかは、以下の記事が参考になると思います。

クロスドメインの WCF サービス
http://surferonwww.info/BlogEngine/post/2016/12/27/wcf-service-in-cross-domain.aspx

投稿2018/10/12 01:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Kunoki

2018/10/12 01:09

ご回答ありがとうございます。 Fiddlerを使ってもうちょっと調べてみようと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問