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

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

ただいまの
回答率

89.99%

cURLのSet-Cookieの値を抜き出したい

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 945

melmelme

score 22

ログインのセッション管理用のAPIをPHPのcURLでコントロールしたいのですが、正しい方法が知りたく、、ご教示いただけましたら幸いです。

【行いたい事】
(1)phpのcURLでログイン認証APIを叩いてレスポンスからトークンだけを抜き出したい

現状
#HttpOnly_exampledomain.com    FALSE    /    FALSE    0    PLAY_SESSION    pTGfeu6J52h9d0zjOBRNwBCQ0CZZShcGYUGVjHOXvguZt0OSOyBbIm2AmHlyTUP1IrqoIYsbWJlUpK7zjjFQjXpo5vMjQ75jQb6Qh7hevBhwydvOIjEkS53o66SSm8L3kI2bZIaX02i9VyV5Fv21B5ZbpX4UjDN

↓
やりたい事(トークン部分だけ抜き出す)
pTGfeu6J52h9d0zjOBRNwBCQ0CZZShcGYUGVjHOXvguZt0OSOyBbIm2AmHlyTUP1IrqoIYsbWJlUpK7zjjFQjXpo5vMjQ75jQb6Qh7hevBhwydvOIjEkS53o66SSm8L3kI2bZIaX02i9VyV5Fv21B5ZbpX4UjDN

【cURLの記述】

$jsondata = [
    "id" => "userid",
    "password" => "examplepass"
];

$baseurl = "https:/xxxxxxxxxxx/login/";
$header = [
    'Content-Type: application/json',
];

$cookie=tempnam(sys_get_temp_dir(),'cookie_');
$curl = curl_init(); //1.初期化
curl_setopt($curl, CURLOPT_URL, $baseurl); //2.URLをセット
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); //3.HTTP リクエストをセット(GET,POST等)
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //文字列で返す
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($jsondata)); // jsonデータを送信
curl_setopt($curl, CURLOPT_HTTPHEADER, $header); // リクエストにヘッダーを含める
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_HEADER, true);

$response = curl_exec($curl);
$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$cookie_info = curl_getinfo($curl, CURLINFO_COOKIELIST );
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
$result = json_decode($body, true) ;

curl_close($curl); // 6.終了
var_dump($cookie_info);

//var_dump($cookie_info); の結果↓
array(1) {
  [0]=>
  string(213) "#HttpOnly_exampledomain.com    FALSE    /    FALSE    0    PLAY_SESSION    pTGfeu6J52h9d0zjOBRNwBCQ0CZZShcGYUGVjHOXvguZt0OSOyBbIm2AmHlyTUP1IrqoIYsbWJlUpK7zjjFQjXpo5vMjQ75jQb6Qh7hevBhwydvOIjEkS53o66SSm8L3kI2bZIaX02i9VyV5Fv21B5ZbpX4UjDN"
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

興味があって調べてみましたが、これといったベストな方法はなく、自前で解析をする、のが普通のようです。

例えばSymfonyの内部コードを読んでみると、

Set-Cookie: TOKEN=63908f8ecd950e47f1ac1b5f3937d52dc21626fb892672372cc3031348268aee; path=/

のような生のヘッダー情報から、 ;= で文字列を分割するようになっていますし、 CURLINFO_COOKIELIST を指定して取得した今回のデータはタブ区切りであることは保証されていて、かつフィールドの数も決まっているので、タブでexplodeして、

$val = explode("\t", $cookie_info[0]);
// $val[6] にほしい値がある

とするしかないかもしれないですね。

フィールドの数、タブ区切りなどの仕様は
https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html
こちらを参考にしています。

http_parse_cookie という関数が拡張であった ようですけどね...

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる