【やろうとしていること】LINE認証はSocialiteによってサポートされていないので、LINE用プロバイダと、それを読み込むためのサービスプロバイダを作成してSocialiteによるLINEログインを実現しようとしております。
【発生しているエラーメッセージ・エラー箇所】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
参考サイトの工程は全て実行しました。
拙い文章で申し訳ありませんが、ご教授いただけましたら幸いです。
また、これでは情報が足りない等ございましたらお伝えいただけるとありがたいです。宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/25 07:23 編集
2020/08/25 11:15 編集
2020/08/27 10:19