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

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

ただいまの
回答率

90.61%

  • PHP

    19906questions

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

  • API

    1487questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • cURL

    146questions

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

LINE Login v2.1にてソーシャルログインを実装したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 343

kans00229

score 17

PHPバージョン5.6 
フレームワーク等は使用しておりません。

LINE Login v2.1にてソーシャルログインを実装したいと考えております。
下記のlogin.phpからLINEにログインして、LINE側から認可コードを取得
するところまではできるのですが、callback.phpにてアクセストークンを取得
しようとしたところ、下記のエラーが出てしまいます。

エラー部分
Warning: file_get_contents(https://api.line.me/oauth2/v2.1/token): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in

同様にcurlを使用した別バージョンも試してみたのですが、こちらでもエラーが出てしまいます。
そのエラーは
Notice: Undefined property: stdClass::$access_token in 

とにかく原因がわからずに困っております。

お力をお貸し頂けないでしょうか。
宜しくお願い致します。

参考サイト
・https://github.com/line/line-login-guide-faq

//ログイン部分 login.php
define('LINE_CLIENT_ID', '*******');
define('Redirect_URL', 'https://samle.com/callback.php');
define('State', '123abc');
$url = 'https://access.line.me/oauth2/v2.1/authorize?scope=openid%20profile&response_type=code&client_id=' . getenv('LINE_CLIENT_ID') . '&redirect_uri=' . getenv(Redirect_URL). '&state=' . getenv(State);
echo '<a href=' . $url . '><button class="btn">Login using OpenID Connect</button></a>' . PHP_EOL;
//callback.php

define("LINE_CLIENT_ID", "************");
define("LINE_CLIENT_SECRET", "*************");
define('Redirect_URL', 'https://samle.com/callback.php');

 $url = 'https://api.line.me/oauth2/v2.1/token';
  $data = array(
    'grant_type' => 'authorization_code',
    'client_id' => getenv('LINE_CLIENT_ID'),
    'client_secret' => getenv('LINE_CLIENT_SECRET'),
    'code' => $_GET['code'],
    'redirect_uri' => Redirect_URL
  );
$data = http_build_query($data, '', '&');
  $header = array(
    'Content-Type: application/x-www-form-urlencoded',
  );
  $context = array(
    'http' => array(
      'method'  => 'POST',
      'header'  => implode('\r\n', $header),
    'content' => $data,
    )
  );
  $resultString = file_get_contents($url, false, stream_context_create($context));
  $result = json_decode($resultString, true);
//callback.php
curlを使用したもの
$postData = array(
  'grant_type'    => 'authorization_code',
  'code'          => $_GET['code'],
  'redirect_uri'  => 'https://samle.com/callback.php',
  'client_id'     => '********',
  'client_secret' => '********'
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
curl_setopt($ch, CURLOPT_URL, 'https://api.line.me/oauth2/v2.1/token');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
curl_close($ch);

$json = json_decode($response);
$accessToken = $json->access_token;
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2018/04/18 13:11

    どのファイルのどの行でエラーが出ているのでしょうか?

    キャンセル

  • kans00229

    2018/04/18 14:04

    CHERRY様 ご回答有難うございます。エラーがでるのは「callback.php」です。行としては、$resultString = file_get_contents($url, false, stream_context_create($context));のところです。curlを含む方は、$accessToken = $json->access_token;でエラーが出ているようです。

    キャンセル

回答 1

checkベストアンサー

+1

■file_get_contentsのエラー
Bad Request なので、そのURLに対して、file_get_contentsをすることが許容されていないのかと思います。

「https」に対しての場合、curlが使えるなら、そちらを使う方が良いです。

■curlのエラー

「access_token という名前で参照できるところはないよ」というエラーですね。

まずは、念のため

$response = curl_exec($ch);


これが本当に成功しているのかを確認しましょう。(確認方法は調べればいくらでも出てくるので割愛)
失敗しているならば、エラーの内容を確認し、それを解消しなければいけません。

curl_execが成功している場合は、

$json = json_decode($response);


の、$jsonを、dump等で中の構造を実際に確認することをお勧めします。

きっと想定されている構造と、実際が異なっているのだと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/19 11:34

    mix-peach様 回答有難うございます。確認してみたところ、リロード処理をした時にエラーが出ておりました。$jsonの結果をSESSION等に入れて、セットされている時は、処理をしない等の条件を追記することで解消致しました。有難うございました。

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る

  • PHP

    19906questions

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

  • API

    1487questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • cURL

    146questions

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