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

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

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

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

4366閲覧

SocialiteによるLINEログイン機能実装の際のエラー

nagashi0831

総合スコア4

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2020/08/24 12:57

【やろうとしていること】LINE認証はSocialiteによってサポートされていないので、LINE用プロバイダと、それを読み込むためのサービスプロバイダを作成してSocialiteによるLINEログインを実現しようとしております。

【参考サイト】https://blog.ef-4.co.jp/laravel%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%ABline%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%82%88%E3%81%86%EF%BC%81/#sec7

【発生しているエラーメッセージ・エラー箇所】Lineログインボタンを押した際にDriver [line] not supported.
というエラーが表示されてしまった。

SocialAccountController

1<? 2 public function redirectToProvider($provider) { 3 //エラー箇所 4 return \Socialite::driver($provider)->redirect(); 5 } 6?>

【関係しているソースコード全体】
・コントローラー

SocialAccountController

1<?php 2 3namespace App\Http\Controllers\Auth; 4 5use App\SocialAccountsService; 6use Illuminate\Http\Request; 7use App\Http\Controllers\Controller; 8use Illuminate\Support\Facades\Auth; 9use Illuminate\Support\Str; 10 11 12class SocialAccountController extends Controller 13{ 14 public function redirectToProvider($provider) { 15 //LineServiceProviderによりdriver(line)を使えるようにする 16 return \Socialite::driver($provider)->redirect(); 17 } 18 19 public function handleProviderCallback(Request $request, SocialAccountsService $accountService, $provider) { 20 //例外(エラー)が起きた場合はログインにリダイレクト 21 try { 22 /*ログインしようとしているアカウントのユーザー情報。find関数では$user->getId()でprovider_idを呼び出す。 23 link関数では$user->getIdでprovider_id属性の値に代入する*/ 24 $user = \Socialite::with($provider)->user(); 25 } catch(\Exception $e) { 26 return redirect('/login'); 27 } 28 29 $authUser = $accountService->find($user, $provider); 30 31 if($authUser) {//連携アカウントが登録済み 32 /*既に存在しているユーザーインスタンスでアプリケーションにログインさせるため、 33 loginメソッドにそのユーザーインスタンス($authUser)を指定し呼び出す*/ 34 Auth::login($authUser, true); 35 return redirect('/'); 36 } else {//まだ登録なし 37 if ($request->user()) { /*既ログインの場合、連携アカウントとして登録し、アカウントに紐付ける 38 $request->user()は認証済みユーザーのインスタンスを返す*/ 39 if ($accountService->link($request->user(), $user, $provider)) { 40 return redirect('/'); 41 } else { /*既に同じサービスでのアカウント登録があり、紐づけ失敗 42 (一つのアカウントで二つのLINEアカウントに登録しようとしている)*/ 43 return redirect('/')->withErrors(['social' => 'LINEでの連携ログインがすでに登録されています']); 44 } 45 } else { //未ログイン 46 redirect('/login'); 47 } 48 49 } 50 } 51} 52

・LINE用プロバイダ

LineProvider

1<?php 2 3namespace Add_on\Socialite\Line; 4 5use Laravel\Socialite\Two\AbstractProvider; 6use Laravel\Socialite\Two\ProviderInterface; 7use Laravel\Socialite\Two\User; 8 9class LineProvider extends AbstractProvider implements ProviderInterface 10{ 11 protected function getAuthUrl($state) 12 { 13 return $this->buildAuthUrlFromBase('https://access.line.me/dialog/oauth/weblogin', $state); 14 } 15 16 protected function getTokenUrl() 17 { 18 return 'https://api.line.me/v2/oauth/accessToken'; 19 } 20 21 public function getAccessTokenResponse($code) 22 { 23 $response = $this->getHttpClient()->post($this->getTokenUrl(), [ 24 'headers' => [ 25 'Content-Type' => 'application/x-www-form-urlencoded', 26 ], 27 'form_params' => [ 28 'grant_type' => 'authorization_code', 29 'code' => $code, 30 'redirect_uri' => $this->redirectUrl, 31 'client_id' => $this->clientId, 32 'client_secret' => $this->clientSecret 33 ], 34 ]); 35 return json_decode($response->getBody(),true); 36 } 37 38 protected function getUserByToken($token) 39 { 40 $response = $this->getHttpClient()->get('https://api.line.me/v2/profile', [ 41 'headers' => [ 42 'Authorization' => 'Bearer ' . $token, 43 ], 44 ]); 45 return json_decode($response->getBody(), true); 46 } 47 48 protected function mapUserToObject(array $user) 49 { 50 return (new User())->setRaw($user)->map([ 51 'id' => $user['userId'], 52 'name' => $user['displayName'], 53 'avatar_original' => $user['pictureUrl'], 54 ]); 55 } 56}

・LineProviderを読み込むためのサービスプロバイダ

LineServiceProvider

1<?php 2 3namespace Add_on\Socialite\Line; 4 5use Laravel\Socialite\SocialiteServiceProvider; 6use Add_on\Socialite\Line\LineProvider; 7 8class LineServiceProvider extends SocialiteServiceProvider 9{ 10 public function boot(){ 11 \Socialite::extend('line', function ($app) { 12 $config = $this->app['config']['services.line']; 13 return \Socialite::buildProvider(LineProvider::class, $config); 14 }); 15 } 16}

・ルーティング

php

1<?php 2//「LINEでログイン」ボタンを押した際のルート 3Route::get('/login/{provider}', 'Auth\SocialAccountController@redirectToProvider'); 4 5Route::get('/login/{provider}/callback', 'Auth\SocialAccountController@handleProviderCallback'); 6

【試したこと・その結果知りたいこと】
app.phpでプロバイダの登録に間違いがないか確認、のちにcomposer updateを実行しました。
私的にはLineServiceProviderが機能していないことが原因だと考えております。
ですが、何が原因でそのようなことになっているのかが分からない状態です。

【補足情報】
Laravelバージョン:5.8
こちらが当プロジェクトのgithubです
https://github.com/nagashi0831/anime_reviews

参考サイトの工程は全て実行しました。

拙い文章で申し訳ありませんが、ご教授いただけましたら幸いです。
また、これでは情報が足りない等ございましたらお伝えいただけるとありがたいです。宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

config/service.phpに必要な情報を記載していない可能性はないでしょうか?

参考サイトの工程は全て実行しました。

…と仰っているので実施したかもしれませんけど。

ちなみにですが、下記サイトにも説明が記載されております。
https://socialiteproviders.com/Line/#installation-basic-usage

投稿2020/08/24 19:39

Suumon

総合スコア211

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

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

nagashi0831

2020/08/25 07:23 編集

ご回答ありがとうございます! config/service.phpには以下の内容を 'line' => [ 'client_id' => env('LINE_CLIENT_ID'), 'client_secret' => env('LINE_CLIENT_SECRET'), 'redirect' => env('LINE_REDIRECT'), ], .envには以下の内容 LINE_CLIENT_ID=該当チャネルのクライアントID LINE_CLIENT_SECRET=該当チャネルのクライアントシークレット LINE_REDIRECT=コールバックURL を記述してあります! そこで貼っていただいたサイトのcomposer require socialiteproviders/line を実行してキャッシュをクリアしたらエラーが改善されました!ありがとうございます! そこで少し質問の趣旨が変わってしまうんですけど、作成したLINE用のプロバイダ、LineServiceProviderがしっかり反映されているかどうかはどのように確認すればよいのでしょうか? どこからか呼び出しているわけでもないLineServiceProviderクラスが使われているのかが気になってしまい...(簡単に言うと参考サイトでなぜLineServiceProviderを作成しなければならないのかがわからなくなってきました)  基本参考サイトを使うときはコードの意味などを調べながら取り組んでいるのですがそこだけがわかりませんでした>< 重ねて無知な質問となってしまい大変申し訳ございません、、
Suumon

2020/08/25 11:15 編集

お、よかったです! > そこで少し質問の趣旨が変わってしまうんですけど、作成したLINE用のプロバイダ、LineServiceProviderがしっかり反映されているかどうかはどのように確認すればよいのでしょうか? うまく動作していなければ、エラーが表示されると思うのでそれで判断するとかでしょうか。。 少しサイト探しましたが、下記サイトは分かりやすかったので参考になるかもです。 https://reffect.co.jp/laravel/laravel-service-provider-understand https://qiita.com/kd9951/items/951ab700f28d1d49c9c9 これでも納得できなければ、新に質問を投稿して、 他の人たちに聞いてみるのもいいかもしれませんね。
nagashi0831

2020/08/27 10:19

返信が遅くなってしまい申し訳ございません>< 貼っていただいたサイト拝見いたしました! 大変分かりやすかったです!サービスプロバイダーについてようやくしっくりきました笑 終始丁寧に答えていただき大変助かりました!!ありがとうごいます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問