🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

2111閲覧

ヘッダー情報を持たせたPHPのcurlが上手く動きません。

justicebot

総合スコア15

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/02/19 01:38

編集2021/02/19 03:39

前提・実現したいこと

PHPで、curlを利用して自身のAPIに問い合わせをし、ユーザー情報を取得したいです。
APIの処理中で、$_SESSIONによる認証をもたせています。
ちなみに、現在試しているページはログイン直後のページです。

発生している問題

ブラウザが真っ白な読み込み状態になり、ずっと終わりません。
5分ほど待機してみても読み込み状態が続きました。
クライアント側のネットワークシグナルもなく、サーバー上で何かが行われたままビジーになっているような感じです。

該当のソースコード

php

1foreach ($_COOKIE as $key => $val) { 2 $cookie[] = $key.'='.$val.';'; 3} 4 5echo $cookie[0]; //確認用 6 7$curl = curl_init(); 8 9curl_setopt_array($curl, array( 10 CURLOPT_URL => 'https://XXXXX/api/users', 11 CURLOPT_HTTPHEADER => array( 12 'Cookie: ' . $cookie[0] //テスト段階では確実に1つなので、[0]としています。 13 ) 14)); 15 16$response = curl_exec($curl); 17 18curl_close($curl); 19echo $response;

試したこと

CURLOPT_HTTPHEADERの部分について、

下記のように直書きで、他ユーザーのPHPSESSIDを入れてみたところ、PHPでも正しくレスポンスを受け取れ、読み込みがずっと続くことなく、正常にデータが表示されました。

php

1 CURLOPT_HTTPHEADER => array( 2   'Cookie: PHPSESSID=XXXXXXXXXXXXXXXXXXXXXXXXXX' 3 ),

自身のPHPSESSIDが入った時に、異常が現れるように思います。

一度ログインしてから開発ツールでPHPSESSIDを確認し、そのPHPSESSIDを上記コードのように直書きで書いたものに更新してみて、ページをリロードしてみました。
結果、やはりブラウザが真っ白な読み込み状態になり、ずっと終わりませんでした。
直書きで、わざとPHPSESSIDを間違った値にしてみると、ちゃんとエラーレスポンスが返ってきました。
PHPSESSIDが正しい場合に、異常が発生するようです。

ちなみにpostmanでヘッダー情報を持たせて試したところ、正常にレスポンスを受け取れました。

なにかお分かりになることがありましたら、ご教示いただければと思います。

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

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

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

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

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

justicebot

2021/02/19 03:49

挙動を確認したところ、恐らくですがcurl自体に問題はなく、その後の認証に問題がある可能性もあることに気づきました。 このサイトではSAML認証を利用しています。 API処理の過程で、SAML認証のSessionが失われ、再度ログインすることができず画面が真っ白になったかもしれません。 今回の質問の範囲だけでは収まっていない範囲で問題が起きている可能性があるので、クローズする予定です。
guest

回答2

0

PHP

1'Cookie: ' + $cookie[0] //テスト段階では確実に1つなので、[0]としています。

PHP

1'Cookie: '.$cookie[0] //テスト段階では確実に1つなので、[0]としています。

で動きそうな気がします。
API側で、受信しているHTTPリクエストヘッダを確認しながら検証するのが確実ですね。

投稿2021/02/19 03:15

編集2021/02/19 03:18
tanat

総合スコア18727

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

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

justicebot

2021/02/19 03:42 編集

ご指摘ありがとうございます。 こちらは、単なる記載ミスでございました。 実際には、ご指摘いただいた通りの記述でございます。 書き直させていただきました。 ご助言いただきありがとうございます!検証・確認してみようと思います。
tanat

2021/02/19 03:45

ありゃ、そうですか。 API側で情報を確認しつつ、(これもAPI側で)セッションIDを直書きしてみてデバッグしてみて切り分けると良いかと思います。
guest

0

今回の質問の範囲だけでは収まっていない範囲で問題が起きている可能性があるので、クローズいたします。

投稿2021/02/19 06:05

justicebot

総合スコア15

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

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

tanat

2021/02/19 06:18

後からこの質問を見た人に対して一切情報を持たないので回答になっているので、 解決してからその方法を書くか、 せめて - どういった方法で検証を行い - なぜ「今回の質問の範囲だけでは収まっていない範囲で問題が起きている可能性がある」と判断したのか くらいは追記して頂きたいところです。
justicebot

2021/02/19 10:21

失礼しました。 トピックのルールを理解していませんでした。 再びオープンにいたしました。 curlの飛び先であるAPIは、phpなのですが その中にあるsession_start();を消すと、うまくいくことがわかりました。 ただ、APIの中で$_SESSIONの値を認証に使いたいので、session_start();がなぜ使えないのか検証しています。 そもそもAPIの中で$_SESSIONを使うということが間違っているような気もしております。
tanat

2021/02/19 11:35

SAML認証だと、認証の仕組み的にPHPからAPIを単純に叩く形だと動かないと思います。 JavaScriptでブラウザからアクセスさせるか、PHPからであればAPIにはインターネットからはアクセス出来ないようにした上で、サーバ間は独自の認証で任意ユーザー情報を参照できるようにする等のアーキテクチャの再考が必要かと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問