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

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

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

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

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Q&A

1回答

1971閲覧

LaravelでTwitterログインを実装しようとしたらCall to undefined method と出る。

Tikka123456

総合スコア34

Laravel

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

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

0グッド

0クリップ

投稿2020/08/12 09:05

編集2020/08/12 09:22

元々Goolgeのログイン認証はすでに実装済みで、追加でTwitterログインをSocialiteで作ろうと思いましたが以下のエラーが出てしまいました。
こちらを参考に試行錯誤しましたが、どうも今のコードをどのように書き換えれば実装できるのか分かりませんでした。
どうかよろしくお願いします。

Call to undefined method Laravel\Socialite\One\TwitterProvider::userFromToken()

該当のエラーコード
TwitterProvider.php

php

1 <?php 2 3namespace Laravel\Socialite\One; 4 5use InvalidArgumentException; 6 7class TwitterProvider extends AbstractProvider 8{ 9 /** 10 * {@inheritdoc} 11 */ 12 public function user() 13 { 14 if (! $this->hasNecessaryVerifier()) { 15 throw new InvalidArgumentException('Invalid request. Missing OAuth verifier.'); 16 } 17 18 $user = $this->server->getUserDetails($token = $this->getToken(), $this->shouldBypassCache($token->getIdentifier(), $token->getSecret())); 19 20 $extraDetails = [ 21 'location' => $user->location, 22 'description' => $user->description, 23 ]; 24 25 $instance = (new User)->setRaw(array_merge($user->extra, $user->urls, $extraDetails)) 26 ->setToken($token->getIdentifier(), $token->getSecret()); 27 28 return $instance->map([ 29 'id' => $user->uid, 30 'nickname' => $user->nickname, 31 'name' => $user->name, 32 'email' => $user->email, 33 'avatar' => $user->imageUrl, 34 'avatar_original' => str_replace('_normal', '', $user->imageUrl), 35 ]); 36 } 37}

LoginController.php

php

1<?php 2 3namespace App\Http\Controllers\Auth; 4 5use App\Http\Controllers\Controller; 6use App\User; 7use App\Providers\RouteServiceProvider; 8use Illuminate\Foundation\Auth\AuthenticatesUsers; 9use Illuminate\Http\Request; 10use Laravel\Socialite\Facades\Socialite; 11 12 13class LoginController extends Controller 14{ 15public function redirectToProvider(string $provider) 16 { 17 return Socialite::driver($provider)->redirect(); 18 } 19 20 public function handleProviderCallback(Request $request, string $provider) 21 { 22 $providerUser = Socialite::driver($provider)->user(); 23 24 $user = User::where('email', $providerUser->getEmail())->first(); 25 26 if ($user) { 27 $this->guard()->login($user, true); 28 return $this->sendLoginResponse($request); 29 } 30 31 return redirect()->route('register.{provider}', [ 32 'provider' => $provider, 33 'email' => $providerUser->getEmail(), 34 'token' => $providerUser->token, 35 ]); 36 } 37}

ルーティング

php

1Route::prefix('login')->name('login.')->group(function () { 2 Route::get('/{provider}', 'Auth\LoginController@redirectToProvider')->name('{provider}'); 3 Route::get('/{provider}/callback', 'Auth\LoginController@handleProviderCallback')->name('{provider}.callback'); 4});

Services.php

'google' => [ 'client_id' => env('GOOGLE_CLIENT_ID'), 'client_secret' => env('GOOGLE_CLIENT_SECRET'), 'redirect' => env('APP_URL') . '/login/google/callback', ], 'twitter' => [ 'client_id' => env('TWITTER_CLIENT_ID'), 'client_secret' => env('TWITTER_CLIENT_SECRET'), 'redirect' => env('APP_URL') . '/login/twitter/callback', ],

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

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

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

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

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

guest

回答1

0

userFromToken()はTwoにしかないので
おそらくhandleProviderCallback()の$providerUser = Socialite::driver($provider)->user();でエラー。
$providerが間違ってそう→Twitter側でのURL設定が違うのでは。

他。
nameでname('{provider}')とはできないはず。
name('redirect')として
route('login.redirect', ['provider' => 'twitter'])使うときにパラメーターで指定。

そもそもメールで判定してるのも違う気がする…。
GoogleとTwitterで同じメール使ってるとは限らない。
逆に会社でメールを共有してるけどGoogle/Twitterは別で運用してる可能性もある。
それ以前にTwitterではデフォルトではメール取得できない。
(Twitterアカウントでのメールアドレスは非公開情報なので安易に取得してはいけない)

複数でのログインは色々考慮することが多い。

投稿2020/08/12 11:15

kawax

総合スコア10377

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

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

Tikka123456

2020/08/12 12:04

回答ありがとうございます。GoogleとTwitter別々でルーティングして、コントローラーも別々に書いた方がいいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問