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

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

ただいまの
回答率

88.59%

LINEログイン機能実装(アクセストークン取得)の際に起きたUndefined property: stdClass::$access_tokenエラーの解決

解決済

回答 1

投稿 編集

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

nagashi0831

score 4

前提・実現したいこと

PHP(laravel)のwebサイトでLINEログイン機能を実装中(アクセストークンを取得する際)に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Undefined property: stdClass::$access_token

該当のソースコード

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Str;


class LineLoginController extends Controller
{   //LINEログインに必要なパラメータを設定して、LINEの認証URLにリダイレクトさせる
    public function lineLogin(){
        //state生成
        $state = Str::random(40);
        \Cookie::queue('state', $state,100);

        //nonece生成
        $nonce = Str::random(40);
        \Cookie::queue('nonce',$nonce,100);

        // LINE認証
        $uri ="https://access.line.me/oauth2/v2.1/authorize?";
        $response_type = "response_type=code";
        $client_id = "&client_id=1654734147";
        $redirect_uri = "&redirect_uri=https://reviewanime.work/callback";
        $state_uri = "&state=".$state;
        $scope = "&scope=openid%20profile";
        $prompt = "&prompt=consent";
        $nonce_uri = "&nonce="$nonce;

        $uri = $uri.$response_type.$client_id.$redirect_uri.$state_uri.$scope.$prompt.$nonce_uri;

        return redirect($uri);
    }

    public function getAccessToken($req){
        //アクセストークンの発行
        $headers = [ 'Content-Type: application/x-www-form-urlencoded'];
        $post_data = array(
            'grant_type' => 'authorization_code',
            'code' => $req['code'],
            'redirect_uri' => 'https://reviewanime.work/callback',
            'client_id' => '1654734147',
            'client_secret' => 'c9ecd5fe9b9f3baa407e46697495c3c5'
            );
            ///oauth/tokenルートは、access_token、refresh_token、expires_in属性を含むJSONレスポンスを返す。
            $url = 'https://api.line.me/oauth2/v2.1/token';

            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url); //取得するURLを指定
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); //
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //サーバー証明書の検証を行わない
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  //実行結果を文字列で返す
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);  //設定するHTTPヘッダフィールドの配列
            curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post_data)); //HTTP"POST"で設定する全てのデータ

            $res = curl_exec($curl);

            curl_close($curl);
            //APIで取得したデータはJSON形式のため、json_decode()関数を利用してJSON文字列を配列に変換
            $json = json_decode($res);
            //下記がエラーの原因です
            $accessToken = $json->access_token;

            return $accessToken;
    }

    public function getProfile($at){

        $curl = curl_init();

        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $at));
        curl_setopt($curl, CURLOPT_URL, 'https://api.line.me/v2/profile');
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

        $res = curl_exec($curl);
        url_close($curl);

        $json = json_decode($res);
        return $json;

    }

    public function callback(Request $request){

        //LINEからアクセストークンを取得
        $accessToken = $this->getAccessToken($request);
        //プロフィール取得
        $profile = $this->getProfile($accessToken);

        return view('home', compact('profile'));
    }
}

試したこと

getAccessToken関数の
$json = json_decode($res);

$accessToken = $json->access_token;
の部分を
$json = json_decode($res, true);

$accessToken = $json['access_token'];
としたらUndefined index: access_tokenというエラーが出力されたことから

access_tokenプロパティが未定義=>access_tokenプロパティに値が代入されていないことが原因=>access_tokenがレスポンスされていない というところまでは分かりました。

コードを見返して色々調べてみてもaccess_tokenがレスポンスされていない原因がわかりませんでした。

補足情報(FW/ツールのバージョンなど)

PHPバージョン:PHP 7.2.27
コードを書く上での参考サイト:https://developers.line.biz/ja/docs/line-login/integrate-line-login/ 
拙い文章で申し訳ありません。「これだけでは情報が足りない」等ございましたらお伝えいただけたら幸いです。宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • happyteethago

    2020/08/20 22:46

    $json = json_decode($res, true);
    var_dump($json);
    で何が表示されますか?

    キャンセル

  • nagashi0831

    2020/08/21 02:23

    ご回答ありがとうございます!
    先日var_dump($json);を試してみた結果invalid_grant error_descriptionと出てきました。Windowsを閉じて、その後もう一度var_dump($res)で出力してみたらちゃんとaccess_token等の正常なレスポンスが返ってきていました、、
    結局原因はよくわからなかったのですが、一応解決はしました(汗)

    キャンセル

回答 1

check解決した方法

0

var_dump($json);を試してみた結果invalid_grant error_descriptionと出てきました。Windowsを閉じて、その後もう一度var_dump($res)で出力してみたらちゃんとaccess_token等の正常なレスポンスが返ってきていました、、
結局原因はよくわからなかったのですが、一応解決はしました

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/08/21 08:41

    環境の問題のようですね。
    dockerをつかうか、Cloud9をつかうか、MACにPCを変更したほうがいいかもですね。
    本格的にやるなら、必要だと思います。

    キャンセル

  • 2020/08/22 21:25

    やはりOSの問題もあるのですかね、、了解いたしました!
    丁寧なご回答ありがとうございます泣

    キャンセル

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

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

関連した質問

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

  • トップ
  • PHPに関する質問
  • LINEログイン機能実装(アクセストークン取得)の際に起きたUndefined property: stdClass::$access_tokenエラーの解決